From 79484a9e5bf7893ab6aec5b3ced4abc246d27120 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 18:14:49 +0200 Subject: [PATCH 001/346] =?UTF-8?q?=F0=9F=8E=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/aitube-clap/.gitignore | 177 ++++++++++ packages/aitube-clap/.npmignore | 4 + packages/aitube-clap/.prettierrc.json | 9 + packages/aitube-clap/LICENSE.md | 21 ++ packages/aitube-clap/README.md | 60 ++++ packages/aitube-clap/bun.lockb | Bin 0 -> 17257 bytes packages/aitube-clap/package.json | 43 +++ .../src/converters/blobToDataUri.ts | 21 ++ .../src/converters/clapToDataUri.ts | 10 + .../src/converters/dataUriToBlob.ts | 22 ++ packages/aitube-clap/src/converters/index.ts | 3 + packages/aitube-clap/src/factories/index.ts | 3 + packages/aitube-clap/src/factories/newClap.ts | 37 ++ .../aitube-clap/src/factories/newModel.ts | 38 ++ .../aitube-clap/src/factories/newSegment.ts | 46 +++ packages/aitube-clap/src/helpers/README.md | 1 + .../helpers/generateClapFromSimpleStory.ts | 121 +++++++ .../aitube-clap/src/helpers/getEmptyClap.ts | 18 + packages/aitube-clap/src/helpers/index.ts | 2 + packages/aitube-clap/src/index.ts | 26 ++ packages/aitube-clap/src/io/index.ts | 2 + packages/aitube-clap/src/io/parseClap.ts | 327 ++++++++++++++++++ packages/aitube-clap/src/io/serializeClap.ts | 177 ++++++++++ packages/aitube-clap/src/samples/stories.ts | 28 ++ packages/aitube-clap/src/types.ts | 212 ++++++++++++ .../aitube-clap/src/utils/generateSeed.ts | 3 + .../src/utils/getClapAssetSourceType.ts | 25 ++ .../aitube-clap/src/utils/getValidNumber.ts | 10 + packages/aitube-clap/src/utils/index.ts | 4 + .../aitube-clap/src/utils/isValidNumber.ts | 3 + packages/aitube-clap/tsconfig.json | 31 ++ packages/aitube-clap/tsconfig.types.json | 13 + 32 files changed, 1497 insertions(+) create mode 100644 packages/aitube-clap/.gitignore create mode 100644 packages/aitube-clap/.npmignore create mode 100644 packages/aitube-clap/.prettierrc.json create mode 100644 packages/aitube-clap/LICENSE.md create mode 100644 packages/aitube-clap/README.md create mode 100755 packages/aitube-clap/bun.lockb create mode 100644 packages/aitube-clap/package.json create mode 100644 packages/aitube-clap/src/converters/blobToDataUri.ts create mode 100644 packages/aitube-clap/src/converters/clapToDataUri.ts create mode 100644 packages/aitube-clap/src/converters/dataUriToBlob.ts create mode 100644 packages/aitube-clap/src/converters/index.ts create mode 100644 packages/aitube-clap/src/factories/index.ts create mode 100644 packages/aitube-clap/src/factories/newClap.ts create mode 100644 packages/aitube-clap/src/factories/newModel.ts create mode 100644 packages/aitube-clap/src/factories/newSegment.ts create mode 100644 packages/aitube-clap/src/helpers/README.md create mode 100644 packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts create mode 100644 packages/aitube-clap/src/helpers/getEmptyClap.ts create mode 100644 packages/aitube-clap/src/helpers/index.ts create mode 100644 packages/aitube-clap/src/index.ts create mode 100644 packages/aitube-clap/src/io/index.ts create mode 100644 packages/aitube-clap/src/io/parseClap.ts create mode 100644 packages/aitube-clap/src/io/serializeClap.ts create mode 100644 packages/aitube-clap/src/samples/stories.ts create mode 100644 packages/aitube-clap/src/types.ts create mode 100644 packages/aitube-clap/src/utils/generateSeed.ts create mode 100644 packages/aitube-clap/src/utils/getClapAssetSourceType.ts create mode 100644 packages/aitube-clap/src/utils/getValidNumber.ts create mode 100644 packages/aitube-clap/src/utils/index.ts create mode 100644 packages/aitube-clap/src/utils/isValidNumber.ts create mode 100644 packages/aitube-clap/tsconfig.json create mode 100644 packages/aitube-clap/tsconfig.types.json diff --git a/packages/aitube-clap/.gitignore b/packages/aitube-clap/.gitignore new file mode 100644 index 00000000..ea8fe6a7 --- /dev/null +++ b/packages/aitube-clap/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo \ No newline at end of file diff --git a/packages/aitube-clap/.npmignore b/packages/aitube-clap/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-clap/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-clap/.prettierrc.json b/packages/aitube-clap/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-clap/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-clap/LICENSE.md b/packages/aitube-clap/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-clap/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md new file mode 100644 index 00000000..d81697aa --- /dev/null +++ b/packages/aitube-clap/README.md @@ -0,0 +1,60 @@ +# @aitube/clap + +*Types and helpers to manipulate .clap files* + +## Introduction + +This library is used to manipulate Clap files, the file format +used by AiTube, a modern platform for AI cinema and AI gaming. + +It is designed to support short-to-long 2D, 3D and 4D experiences, +such as conventional films or more modern forms of art such as gaussian splatting movies with a soundtrack. + +## Installation + +To install the package, run the following command: + +```bash +npm install @aitube/clap +``` + +## Getting Started + +```typescript +import { parseClap, serializeClap } from '@aitube/clap'; + +// fetch a Clap file +const res = await fetch("< some .clap file hosted from somewhere >") +const file = await res.blob() + +// open the Clap file +const clap: ClapProject = await parseClap(file) + +// perform arbitrary changes in the project +clap.segments.at(42).prompt = "a camel in the desert, medium-shot, award-winning, 4k, Canon EOS" + +clap.segments.at(64).assetUrl = await generateVideoWithAI(....) + +// save the Clap file +const newFile = await serializeClap(clap) +``` + +## Build Instructions + +Install [Bun](https://bun.sh/) + +Run the following commands: + +```bash +bun install + +bun run build +``` + +## Contributing + +We welcome contributions! Please feel free to submit a pull request. + +## License + +This package is under the MIT License. See `LICENSE` file for more details. diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..07f5736af420e25e68c42c6429bf3c641f3af9dd GIT binary patch literal 17257 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 literal 0 HcmV?d00001 diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json new file mode 100644 index 00000000..3f8e5a69 --- /dev/null +++ b/packages/aitube-clap/package.json @@ -0,0 +1,43 @@ +{ + "name": "@aitube/clap", + "module": "index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "version": "0.0.0", + "description": "Types and helpers to manipulate .clap files", + "scripts": { + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", + "postbuild": "rimraf tsconfig.types.tsbuildinfo" + }, + "devDependencies": { + "@types/uuid": "^9.0.8", + "bun-types": "latest", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "typescript": "^5.4.5" + }, + "peerDependencies": { + "typescript": "^5.4.5" + }, + "dependencies": { + "uuid": "^9.0.1", + "yaml": "^2.4.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/jbilcke-hf/aitube-clap.git" + }, + "keywords": [ + "AI cinema", + "file format", + "specification" + ], + "author": "Julian Bilcke", + "license": "MIT", + "files": [ + "dist/*.js", + "dist/*.d.ts" + ] +} diff --git a/packages/aitube-clap/src/converters/blobToDataUri.ts b/packages/aitube-clap/src/converters/blobToDataUri.ts new file mode 100644 index 00000000..42d219bb --- /dev/null +++ b/packages/aitube-clap/src/converters/blobToDataUri.ts @@ -0,0 +1,21 @@ +export async function blobToDataUri(blob: Blob, defaultContentType = ""): Promise { + if (typeof window === "undefined") { + const arrayBuffer = await blob.arrayBuffer() + let buffer = Buffer.from(arrayBuffer) + return "data:" + (defaultContentType || blob.type) + ';base64,' + buffer.toString('base64'); + } else { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = _e => { + let dataUri = `${reader.result as string || ""}` + if (defaultContentType) { + dataUri = dataUri.replace("application/octet-stream", defaultContentType) + } + resolve(dataUri) + } + reader.onerror = _e => reject(reader.error) + reader.onabort = _e => reject(new Error("Read aborted")) + reader.readAsDataURL(blob) + }); + } +} \ No newline at end of file diff --git a/packages/aitube-clap/src/converters/clapToDataUri.ts b/packages/aitube-clap/src/converters/clapToDataUri.ts new file mode 100644 index 00000000..dffe3cb8 --- /dev/null +++ b/packages/aitube-clap/src/converters/clapToDataUri.ts @@ -0,0 +1,10 @@ + +import { ClapProject } from "@/types" +import { serializeClap } from "@/io/serializeClap" +import { blobToDataUri } from "@/converters/blobToDataUri" + +export async function clapToDataUri(clap: ClapProject): Promise { + const archive = await serializeClap(clap) + const dataUri = await blobToDataUri(archive, "application/x-gzip") + return dataUri +} \ No newline at end of file diff --git a/packages/aitube-clap/src/converters/dataUriToBlob.ts b/packages/aitube-clap/src/converters/dataUriToBlob.ts new file mode 100644 index 00000000..364f1dcd --- /dev/null +++ b/packages/aitube-clap/src/converters/dataUriToBlob.ts @@ -0,0 +1,22 @@ + +/** + * Convert a Data URI to a Blob + * + * @param dataURI + * @param defaultContentType (Optional) you can pass a default content + * @returns + */ +export function dataUriToBlob(dataURI = "", defaultContentType = ""): Blob { + dataURI = dataURI.replace(/^data:/, ''); + + const type = dataURI.match(/(?:image|application|video|audio|text)\/[^;]+/)?.[0] || defaultContentType; + const base64 = dataURI.replace(/^[^,]+,/, ''); + const arrayBuffer = new ArrayBuffer(base64.length); + const typedArray = new Uint8Array(arrayBuffer); + + for (let i = 0; i < base64.length; i++) { + typedArray[i] = base64.charCodeAt(i); + } + + return new Blob([arrayBuffer], { type }); +} \ No newline at end of file diff --git a/packages/aitube-clap/src/converters/index.ts b/packages/aitube-clap/src/converters/index.ts new file mode 100644 index 00000000..1a4daa0a --- /dev/null +++ b/packages/aitube-clap/src/converters/index.ts @@ -0,0 +1,3 @@ +export { blobToDataUri } from './blobToDataUri' +export { clapToDataUri } from './clapToDataUri' +export { dataUriToBlob } from './dataUriToBlob' diff --git a/packages/aitube-clap/src/factories/index.ts b/packages/aitube-clap/src/factories/index.ts new file mode 100644 index 00000000..9aaa7c94 --- /dev/null +++ b/packages/aitube-clap/src/factories/index.ts @@ -0,0 +1,3 @@ +export { newClap } from './newClap' +export { newModel } from './newModel' +export { newSegment } from './newSegment' diff --git a/packages/aitube-clap/src/factories/newClap.ts b/packages/aitube-clap/src/factories/newClap.ts new file mode 100644 index 00000000..d8dce403 --- /dev/null +++ b/packages/aitube-clap/src/factories/newClap.ts @@ -0,0 +1,37 @@ + +import { v4 as uuidv4 } from "uuid" + +import { ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "@/types" +import { getValidNumber } from "@/utils/getValidNumber" + +// generate an empty clap file, or copy one from a source +export function newClap(clap: { + meta?: Partial + models?: ClapModel[] + scenes?: ClapScene[] + segments?: ClapSegment[] + } = {}): ClapProject { + + const meta: ClapMeta = { + id: clap?.meta?.id === "string" ? clap.meta.id : uuidv4(), + title: clap?.meta?.title === "string" ? clap.meta.title : "", + description: typeof clap?.meta?.description === "string" ? clap.meta.description : "", + synopsis: typeof clap?.meta?.synopsis === "string" ? clap.meta.synopsis : "", + licence: typeof clap?.meta?.licence === "string" ? clap.meta.licence : "", + orientation: clap?.meta?.orientation === "portrait" ? "portrait" : clap?.meta?.orientation === "square" ? "square" : "landscape", + durationInMs: getValidNumber(clap?.meta?.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), + width: getValidNumber(clap?.meta?.width, 256, 8192, 1024), + height: getValidNumber(clap?.meta?.height, 256, 8192, 576), + defaultVideoModel: typeof clap?.meta?.defaultVideoModel === "string" ? clap.meta.defaultVideoModel : "SVD", + extraPositivePrompt: Array.isArray(clap?.meta?.extraPositivePrompt) ? clap.meta.extraPositivePrompt : [], + screenplay: typeof clap?.meta?.screenplay === "string" ? clap.meta.screenplay : "", + isLoop: typeof clap?.meta?.isLoop === "boolean" ? clap.meta.isLoop : false, + isInteractive: typeof clap?.meta?.isInteractive === "boolean" ? clap.meta.isInteractive : false, + } + + const models: ClapModel[] = clap?.models && Array.isArray(clap.models) ? clap.models : [] + const scenes: ClapScene[] = clap?.scenes && Array.isArray(clap.scenes) ? clap.scenes : [] + const segments: ClapSegment[] = clap?.segments && Array.isArray(clap.segments) ? clap.segments : [] + + return { meta, models, scenes, segments } +} diff --git a/packages/aitube-clap/src/factories/newModel.ts b/packages/aitube-clap/src/factories/newModel.ts new file mode 100644 index 00000000..3c4e012d --- /dev/null +++ b/packages/aitube-clap/src/factories/newModel.ts @@ -0,0 +1,38 @@ +import { v4 as uuidv4 } from "uuid" + +import { ClapAssetSource, ClapModel, ClapModelAppearance, ClapModelAudioEngine, ClapModelGender, ClapModelRegion, ClapSegmentCategory } from "@/types" +import { generateSeed } from "@/utils/generateSeed" +import { isValidNumber } from "@/utils/isValidNumber" + +export function newModel(maybeModel?: Partial) { + + const model: ClapModel = { + id: typeof maybeModel?.id === "string" ? maybeModel.id : uuidv4(), + category: typeof maybeModel?.category === "string" ? (maybeModel.category as ClapSegmentCategory) : "character", + triggerName: typeof maybeModel?.triggerName === "string" ? maybeModel.triggerName : "", + label: typeof maybeModel?.label === "string" ? maybeModel.label : "", + description: typeof maybeModel?.description === "string" ? maybeModel.description : "", + author: typeof maybeModel?.author === "string" ? maybeModel.author : "", + thumbnailUrl: typeof maybeModel?.thumbnailUrl === "string" ? maybeModel.thumbnailUrl : "", + seed: isValidNumber(maybeModel?.seed) ? (maybeModel?.seed || 0) : generateSeed(), + + imagePrompt: typeof maybeModel?.imagePrompt === "string" ? maybeModel.imagePrompt : "", + imageSourceType: typeof maybeModel?.imageSourceType === "string" ? (maybeModel.imageSourceType as ClapAssetSource) : "EMPTY", + imageEngine: typeof maybeModel?.imageEngine === "string" ? maybeModel.imageEngine : "", + imageId: typeof maybeModel?.imageId === "string" ? maybeModel.imageId : "", + audioPrompt: typeof maybeModel?.audioPrompt === "string" ? maybeModel.audioPrompt : "", + audioSourceType: typeof maybeModel?.audioSourceType === "string" ? (maybeModel.audioSourceType as ClapAssetSource) : "EMPTY", + audioEngine: typeof maybeModel?.audioEngine === "string" ? (maybeModel.audioEngine as ClapModelAudioEngine) : "Parler-TTS", + audioId: typeof maybeModel?.audioId === "string" ? maybeModel.audioId : "", + + // those are only used by certain types of models + age: isValidNumber(maybeModel?.age) ? (maybeModel?.age || 0) : 25, + + // TODO find a way to validate those, using lists + gender: typeof maybeModel?.gender === "string" ? (maybeModel.gender as ClapModelGender) : "object", + region: typeof maybeModel?.region === "string" ? (maybeModel.region as ClapModelRegion) : "global", + appearance: typeof maybeModel?.appearance === "string" ? (maybeModel.appearance as ClapModelAppearance) : "neutral", + } + + return model +} diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts new file mode 100644 index 00000000..50ba4192 --- /dev/null +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -0,0 +1,46 @@ +import { v4 as uuidv4 } from "uuid" + +import { ClapSegment } from "@/types" +import { isValidNumber } from "@/utils/isValidNumber" +import { generateSeed } from "@/utils/generateSeed" + +export function newSegment(maybeSegment?: Partial) { + + const startTimeInMs = + isValidNumber(maybeSegment?.startTimeInMs) + ? (maybeSegment?.startTimeInMs || 0) + : 0 + + const assetDurationInMs = + isValidNumber(maybeSegment?.assetDurationInMs) + ? (maybeSegment?.assetDurationInMs || 0) + : 1000 + + const endTimeInMs = + isValidNumber(maybeSegment?.endTimeInMs) + ? (maybeSegment?.endTimeInMs || 0) + : (startTimeInMs + assetDurationInMs) + + const segment: ClapSegment = { + id: typeof maybeSegment?.id === "string" ? maybeSegment.id : uuidv4(), + track: isValidNumber(maybeSegment?.track) ? (maybeSegment?.track || 0) : 0, + startTimeInMs, + endTimeInMs, + category: typeof maybeSegment?.category === "string" ? maybeSegment.category : "generic", + modelId: typeof maybeSegment?.modelId === "string" ? maybeSegment.modelId : "", + sceneId: typeof maybeSegment?.sceneId === "string" ? maybeSegment.sceneId : "", + prompt: typeof maybeSegment?.prompt === "string" ? maybeSegment.prompt : "", + label: typeof maybeSegment?.label === "string" ? maybeSegment.label : "", + outputType: typeof maybeSegment?.outputType === "string" ? maybeSegment.outputType : "text", + renderId: typeof maybeSegment?.renderId === "string" ? maybeSegment.renderId : "", + status: typeof maybeSegment?.status === "string" ? maybeSegment.status : "to_generate", + assetUrl: typeof maybeSegment?.assetUrl === "string" ? maybeSegment.assetUrl : "", + assetDurationInMs, + createdBy: typeof maybeSegment?.createdBy === "string" ? maybeSegment.createdBy : "ai", + editedBy: typeof maybeSegment?.editedBy === "string" ? maybeSegment.editedBy : "ai", + outputGain: isValidNumber(maybeSegment?.outputGain) ? (maybeSegment?.outputGain || 0) : 0, + seed: isValidNumber(maybeSegment?.seed) ? (maybeSegment?.seed || 0) : generateSeed() + } + + return segment +} \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/README.md b/packages/aitube-clap/src/helpers/README.md new file mode 100644 index 00000000..5a7df47d --- /dev/null +++ b/packages/aitube-clap/src/helpers/README.md @@ -0,0 +1 @@ +Utilities to help developers getting quickly bootstrapped \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts new file mode 100644 index 00000000..3ab010fd --- /dev/null +++ b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts @@ -0,0 +1,121 @@ +import { defaultSegmentDurationInMs, demoStory } from "@/samples/stories" + +import { newClap } from "@/factories/newClap" +import { newSegment } from "@/factories/newSegment" +import { ClapProject } from "@/types" + +export function generateClapFromSimpleStory({ + story = demoStory, + showIntroPoweredByEngine = false, + showIntroDisclaimerAboutAI = false, +}: { + story?: string[] + showIntroPoweredByEngine?: boolean + showIntroDisclaimerAboutAI?: boolean +} = { + story: demoStory, + showIntroPoweredByEngine: false, + showIntroDisclaimerAboutAI: false, +}): ClapProject { + + const clap = newClap({ + meta: { + title: "Interactive Demo", + isInteractive: true, + isLoop: true, + } + }) + + let currentElapsedTimeInMs = 0 + let currentSegmentDurationInMs = defaultSegmentDurationInMs + + if (showIntroPoweredByEngine) { + clap.segments.push(newSegment({ + startTimeInMs: currentElapsedTimeInMs, + endTimeInMs: currentSegmentDurationInMs, + category: "interface", + prompt: "", + label: "disclaimer", + outputType: "interface", + })) + currentElapsedTimeInMs += currentSegmentDurationInMs + } + + if (showIntroDisclaimerAboutAI) { + clap.segments.push(newSegment({ + startTimeInMs: currentElapsedTimeInMs, + endTimeInMs: currentSegmentDurationInMs, + category: "interface", + prompt: "", + label: "disclaimer", + outputType: "interface", + })) + currentElapsedTimeInMs += currentSegmentDurationInMs + } + + /* + clap.segments.push( + newSegment({ + // id: string + // track: number + startTimeInMs: currentElapsedTimeInMs, + endTimeInMs: currentSegmentDurationInMs, + category: "interface", + // modelId: string + // sceneId: string + prompt: "a hello world", + label: "hello world", + outputType: "interface" + // renderId: string + // status: ClapSegmentStatus + // assetUrl: string + // assetDurationInMs: number + // createdBy: ClapAuthor + // editedBy: ClapAuthor + // outputGain: number + // seed: number + }) + ) + + currentElapsedTimeInMs += currentSegmentDurationInMs + */ + + + + for (let prompt of story) { + + clap.segments.push(newSegment({ + track: 0, + startTimeInMs: currentElapsedTimeInMs, + endTimeInMs: currentSegmentDurationInMs, + category: "video", + prompt: "", + label: "video", + outputType: "video", + })) + clap.segments.push(newSegment({ + track: 1, + startTimeInMs: currentElapsedTimeInMs, + endTimeInMs: currentSegmentDurationInMs, + category: "generic", + prompt, + label: prompt, + outputType: "text", + })) + clap.segments.push(newSegment({ + track: 2, + startTimeInMs: currentElapsedTimeInMs, + endTimeInMs: currentSegmentDurationInMs, + category: "camera", + prompt: "medium-shot", + label: "medium-shot", + outputType: "text", + })) + + currentElapsedTimeInMs += currentSegmentDurationInMs + } + + clap.meta.durationInMs = currentElapsedTimeInMs + + return clap +} \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/getEmptyClap.ts b/packages/aitube-clap/src/helpers/getEmptyClap.ts new file mode 100644 index 00000000..86a075c2 --- /dev/null +++ b/packages/aitube-clap/src/helpers/getEmptyClap.ts @@ -0,0 +1,18 @@ +import { newClap } from "@/factories/newClap" +import { serializeClap } from "@/io/serializeClap" + +let globalState: { + blob?: Blob +} = { + blob: undefined +} + +export async function getEmptyClap(): Promise { + if (globalState.blob) { return globalState.blob } + + const clap = newClap() + + globalState.blob = await serializeClap(clap) + + return globalState.blob +} \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/index.ts b/packages/aitube-clap/src/helpers/index.ts new file mode 100644 index 00000000..b4dc6ad9 --- /dev/null +++ b/packages/aitube-clap/src/helpers/index.ts @@ -0,0 +1,2 @@ +export { getEmptyClap } from './getEmptyClap' +export { generateClapFromSimpleStory } from './generateClapFromSimpleStory' diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts new file mode 100644 index 00000000..a5dcc3d7 --- /dev/null +++ b/packages/aitube-clap/src/index.ts @@ -0,0 +1,26 @@ +export { + ClapSegmentCategory, + ClapOutputType, + ClapSegmentStatus, + ClapAuthor, + ClapAssetSource, + ClapModelGender, + ClapModelAppearance, + ClapModelRegion, + ClapModelTimbre, + ClapModelAudioEngine, + ClapVoice, + ClapHeader, + ClapMeta, + ClapSceneEvent, + ClapScene, + ClapSegment, + ClapModel, + ClapProject, +} from './types' +export { newClap, newModel, newSegment } from './factories' +export { parseClap, serializeClap } from './io' +export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber } from './utils' + +// let's not add those helpers by default, there add some weight while not being essentials +// export { generateClapFromSimpleStory, getEmptyClap } from './helpers' diff --git a/packages/aitube-clap/src/io/index.ts b/packages/aitube-clap/src/io/index.ts new file mode 100644 index 00000000..49e07a4f --- /dev/null +++ b/packages/aitube-clap/src/io/index.ts @@ -0,0 +1,2 @@ +export { parseClap } from './parseClap' +export { serializeClap } from './serializeClap' diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts new file mode 100644 index 00000000..827a120d --- /dev/null +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -0,0 +1,327 @@ +import YAML from "yaml" +import { v4 as uuidv4 } from "uuid" + +import { ClapHeader, ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "../types" +import { getValidNumber } from "../utils/getValidNumber" +import { dataUriToBlob } from "../converters/dataUriToBlob" + +type StringOrBlob = string | Blob + +/** + * Import a clap file from various data sources into an ClapProject + * + * Inputs can be: + * - a Clap project (which is an object) + * - an URL to a remote .clap file + * - a string containing a YAML array + * - a data uri containing a gzipped YAML array + * - a Blob containing a gzipped YAML array + * + * note: it is not really async, because for some reason YAML.parse is a blocking call like for JSON, + * there is no async version although we are now in the 20s not 90s + */ +export async function parseClap(src?: ClapProject | string | Blob, debug = false): Promise { + + try { + if ( + typeof src === "object" && + Array.isArray( (src as any)?.scenes) && + Array.isArray((src as any)?.models) + ) { + if (debug) { + console.log("parseClap: input is already a Clap file, nothing to do:", src) + } + // we can skip verification + return src as ClapProject + } + } catch (err) { + // well, this is not a clap project + } + + let stringOrBlob = (src || "") as StringOrBlob + + // both should work + const dataUriHeader1 = "data:application/x-gzip;base64," + const dataUriHeader2 = "data:application/octet-stream;base64," + + const inputIsString = typeof stringOrBlob === "string" + const inputIsDataUri = typeof stringOrBlob === "string" ? stringOrBlob.startsWith(dataUriHeader1) || stringOrBlob.startsWith(dataUriHeader2) : false + const inputIsRemoteFile = typeof stringOrBlob === "string" ? (stringOrBlob.startsWith("http://") || stringOrBlob.startsWith("https://")) : false + + let inputIsBlob = typeof stringOrBlob !== "string" + + let inputYamlArrayString = "" + + if (debug) { + console.log(`parseClap: pre-analysis: ${JSON.stringify({ + inputIsString, + inputIsBlob, + inputIsDataUri, + inputIsRemoteFile + }, null, 2)}`) + } + + if (typeof stringOrBlob === "string") { + if (debug) { + console.log("parseClap: input is a string ", stringOrBlob.slice(0, 120)) + } + if (inputIsDataUri) { + if (debug) { + console.log(`parseClap: input is a data uri archive`) + } + stringOrBlob = dataUriToBlob(stringOrBlob, "application/x-gzip") + if (debug) { + console.log(`parseClap: inputBlob = `, stringOrBlob) + } + inputIsBlob = true + } else if (inputIsRemoteFile) { + try { + if (debug) { + console.log(`parseClap: input is a remote .clap file`) + } + const res = await fetch(stringOrBlob) + stringOrBlob = await res.blob() + if (!stringOrBlob) { throw new Error("blob is empty") } + inputIsBlob = true + } catch (err) { + // url seems invalid + throw new Error(`failed to download the .clap file (${err})`) + } + } else { + if (debug) { + console.log("parseClap: input is a text string containing a YAML array") + } + inputYamlArrayString = stringOrBlob + inputIsBlob = false + } + } + + if (typeof stringOrBlob !== "string" && stringOrBlob) { + if (debug) { + console.log("parseClap: decompressing the blob..") + } + // Decompress the input blob using gzip + const decompressedStream = stringOrBlob.stream().pipeThrough(new DecompressionStream('gzip')) + + try { + // Convert the stream to text using a Response object + const decompressedOutput = new Response(decompressedStream) + // decompressedOutput.headers.set("Content-Type", "application/x-gzip") + if (debug) { + console.log("parseClap: decompressedOutput: ", decompressedOutput) + } + // const blobAgain = await decompressedOutput.blob() + inputYamlArrayString = await decompressedOutput.text() + + if (debug && inputYamlArrayString) { + console.log("parseClap: successfully decompressed the blob!") + } + } catch (err) { + const message = `parseClap: failed to decompress (${err})` + console.error(message) + throw new Error(message) + } + } + + // we don't need this anymore I think + // new Blob([inputStringOrBlob], { type: "application/x-yaml" }) + + let maybeArray: any = {} + try { + if (debug) { + console.log("parseClap: parsing the YAML array..") + } + // Parse YAML string to raw data + maybeArray = YAML.parse(inputYamlArrayString) + } catch (err) { + throw new Error("invalid clap file (input string is not YAML)") + } + + if (!Array.isArray(maybeArray) || maybeArray.length < 2) { + throw new Error("invalid clap file (need a clap format header block and project metadata block)") + } + + if (debug) { + console.log("parseClap: the YAML seems okay, continuing decoding..") + } + + const maybeClapHeader = maybeArray[0] as ClapHeader + + if (maybeClapHeader.format !== "clap-0") { + throw new Error("invalid clap file (sorry, but you can't make up version numbers like that)") + } + + + const maybeClapMeta = maybeArray[1] as ClapMeta + + const clapMeta: ClapMeta = { + id: typeof maybeClapMeta.title === "string" ? maybeClapMeta.id : uuidv4(), + title: typeof maybeClapMeta.title === "string" ? maybeClapMeta.title : "", + description: typeof maybeClapMeta.description === "string" ? maybeClapMeta.description : "", + synopsis: typeof maybeClapMeta.synopsis === "string" ? maybeClapMeta.synopsis : "", + licence: typeof maybeClapMeta.licence === "string" ? maybeClapMeta.licence : "", + orientation: maybeClapMeta.orientation === "portrait" ? "portrait" : maybeClapMeta.orientation === "square" ? "square" : "landscape", + durationInMs: getValidNumber(maybeClapMeta.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), + width: getValidNumber(maybeClapMeta.width, 128, 8192, 1024), + height: getValidNumber(maybeClapMeta.height, 128, 8192, 576), + defaultVideoModel: typeof maybeClapMeta.defaultVideoModel === "string" ? maybeClapMeta.defaultVideoModel : "SVD", + extraPositivePrompt: Array.isArray(maybeClapMeta.extraPositivePrompt) ? maybeClapMeta.extraPositivePrompt : [], + screenplay: typeof maybeClapMeta.screenplay === "string" ? maybeClapMeta.screenplay : "", + isLoop: typeof maybeClapMeta.isLoop === "boolean" ? maybeClapMeta.isLoop : false, + isInteractive: typeof maybeClapMeta.isInteractive === "boolean" ? maybeClapMeta.isInteractive : false, + } + + /* + in case we want to support streaming (mix of models and segments etc), we could do it this way: + + const maybeModelsOrSegments = rawData.slice(2) + maybeModelsOrSegments.forEach((unknownElement: any) => { + if (isValidNumber(unknownElement?.track)) { + maybeSegments.push(unknownElement as ClapSegment) + } else { + maybeModels.push(unknownElement as ClapModel) + } + }) + */ + + + const expectedNumberOfModels = maybeClapHeader.numberOfModels || 0 + const expectedNumberOfScenes = maybeClapHeader.numberOfScenes || 0 + const expectedNumberOfSegments = maybeClapHeader.numberOfSegments || 0 + + // note: we assume the order is strictly enforced! + // if you implement streaming (mix of models and segments) you will have to rewrite this! + + const afterTheHeaders = 2 + const afterTheModels = afterTheHeaders + expectedNumberOfModels + + const afterTheScenes = afterTheModels + expectedNumberOfScenes + + // note: if there are no expected models, maybeModels will be empty + const maybeModels = maybeArray.slice(afterTheHeaders, afterTheModels) as ClapModel[] + + // note: if there are no expected scenes, maybeScenes will be empty + const maybeScenes = maybeArray.slice(afterTheModels, afterTheScenes) as ClapScene[] + + const maybeSegments = maybeArray.slice(afterTheScenes) as ClapSegment[] + + const clapModels: ClapModel[] = maybeModels.map(({ + id, + category, + triggerName, + label, + description, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + }) => ({ + // TODO: we should verify each of those, probably + id, + category, + triggerName, + label, + description, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + })) + + const clapScenes: ClapScene[] = maybeScenes.map(({ + id, + scene, + line, + rawLine, + sequenceFullText, + sequenceStartAtLine, + sequenceEndAtLine, + startAtLine, + endAtLine, + events, + }) => ({ + id, + scene, + line, + rawLine, + sequenceFullText, + sequenceStartAtLine, + sequenceEndAtLine, + startAtLine, + endAtLine, + events: events.map(e => e) + })) + + const clapSegments: ClapSegment[] = maybeSegments.map(({ + id, + track, + startTimeInMs, + endTimeInMs, + category, + modelId, + sceneId, + prompt, + label, + outputType, + renderId, + status, + assetUrl, + assetDurationInMs, + createdBy, + editedBy, + outputGain, + seed, + }) => ({ + // TODO: we should verify each of those, probably + id, + track, + startTimeInMs, + endTimeInMs, + category, + modelId, + sceneId, + prompt, + label, + outputType, + renderId, + status, + assetUrl, + assetDurationInMs, + createdBy, + editedBy, + outputGain, + seed, + })) + + if (debug) { + console.log(`parseClap: successfully parsed ${clapModels.length} models, ${clapScenes.length} scenes and ${clapSegments.length} segments`) + } + return { + meta: clapMeta, + models: clapModels, + scenes: clapScenes, + segments: clapSegments + } +} diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts new file mode 100644 index 00000000..f87017d4 --- /dev/null +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -0,0 +1,177 @@ +import YAML from "yaml" +import { v4 as uuidv4 } from "uuid" + +import { getValidNumber } from "@/utils/getValidNumber" + +import { ClapHeader, ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "../types" + +export async function serializeClap({ + meta, // ClapMeta + models, // ClapModel[] + scenes, // ClapScene[] + segments, // ClapSegment[] +}: ClapProject): Promise { + + // we play it safe, and we verify the structure of the parameters, + // to make sure we generate a valid clap file + const clapModels: ClapModel[] = models.map(({ + id, + category, + triggerName, + label, + description, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + }) => ({ + id, + category, + triggerName, + label, + description, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + })) + + const clapScenes: ClapScene[] = scenes.map(({ + id, + scene, + line, + rawLine, + sequenceFullText, + sequenceStartAtLine, + sequenceEndAtLine, + startAtLine, + endAtLine, + events, + }) => ({ + id, + scene, + line, + rawLine, + sequenceFullText, + sequenceStartAtLine, + sequenceEndAtLine, + startAtLine, + endAtLine, + events: events.map(e => e) + })) + + const clapSegments: ClapSegment[] = segments.map(({ + id, + track, + startTimeInMs, + endTimeInMs, + category, + modelId, + sceneId, + prompt, + label, + outputType, + renderId, + status, + assetUrl, + assetDurationInMs, + createdBy, + editedBy, + outputGain, + seed, + }) => ({ + id, + track, + startTimeInMs, + endTimeInMs, + category, + modelId, + sceneId, + prompt, + label, + outputType, + renderId, + status, + assetUrl, + assetDurationInMs, + createdBy, + editedBy, + outputGain, + seed, + })) + + const clapHeader: ClapHeader = { + format: "clap-0", + numberOfModels: clapModels.length, + numberOfScenes: clapScenes.length, + numberOfSegments: clapSegments.length, + } + + const clapMeta: ClapMeta = { + id: meta.id || uuidv4(), + title: typeof meta.title === "string" ? meta.title : "Untitled", + description: typeof meta.description === "string" ? meta.description : "", + synopsis: typeof meta.synopsis === "string" ? meta.synopsis : "", + licence: typeof meta.licence === "string" ? meta.licence : "", + orientation: meta.orientation === "portrait" ? "portrait" : meta.orientation === "square" ? "square" : "landscape", + durationInMs: getValidNumber(meta.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), + width: getValidNumber(meta.width, 256, 8192, 1024), + height: getValidNumber(meta.height, 256, 8192, 576), + defaultVideoModel: typeof meta.defaultVideoModel === "string" ? meta.defaultVideoModel : "SVD", + extraPositivePrompt: Array.isArray(meta.extraPositivePrompt) ? meta.extraPositivePrompt : [], + screenplay: typeof meta.screenplay === "string" ? meta.screenplay : "", + isLoop: typeof meta.screenplay === "boolean" ? meta.screenplay : false, + isInteractive: typeof meta.isInteractive === "boolean" ? meta.isInteractive : false, + } + + const entries = [ + clapHeader, + clapMeta, + ...clapModels, + ...clapScenes, + ...clapSegments + ] + + const strigifiedResult = YAML.stringify(entries) + + // Convert the string to a Blob + const blobResult = new Blob([strigifiedResult], { type: "application/x-yaml" }) + + // Create a stream for the blob + const readableStream = blobResult.stream() + + // Compress the stream using gzip + const compressionStream = new CompressionStream('gzip') + const compressedStream = readableStream.pipeThrough(compressionStream) + + // Create a new blob from the compressed stream + const response = new Response(compressedStream) + + response.headers.set("Content-Type", "application/x-gzip") + + const compressedBlob = await response.blob() + + return compressedBlob +} \ No newline at end of file diff --git a/packages/aitube-clap/src/samples/stories.ts b/packages/aitube-clap/src/samples/stories.ts new file mode 100644 index 00000000..d1ebafc6 --- /dev/null +++ b/packages/aitube-clap/src/samples/stories.ts @@ -0,0 +1,28 @@ +export const defaultSegmentDurationInMs = 2500 // 2584 + +export const fishDemoStory = [ + "Siamese fighting fish, bokeh, underwater, coral, lively, bubbles, translucency, perfect", + + // this one is magnificient! + "princess parrot fish, bokeh, underwater, coral, lively, bubbles, translucency, perfect", + + "pacific ocean perch, bokeh, underwater, coral, lively, bubbles, translucency, perfect", + + "Queen angelfish, bokeh, underwater, coral, lively, bubbles, translucency, perfect", + + "sea turtle, bokeh, underwater, coral, lively, bubbles, translucency, perfect", + + "hippocampus, bokeh, underwater, coral, lively, bubbles, translucency, perfect", +] + +export const demoStory = [ + ...fishDemoStory, + + // "portrait of one man news anchor, 60yo, thin, fit, american, mustache, beard, wearing a suit, medium-shot, central park, outside, serious, bokeh, perfect", + + // "screenshot from Call of Duty, FPS game, nextgen, videogame screenshot, unreal engine, raytracing, perfect", + + // "screenshot from a flight simulator, nextgen, videogame screenshot, unreal engine, raytracing, perfect", + // "screenshot from fallout3, fallout4, western, wasteland, 3rd person RPG, nextgen, videogame screenshot, unreal engine, raytracing, perfect", + // "portrait of single influencer woman, 30yo, thin, fit, american, wearing a red tshirt, medium-shot, central park, outside, serious, bokeh, perfect", +] diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts new file mode 100644 index 00000000..b8ae6f5b --- /dev/null +++ b/packages/aitube-clap/src/types.ts @@ -0,0 +1,212 @@ + +export type ClapSegmentCategory = + | "splat" + | "mesh" + | "depth" + | "event" + | "interface" + | "phenomenon" + | "video" + | "storyboard" + | "transition" + | "character" + | "location" + | "time" + | "era" + | "lighting" + | "weather" + | "action" + | "music" + | "sound" + | "dialogue" + | "style" + | "camera" + | "generic" + +export type ClapOutputType = + | "text" + | "animation" + | "interface" + | "event" + | "phenomenon" + | "transition" + | "image" + | "video" + | "audio" + +export type ClapSegmentStatus = + | "to_generate" + | "to_interpolate" + | "to_upscale" + | "completed" + | "error" + +export type ClapAuthor = + | "auto" // the element was edited automatically using basic if/else logical rules + | "ai" // the element was edited using a large language model + | "human" // the element was edited by a human + +export type ClapAssetSource = + | "REMOTE" // http:// or https:// + + // note that "path" assets are potentially a security risk, they need to be treated with care + | "PATH" // a file path eg. /path or ./path/to/ or ../path/to/ + + | "DATA" // a data URI, starting with data: + + | "PROMPT" // by default, a plain text prompt + + | "EMPTY" + +export type ClapModelGender = + | "male" + | "female" + | "person" + | "object" + +export type ClapModelAppearance = "serious" | "neutral" | "friendly" | "chill" + +// this is used for accent, style.. +export type ClapModelRegion = + | "global" + | "american" + | "european" + | "british" + | "australian" + | "canadian" + | "indian" + | "french" + | "italian" + | "german" + | "chinese" + +// note: this is all very subjective, so please use good judgment +// +// "deep" might indicate a deeper voice tone, thicker, rich in harmonics +// in this context, it is used to indicate voices that could +// be associated with African American (AADOS) characters +// +// "high" could be used for some other countries, eg. asia +export type ClapModelTimbre = "high" | "neutral" | "deep" + +export type ClapModelAudioEngine = "ElevenLabs" | "XTTS" | "Parler-TTS" + +export type ClapVoice = { + name: string + gender: ClapModelGender + age: number + region: ClapModelRegion + timbre: ClapModelTimbre + appearance: ClapModelAppearance + audioEngine: ClapModelAudioEngine + audioId: string +} + +export type ClapHeader = { + format: "clap-0" + numberOfModels: number + numberOfScenes: number + numberOfSegments: number +} + +export type ClapMeta = { + id: string + title: string + description: string + synopsis: string + licence: string + orientation: string + + // the default duration of the experience + // the real one might last longer if made interactive + durationInMs: number + + width: number + height: number + defaultVideoModel: string + extraPositivePrompt: string[] + screenplay: string + isLoop: boolean + isInteractive: boolean +} + +export type ClapSceneEvent = { + id: string + type: "description" | "dialogue" | "action" + character?: string + description: string + behavior: string + startAtLine: number + endAtLine: number +} + +export type ClapScene = { + id: string + scene: string + line: string + rawLine: string + sequenceFullText: string + sequenceStartAtLine: number + sequenceEndAtLine: number + startAtLine: number + endAtLine: number + events: ClapSceneEvent[] +} + +export type ClapSegment = { + id: string + track: number // usually track 0 is the video, track 1 is the storyboard, track 2 is the camera + startTimeInMs: number + endTimeInMs: number + category: ClapSegmentCategory + modelId: string + sceneId: string + prompt: string + label: string + outputType: ClapOutputType + renderId: string + status: ClapSegmentStatus + assetUrl: string + assetDurationInMs: number + createdBy: ClapAuthor + editedBy: ClapAuthor + outputGain: number + seed: number +} + +export type ClapModel = { + id: string + category: ClapSegmentCategory + triggerName: string + label: string + description: string + author: string + thumbnailUrl: string + seed: number + + // TODO: create those 4 fields across all the code base: + imagePrompt: string + imageSourceType: ClapAssetSource + imageEngine: string + imageId: string + + audioPrompt: string + audioSourceType: ClapAssetSource + audioEngine: ClapModelAudioEngine + audioId: string + + // TODO: rename to audioVendor, audioId and add an audioSourceType + // those are only used by certain types of models + age: number + gender: ClapModelGender + region: ClapModelRegion + appearance: ClapModelAppearance +} + +export type ClapProject = { + meta: ClapMeta + models: ClapModel[] + scenes: ClapScene[] + segments: ClapSegment[] + // let's keep room for other stuff (screenplay etc) +} diff --git a/packages/aitube-clap/src/utils/generateSeed.ts b/packages/aitube-clap/src/utils/generateSeed.ts new file mode 100644 index 00000000..563e25ec --- /dev/null +++ b/packages/aitube-clap/src/utils/generateSeed.ts @@ -0,0 +1,3 @@ +export function generateSeed() { + return Math.floor(Math.random() * Math.pow(2, 31)); +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/getClapAssetSourceType.ts b/packages/aitube-clap/src/utils/getClapAssetSourceType.ts new file mode 100644 index 00000000..be2baf01 --- /dev/null +++ b/packages/aitube-clap/src/utils/getClapAssetSourceType.ts @@ -0,0 +1,25 @@ +import { ClapAssetSource } from "@/types" + +export function getClapAssetSourceType(input: string = ""): ClapAssetSource { + + const str = `${input || ""}`.trim() + + if (!str || !str.length) { + return "EMPTY" + } + + if (str.startsWith("https://") || str.startsWith("http://")) { + return "REMOTE" + } + + // note that "path" assets are potentially a security risk, they need to be treated with care + if (str.startsWith("/") || str.startsWith("../") || str.startsWith("./")) { + return "PATH" + } + + if (str.startsWith("data:")) { + return "DATA" + } + + return "PROMPT" +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/getValidNumber.ts b/packages/aitube-clap/src/utils/getValidNumber.ts new file mode 100644 index 00000000..841fc4af --- /dev/null +++ b/packages/aitube-clap/src/utils/getValidNumber.ts @@ -0,0 +1,10 @@ +export const getValidNumber = (something: any, minValue: number, maxValue: number, defaultValue: number) => { + const strValue = `${something || defaultValue}` + const numValue = Number(strValue) + const isValid = !isNaN(numValue) && isFinite(numValue) + if (!isValid) { + return defaultValue + } + return Math.max(minValue, Math.min(maxValue, numValue)) + +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts new file mode 100644 index 00000000..c38dffe8 --- /dev/null +++ b/packages/aitube-clap/src/utils/index.ts @@ -0,0 +1,4 @@ +export { generateSeed } from './generateSeed' +export { getClapAssetSourceType } from './getClapAssetSourceType' +export { getValidNumber } from './getValidNumber' +export { isValidNumber } from './isValidNumber' diff --git a/packages/aitube-clap/src/utils/isValidNumber.ts b/packages/aitube-clap/src/utils/isValidNumber.ts new file mode 100644 index 00000000..21ab9f72 --- /dev/null +++ b/packages/aitube-clap/src/utils/isValidNumber.ts @@ -0,0 +1,3 @@ +export function isValidNumber(input?: any) { + return typeof input === "number" && !isNaN(input) && isFinite(input) +} \ No newline at end of file diff --git a/packages/aitube-clap/tsconfig.json b/packages/aitube-clap/tsconfig.json new file mode 100644 index 00000000..ab7cc3ed --- /dev/null +++ b/packages/aitube-clap/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/aitube-clap/tsconfig.types.json b/packages/aitube-clap/tsconfig.types.json new file mode 100644 index 00000000..a6a3f211 --- /dev/null +++ b/packages/aitube-clap/tsconfig.types.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts" + ] +} From 137f62ad0a59702497b732e38dc475ddaa69abd1 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 18:32:54 +0200 Subject: [PATCH 002/346] add fetchClap --- packages/aitube-clap/package.json | 5 ++-- packages/aitube-clap/src/index.ts | 2 +- packages/aitube-clap/src/io/fetchClap.ts | 30 ++++++++++++++++++++++++ packages/aitube-clap/src/io/index.ts | 1 + 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 packages/aitube-clap/src/io/fetchClap.ts diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 3f8e5a69..da5b8c4d 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,12 +4,13 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.2", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", - "postbuild": "rimraf tsconfig.types.tsbuildinfo" + "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "publish": "npm publish --access public" }, "devDependencies": { "@types/uuid": "^9.0.8", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index a5dcc3d7..b87b7899 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -19,7 +19,7 @@ export { ClapProject, } from './types' export { newClap, newModel, newSegment } from './factories' -export { parseClap, serializeClap } from './io' +export { parseClap, serializeClap, fetchClap } from './io' export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber } from './utils' // let's not add those helpers by default, there add some weight while not being essentials diff --git a/packages/aitube-clap/src/io/fetchClap.ts b/packages/aitube-clap/src/io/fetchClap.ts new file mode 100644 index 00000000..1a8bdea4 --- /dev/null +++ b/packages/aitube-clap/src/io/fetchClap.ts @@ -0,0 +1,30 @@ +import { ClapProject } from "@/types" +import { parseClap } from "@/io/parseClap" + +export async function fetchClap(url: string, { + method = "GET", + body, + headers, + cache, +}: { + method?: string + body?: BodyInit | null + headers?: HeadersInit + cache?: RequestCache +} = { + method: "GET" +}): Promise { + + const res = await fetch(url, { + method, + headers, + body, + cache, + }) + + const blob = await res.blob() + + const clap = await parseClap(blob) + + return clap +} \ No newline at end of file diff --git a/packages/aitube-clap/src/io/index.ts b/packages/aitube-clap/src/io/index.ts index 49e07a4f..df059df7 100644 --- a/packages/aitube-clap/src/io/index.ts +++ b/packages/aitube-clap/src/io/index.ts @@ -1,2 +1,3 @@ export { parseClap } from './parseClap' export { serializeClap } from './serializeClap' +export { fetchClap } from './fetchClap' From 5e68d4dbd7fe66bf6591dbf9891b79272ffa516c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 18:45:43 +0200 Subject: [PATCH 003/346] release 0.0.3 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/index.ts | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index da5b8c4d..d29eed2d 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index b87b7899..7a025f4a 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -21,6 +21,5 @@ export { export { newClap, newModel, newSegment } from './factories' export { parseClap, serializeClap, fetchClap } from './io' export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber } from './utils' - -// let's not add those helpers by default, there add some weight while not being essentials -// export { generateClapFromSimpleStory, getEmptyClap } from './helpers' +export { blobToDataUri, dataUriToBlob, clapToDataUri } from './converters' +export { generateClapFromSimpleStory, getEmptyClap } from './helpers' From 039423753efd2b24d74be299984fa8baa34b834b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 18:48:40 +0200 Subject: [PATCH 004/346] =?UTF-8?q?=F0=9F=8E=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/aitube-client/.gitignore | 177 ++++++++++++++++++ packages/aitube-client/.npmignore | 4 + packages/aitube-client/.prettierrc.json | 9 + packages/aitube-client/LICENSE.md | 21 +++ packages/aitube-client/README.md | 50 +++++ packages/aitube-client/bun.lockb | Bin 0 -> 17695 bytes packages/aitube-client/package.json | 45 +++++ packages/aitube-client/src/api/exportClap.ts | 31 +++ packages/aitube-client/src/api/extendClap.ts | 24 +++ .../aitube-client/src/api/generateClap.ts | 32 ++++ packages/aitube-client/src/api/index.ts | 3 + packages/aitube-client/src/config.ts | 3 + packages/aitube-client/src/index.ts | 1 + packages/aitube-client/tsconfig.json | 31 +++ packages/aitube-client/tsconfig.types.json | 13 ++ 15 files changed, 444 insertions(+) create mode 100644 packages/aitube-client/.gitignore create mode 100644 packages/aitube-client/.npmignore create mode 100644 packages/aitube-client/.prettierrc.json create mode 100644 packages/aitube-client/LICENSE.md create mode 100644 packages/aitube-client/README.md create mode 100755 packages/aitube-client/bun.lockb create mode 100644 packages/aitube-client/package.json create mode 100644 packages/aitube-client/src/api/exportClap.ts create mode 100644 packages/aitube-client/src/api/extendClap.ts create mode 100644 packages/aitube-client/src/api/generateClap.ts create mode 100644 packages/aitube-client/src/api/index.ts create mode 100644 packages/aitube-client/src/config.ts create mode 100644 packages/aitube-client/src/index.ts create mode 100644 packages/aitube-client/tsconfig.json create mode 100644 packages/aitube-client/tsconfig.types.json diff --git a/packages/aitube-client/.gitignore b/packages/aitube-client/.gitignore new file mode 100644 index 00000000..ea8fe6a7 --- /dev/null +++ b/packages/aitube-client/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo \ No newline at end of file diff --git a/packages/aitube-client/.npmignore b/packages/aitube-client/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-client/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-client/.prettierrc.json b/packages/aitube-client/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-client/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-client/LICENSE.md b/packages/aitube-client/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-client/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md new file mode 100644 index 00000000..1ccb7cb6 --- /dev/null +++ b/packages/aitube-client/README.md @@ -0,0 +1,50 @@ +# @aitube/client + +*Official API client for AiTube.at* + +## ATTENTION + +AiTube is currently in heavy development, and for the moment +the API client is reserved for private use. + +We are sorry for any inconvenience this might cause. + +## Installation + +To install the package, run the following command: + +```bash +npm install @aitube/client +``` + +## Getting Started + +```typescript +import { parseClap, serializeClap } from '@aitube/client'; + +/* + + UNDOCUMENTED API + +*/ +``` + +## Build Instructions + +Install [Bun](https://bun.sh/) + +Run the following commands: + +```bash +bun install + +bun run build +``` + +## Contributing + +We welcome contributions! Please feel free to submit a pull request. + +## License + +This package is under the MIT License. See `LICENSE` file for more details. diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..a9204fc4125d767b4b5db057965904b6f1258dfd GIT binary patch literal 17695 zcmeHvd0dR$`~Q?dn~kC3R4$}WY6 z?35)BQF&}FWPgz5dtG;P>gLOo&+qsBzP^7rFL&oY%lmzB7*Oaaeuh} zfP5%ps6Z^{hl)7?3`U?p=!fO`3JgX&$PeX*@kJboq%DZ24Cy?`$G8;Isu1^Y#b6+R zrY!#qq&q_TFvRU4-p_2P9|tkEGo^Jy><(#c{~4saK>Pq=Y)?ZL-)hr$c6I6fY8Vnl0K? zdg*#E#RtCb&!3CD3ZA##bpM&rB=;MmeO{ffEbM03=GfF}6}x795n62RJ~Sm`MUAFL zN&Lj?wFc3`j$Yb&mHLIsdPlq!Hr;jpcZ=w=Kp|VC=XfVeXqG2<&P}QH_nvsqzR+=u z$*FB!FPv8Q3pW_#&`#B+*fZnWh&NjvHOE8nUT3YwRge5oOL)4fsR<_NtKK*YhKbA-ezT6yV zuUzJ9IxeT*k;Iv`ftMGl)#z=%xNgRl;1d3F6Ys>{2L{NVyKgx5;iKoqMUy7} z3&Z>W6mZsIuz|}I#t+kAnv9n65`2UV54J&tU&W^Z3S@|FKr@X)<6iEB$06zrqs5j&w`OT4#dd6^r`h(?y z3OI%>2?Xy4Hv?tzV;;)Ul0fjA;l>W|Wc+`%{l|cJ20Y>W)%NYcU>pHYaD=D1K9G7b zfJgZ;jkX8NZ;JxK-vrPwz#|CO!4?OC?*aWc-`Mk#d690fWc+ zL;6khNb3D8Cinmup3IwH#cu4xLKY$+w?UVGc>dyoQ9>))Hc%d9E38cLcz!UpxY1_z8@M*I4(fg8vEaqwOK~SMiGhkNroxX(<+}HukkhhR5;8(9$_T`p1X9M0E@Hqc5U_V+K5JPbE7{`*F12IP3!m|}6n;OK}ckC|)dW`in z;KEoFE({oBeJxBtz!=vG)DyO&3m4Ycg9`)3m~V&)2=o~1^@a=MK5${c80#Cuh57y9 z!hkX6voQhTM={C;&kj_;80%ZWg*;#rRKOV1mJP`t#>fL>K-Gh}K*hGQ`Xt8WZ+-u7 z>idi87aX|%p8@z37!AC1YUYmk*IO5F$OycWb>dkRPvOv;dVkwjQPVumOBIek;;@~T zSjU|8{o39%=kWD3t*RSGZmcbHnAtl#Y)YRbOF@(!o5qW_L;_Rz%-5hw;8JqD$A+NO z*LU1|zsA;ok!WdY>fO4MJbjP(tF2ZqP4DvdmXBQ z>z(DoRI|F1S3|ATUz%@ZA0JYAq`1o^hkeQ0*QoElI&QGBP!M!VD_!cO7Z>eOJG))> z{SKr32V|~ZuKL1PuVRV@cTCt(HS2*x?abQ+HKTPqU6}2Z{bk?2 zJJ!>z7jC@zVBNdo{SQ<6_4sV`dU4{AioU(}E_9m1&K0L-(0IxD0lArV>UWNp9dT;? zB*(OU{^U!^f7Y#;zb(Zocy4 zd%OR8xOXeIZSbz+N_%+SIf~O`qBX|a1^@fPoyJSndrIB|tiw6U_rF?JdgYE)%U+oK zqRl|73tG}I=kw-f1diHxW__u~MemoNhQ+*fcwxBP)2Ae@v$y>TcCk@(@^4DVNt)l&&eUi1tTOBy2Xc_dh=Hj6q_Ltv$-g?~9 z&{%iXl=H7lca3SY%lB1G^33QtG|SA8$K^#*6zU2~6u*^G3b)op*ZfHWz!XwyrN-ddHmFHo~Mw!a85o4-X3L z>aP#|l5)DkU+b==eCiOcsd3m#yO(R5ac>WL9XPw;pmQjV7v7OJ24?+4|HNx=9MrC+ z7H1l|WCZX3G(pkCq2ioSX}0gm52K8-<{UH{)=t^zwbQnYCBr74n5g<}Vn1E8o@rZO z_jx&X^I#e;yhCja%z@|15_gscPfF^3?b`KyA_pf`} zwoA#W^KZ@<`Q`-Lq(8K}c||h#am3E4iE}i3{;K!s`5|$_Lpz_|Z7N!`E|i~HlKr-d z#@nfp6~>J_M`Ms~S;o*1mF0oM?>-+fBjaezhg3JB*R7O9pVOM}hxI)_GP3{e zpw;Xis@9H&?>?9A?Ka&Av3h%c{&{(t8%Z zY9Y!u$8qAG(s;?a5V@I`vu9`NIgItbn`Ag#7!+*eetFvQX$Qx)ckkgVMZR`x0q8p}6k}iy<5OOl|E{ZW*xNuD$5V*>)AnJFLC%dCaWJ*E;2AU6fM| z`_g#HxfRKo(%KVc?bh7elWlp>Mem=kY1TSRLzaxMpKDUTF?{)K+sM<~i^?nN%soSA1Kf^Fv9@MpIM*)iMrGWt8vc)K=A3%oh(Yo1BDZWoSJ?N`%$xAmall9an= zdza!5eR5038-@Nm@St$@auZg$>)Ca~)fc)~G`0@tyh?a3 ze_TIiYTi@hzf(3F7aaBvr}1_tq!2T=th9f!_JYtqYt|_}b#ILW2UE*2$ z(CYT=QvJX!PtMNX5W{6wdxms4v~kKE#X8q{^jxo~zik$#M~2#cy?KGgOMkv&>R;{5S-t6P)H-c-o3GPt_u7=t z`?J!-@Zg%tMe&t!PPuMR9}hflzcE<4yM3hhYxYgIub%6ywL+fcWG?LXT(8=b#@mZ7 zui*aYR|->y&e^x5eQ}-fS+8#CS@(814>cHP^QdBFV8z%rMVkNQg`Nr9ucVv!==J-M zldeipy@gBS*tQn$O-J55O5@d`^SYjzKTgb=xwBlj{#L<(IpNzZYpySx_eo!PAj;ci zReoN_NV^Yv{4#oYCU_N;i)t0#_dhwddZYKif8JY)oX_{wqw(s}d4=}tZ`RqLzJ6d) z$z)?mT7F!O=Zi=GY(F3fZFNuFr=Tu0`Qyv1a(#El2byjVSNN@&H{11TpL4BzN)87n zg_P{tN8`okKN6UWJ6<(NQ=Kq;__N}x11~%jR9#Kic{R82%z>b)8Qfv>O*DrDmr67) zz8q-a^w98W^~u{|U)(m_nRhw3ba`0Bm9sT8UVTCeF_W2NJ;rDJWJ%rHe8Y0%L)^W3 zAF}$MjLy>1)Lb!g>A}d-dAY6Xjq3Mm<{-VyfX_=yUY*!tIM9YrpI`#Qr8bq+7zx`m6z#rJMN5&6sV~Tid1SZq_TrMl!;bWQ-iQc`yyY*~gxpGM=iE~@=SIxy z1-Ea{ztDM&bA80h>N4Zbd;KI@cNc9_SvPI-qh1E~@jmx6{dM{r&K6d=#JU{|i63&N zf~McTblw|YLHu-M%~5|i3xl83)Q7(B+biRpZjS(auJV?FN3VSBenPj?`{C+GFOKBs zP4ZphHmT&!HQkvt^C#<{JDvV%*D4w>zK0-zdBR`Kz39%G6~@KAf}cNpdS_y7Rpp|c z<)VY)d*)w9d92V^QvGt|o%?p%iK&y)bQkR}n!Hs>ZT^BegHFt3YE|riL*pgyHISPr zmDmOLFx>Fi+nJ{t^O^rXLyLQVEn}K5iOMO|`d) zYNCh1u^kKcRfa^e$I^KF6Je3Jx7*TzPg14BR5IMdS8nU&5v%SIWby3Gz)M3a-$qI^ zt#|F$eeAY+%w+?U{J3>qGg?nESu`tWh3>zV1*0?qs-t(%cv*DbB-Q-dp^L(oIcSMT zIPF~K(RPo~ztP$@o0qBZu>3#KMoVRpSMMiNSsvtf z*>4T}*1&HK{MNv44gA)?Zw>qpYQRSJGx2R%tYR+_bJ_ebiIgJ{u*t{Y>m8^)kQ8MA97(^$c?{E;qT&BaN+ML_}e!;Z{c^`_)RvRK^gd- z9+ipBp$_mpExxnH_v|P;%8Ih#dscjRiSGmP-825~j=#m@b1&)w-`}8~P=EMt1m9zz z{!m}2A3eBGC%SOqJ37>b4qTYVGK|TO{SUEW2=e-l{X~7^djfn1fjY-L)IaJ%fff^; z=s+I!AB_NYgF3?B+3+5Jzd{|MUQj>SPy9^)`;0omzM#HPN0^U!s3X(`>I>7TJJb{Q z4e^M@{$qbp2bd;(C3-@=p>Jaj zWQYF6lJDU=D)?Hm2e82mP%`LcEcwD)Nx|2aZOR6tKp8*}vE<7& z? z?+?g#|4?EM{ehDI1oORYP1+&v5QyIZv||RMv8@@z(}8?}4<#0CGd9>L@y#GU1C(qQ zY#6OPFhA5N@iKrCS$~M%2k}RM5^LxwOef+QLOd3r#EcCxm@|lv2=QIO637P;{ySSo zFn+MJMn4kb-vAf@px%gQ3GsNK+JSLkFo)r#jiyj`FKM-C(){zJsC1xjSIk$4&r4;Uyxy#X8XNg}>7 zvJzk;UP{D!rU^s*m53h=)egm035zJMqr`ItM!_6JGh(86SjVhsW3c&V zV~|R?6kTDxdYX7uvN}4>VV>&!?e@>L!;eZO5}p_seXi@w9Tza_{XM9SYjvEBetv_I6Mya16=4j798 zj1h}kiV-ZQK3yijaRnR^3x*$d1i&>YuR&pQIGTD53{43ZwIMeO&y$2=2k`B<9Il4_ z7I+$NfCDz$X8M488Xz!YQJa~WIU>L{k{2izMuhpZxIuh@e=vs|A`$U8A-J1>(D znq(4ggjhU7j!3jx&|?HyNOJ?4tY*HjXyH8}C6DIJY3ufiK~3xDuSV z5qt+xNMNu8hE^=$am0c0?DPAoz}^UhiGyc_W(51DWq?x>u&4tFB4IIr6^=EX?=KC4 zHNlRac7WXhv`Nomaf2n87O`-o2%sV5K$)OfQ!!SaE`}LS>NX}E8g`_{G}e?eK#lc4 z{>FRCWU1aGJxd~;A>hd)X_55pnn=Jz zOHpRjoB`5Chp4P!tf0@>I%u9N6bQx8!!Xz><#q3ydO-F~x@qD!WQTD=d2&?MRH=~& z5xB@UyAU?oAV3@MK^e`@#wNQ1Xj1}gxp{1pwE?y%(PY4KdMnTLs0Rxi1|A1q_(=Gi zFv{ZOu+dBaM4_c%MTf&_bLR9-Gf41F1}tm1go8YCB>1^eSpmAaiTM3i4KjS61rq}; z0gY2Elt@?-5obCqGl6g@gnf!H&q`^vfS8s7gKvJ6Y0UwemZH`>YKf2p@%%Wja&U#A zp`0-PFkBg^!#JBdvNfgUD3GcT4Nx&Pb($MC>QD~|Dy9(44bpdVqB6dfyorSrG`IYI zQ;$YS;aaqqktZDhliQ}T#uF&{IhiegPa@TjNA{mC01v#xX~uFJkLLhvyr)(j3Mo6t z;~2_rr_0;a8tVYtbO|g$_*~SC1hggqMOlmNNsB_l0hZ6@H#|bfF(7(1prI#WGlWO2 W<`f|l { + if (!clap) { throw new Error(`please provide a clap`) } + + // remember: a space needs to be public for the classic fetch() to work + const res = await fetch(`${aitubeApiUrl}generate/video`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + // TODO pass the JWT so that only the AI Stories Factory can call the API + // Authorization: `Bearer ${hfApiToken}`, + }, + body: await serializeClap(clap), + cache: "no-store", + // we can also use this (see https://vercel.com/blog/vercel-cache-api-nextjs-cache) + // next: { revalidate: 1 } + }) + + const blob = await res.blob() + + const dataURL = await blobToDataUri(blob) + + return dataURL +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/extendClap.ts b/packages/aitube-client/src/api/extendClap.ts new file mode 100644 index 00000000..21e733ed --- /dev/null +++ b/packages/aitube-client/src/api/extendClap.ts @@ -0,0 +1,24 @@ +import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/config" + +export async function extendClap({ + clap, +}: { + clap: ClapProject +}): Promise { + if (!clap) { throw new Error(`please provide a clap to extend`) } + + const extendedClap = await fetchClap(`${aitubeApiUrl}generate/storyboards`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + // TODO pass the JWT so that only the AI Stories Factory can call the API + // Authorization: `Bearer ${hfApiToken}`, + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + return extendedClap +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/generateClap.ts b/packages/aitube-client/src/api/generateClap.ts new file mode 100644 index 00000000..3fb53603 --- /dev/null +++ b/packages/aitube-client/src/api/generateClap.ts @@ -0,0 +1,32 @@ +import { ClapProject, fetchClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/config" + +export async function generateClap({ + prompt = "", +}: { + prompt: string +}): Promise { + if (!prompt) { throw new Error(`please provide a prompt`) } + + // AiTube Stories is nice, but we also need to leave some compute for AiTube Live and AiTube Gaming + const height = 1024 + const width = 512 + + const clap = await fetchClap(`${aitubeApiUrl}generate/story`, { + method: "POST", + headers: { + "Content-Type": "application/json", + // TODO pass the JWT so that only the AI Stories Factory can call the API + // Authorization: `Bearer ${hfApiToken}`, + }, + body: JSON.stringify({ + prompt, + width, + height + }), + cache: "no-store", + }) + + return clap +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts new file mode 100644 index 00000000..80e926fa --- /dev/null +++ b/packages/aitube-client/src/api/index.ts @@ -0,0 +1,3 @@ +export { exportClap } from "./exportClap" +export { extendClap } from "./extendClap" +export { generateClap } from "./generateClap" \ No newline at end of file diff --git a/packages/aitube-client/src/config.ts b/packages/aitube-client/src/config.ts new file mode 100644 index 00000000..c43322d2 --- /dev/null +++ b/packages/aitube-client/src/config.ts @@ -0,0 +1,3 @@ + +export const aitubeUrl = `${process.env.AI_TUBE_URL || "https://aitube.at" }` +export const aitubeApiUrl = aitubeUrl + (aitubeUrl.endsWith("/") ? "" : "/") + "api/" diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts new file mode 100644 index 00000000..d2c414e0 --- /dev/null +++ b/packages/aitube-client/src/index.ts @@ -0,0 +1 @@ +export { exportClap, extendClap, generateClap } from './api' diff --git a/packages/aitube-client/tsconfig.json b/packages/aitube-client/tsconfig.json new file mode 100644 index 00000000..ab7cc3ed --- /dev/null +++ b/packages/aitube-client/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/aitube-client/tsconfig.types.json b/packages/aitube-client/tsconfig.types.json new file mode 100644 index 00000000..a6a3f211 --- /dev/null +++ b/packages/aitube-client/tsconfig.types.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts" + ] +} From a17fd5d1ea9ee7760892b6393f4664a9fc6bbad6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 19:12:53 +0200 Subject: [PATCH 005/346] fix some bug --- packages/aitube-clap/README.md | 10 ++++++++++ packages/aitube-clap/package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index d81697aa..37a8ea59 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -51,6 +51,16 @@ bun install bun run build ``` +To publish: + +```bash +bun run build + +bun run build:declaration + +bun run publish +``` + ## Contributing We welcome contributions! Please feel free to submit a pull request. diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index d29eed2d..d517b549 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.3", + "version": "0.0.4", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", From 428a256ab1d1abebea28a16b7538c1d28bf1df14 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 19:13:23 +0200 Subject: [PATCH 006/346] 0.0.1 --- packages/aitube-client/README.md | 10 ++++++++++ packages/aitube-client/bun.lockb | Bin 17695 -> 17719 bytes packages/aitube-client/package.json | 9 +++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index 1ccb7cb6..f3ca02b9 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -41,6 +41,16 @@ bun install bun run build ``` +To publish: + +```bash +bun run build + +bun run build:declaration + +bun run publish +``` + ## Contributing We welcome contributions! Please feel free to submit a pull request. diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index a9204fc4125d767b4b5db057965904b6f1258dfd..797d946543bb3062508b6e8f8ba9085860c80a7f 100755 GIT binary patch delta 3338 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 diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index d9946307..cff15335 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -17,13 +17,14 @@ "bun-types": "latest", "prettier": "^3.2.5", "rimraf": "^5.0.5", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "@aitube/clap": "^0.0.4" }, "peerDependencies": { - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "@aitube/clap": "^0.0.4" }, "dependencies": { - "@aitube/clap": "^0.0.3", "uuid": "^9.0.1", "yaml": "^2.4.1" }, From 004d99aaae18e794bc59583db30ab49805999590 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 19:30:29 +0200 Subject: [PATCH 007/346] 0.0.5 --- packages/aitube-clap/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index d517b549..76dde975 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -39,6 +39,7 @@ "license": "MIT", "files": [ "dist/*.js", - "dist/*.d.ts" + "dist/*.d.ts", + "dist/**/*.d.ts" ] } From 73c748790693dcd5068ca67525335146fbabe7f8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 19:33:02 +0200 Subject: [PATCH 008/346] 0.0.2 --- packages/aitube-client/bun.lockb | Bin 17719 -> 17719 bytes packages/aitube-client/package.json | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 797d946543bb3062508b6e8f8ba9085860c80a7f..cc9befe29d8859a46daef1c76da3f806181e5fd9 100755 GIT binary patch delta 159 zcmV;Q0AT;OiUGHZ0gx^r*>XS8m2_Nm1I`-IJ`E1*J1!se_Ax&bA#?>s`h^rwu}*3Z zlXwIulW+qBv*ZqG5+Z;!k)`tWQb4fXiTJ5jmL>a*z;u&f0~eE^0|c|EA%_nEHIpzgGXXWTWHB}q N1vM^oXL^$nBADraLGSsVGup29t-ZAyA>E5`-2$u}*3Z zlQ;z^lW+qBv*ZqG5 Date: Fri, 26 Apr 2024 20:13:08 +0200 Subject: [PATCH 009/346] 0.0.6 --- packages/aitube-clap/bun.lockb | Bin 17257 -> 17263 bytes packages/aitube-clap/package.json | 4 ++-- packages/aitube-clap/src/factories/newClap.ts | 6 ++---- .../aitube-clap/src/factories/newModel.ts | 5 ++--- .../aitube-clap/src/factories/newSegment.ts | 5 ++--- packages/aitube-clap/src/index.ts | 2 +- packages/aitube-clap/src/io/parseClap.ts | 4 ++-- packages/aitube-clap/src/io/serializeClap.ts | 4 ++-- packages/aitube-clap/src/utils/index.ts | 1 + packages/aitube-clap/src/utils/uuid.ts | 5 +++++ 10 files changed, 19 insertions(+), 17 deletions(-) create mode 100644 packages/aitube-clap/src/utils/uuid.ts diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index 07f5736af420e25e68c42c6429bf3c641f3af9dd..41b0eb78be94eb1d3ac3d8c88d27853161d1ae3f 100755 GIT binary patch delta 1557 zcmZ`(YfPI}7(S<^mk$^NEG!>|VMjE|rS$8Cb~yQ*AtY15Z9ho6iE>$mN;en`otKT8 z$S}(0+^d5I1cA&r!V(dQKQQW;bJ1xwiOYglOeAgt*+?`hbJ6FtlwbPieZKek-upT4 zxq66SKg5q(En^#B+QYN@-uF&4UddbRDoQJ@eQ^2awDB{gxc%oH-pU_eeRy+wE@Mn$ zER+b02et%ux70k&Sbeam78E1J?le#zp-~fg(?)E`sf$6c9)rIt5}Ka0n<8UIH)hxIP+S4k#S|C(vq~n17Zr zT2L&`P822zDna!kt|NkG7J8~7P}hJ?1Fio3e&AXB5FPc8RGoPm&y`^54k^c{hb2U!)nxYb5Jb zzJYu?RjR_|grh_jom+YfS{XDA{iJpCWs>zOFCib~>lD_j(q+t3SR2Wrck^D74XQMY zQEdXJ7e3OR7@*K}kqEUk1B*|e1Jy`wX>di0y?cYe=Ap{;(%0w?m4<$x!#Q<4dweNpGBG_D4&o}sE{}#ks#rZVW%KZzbkioA zW4rTl#vS^}$Es&xV7EG~MU3sELd9W@?P5prBf;Pcye|?!v03fx934>dq>H$F8A#Ag zV~Wfd=)5AEWBb=Xa%?_5ZMp+K9;wb(*nA~^X+F2i z6sO_OfH8rItz<>v)R6r78543kQIn0a6uMxSc`0pkq_2m%@<@bs@V;-${upSE6lb$4 zj15tiLpI0WjL|0Lz2IV9KmI$SfkX(IAE!oG#a@oDydxL4{5CMB;RhA8=w$2?4dDNO zjv$gH(kRcQUttw{Pkf&iZNK)wUkk{EF^Zyx$l?@5i=jkc6&BihF!;fDW8xz_Q^ rBo%Fwn%i3Z1#NACUBrvc)K-*6ogTBi$`%$Bu6`Hbf{mXpdOPu7?I3~e delta 1543 zcmZ`(e@v8h7=OP9ckpruR&ckM6YM(K)a1Q;@3`a4;w^QgsFiJ!=TJl-IXQj|Fmo+9 zE6q(R;ED7)0*Z=aZfWP{A6f=%wTTO%HamX|T!O@wvY7K-jlzZ=I5}dfA%Gg|*eI4mB39t6y};_G{MNXvdR}weH^S zuN3f?ivJWr2sZj_8_S;+gq?x<9h~381i=Wt)?epuC~s;Sf-XX@o5K#BAf!XT4om}9 z&GD@Xf-oO?BXAzDCNUmY2;_B4`WUtbjUZ4wH~_*7><03JW8gWq8{!Ejfjsbk68)P; zi#I378`AP@LSwukFS_S>^I~Wbf_tj{71cPYzp3i^D&QFy_=!5{W47>~58=zt8wT>Q zY>Kjl$(CE|*PhSK8U0jugt4U*N>Ig}2z9_gq^tS@)=yHR%4Wz1X`>M2OB99tfh4`k z7LZS`iqBwV55*#^i0GpzEVoHAsLV?~$TuitP{nZ!kb5PQ)lk5?NJ>)0iRlDOqgdiP&xX)Mv_q#S7BD1OXL~YJ_>>R5u6j8 zj-Nox!bhCb(Aj!uMR6OnUT73pQPn=%xcJ;_N?_as|*7C}O4Q&_Ry)-j%!dCKfm#3?3!2HV)`A@ce z_UhKf&9<7s=azgs)l{^uwB3C2SfuLSa9Sq5iJ)ieo)Un1_M zZOEiRuiHu@+pSZK+7lARuW?*-9{i48vsExDGHW}PYSL0_7e~joEtefM?C`Qp^ru6z zXnXTTR<7Yx+4d^R111wp4efJE?t{?yTj9iOldzbBm?$w19~^n}eZ(wI|Xg|yLS%7HrfKm@n2?n_0#^)|$sbI6Jy zbW^rVvS{zc(R$@X;8sNs?5=nsoa=> zVpU=XWhS}_FYPVyed&4nr{dp#MlFnyH{DIveBLx4O8i9;f={&sPG3GAISQ|Wct>8U z&v&si)SthBb) { const model: ClapModel = { - id: typeof maybeModel?.id === "string" ? maybeModel.id : uuidv4(), + id: typeof maybeModel?.id === "string" ? maybeModel.id : UUID(), category: typeof maybeModel?.category === "string" ? (maybeModel.category as ClapSegmentCategory) : "character", triggerName: typeof maybeModel?.triggerName === "string" ? maybeModel.triggerName : "", label: typeof maybeModel?.label === "string" ? maybeModel.label : "", diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts index 50ba4192..e7657017 100644 --- a/packages/aitube-clap/src/factories/newSegment.ts +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -1,8 +1,7 @@ -import { v4 as uuidv4 } from "uuid" - import { ClapSegment } from "@/types" import { isValidNumber } from "@/utils/isValidNumber" import { generateSeed } from "@/utils/generateSeed" +import { UUID } from "@/utils/uuid" export function newSegment(maybeSegment?: Partial) { @@ -22,7 +21,7 @@ export function newSegment(maybeSegment?: Partial) { : (startTimeInMs + assetDurationInMs) const segment: ClapSegment = { - id: typeof maybeSegment?.id === "string" ? maybeSegment.id : uuidv4(), + id: typeof maybeSegment?.id === "string" ? maybeSegment.id : UUID(), track: isValidNumber(maybeSegment?.track) ? (maybeSegment?.track || 0) : 0, startTimeInMs, endTimeInMs, diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 7a025f4a..31d5a76f 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -20,6 +20,6 @@ export { } from './types' export { newClap, newModel, newSegment } from './factories' export { parseClap, serializeClap, fetchClap } from './io' -export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber } from './utils' +export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber, UUID } from './utils' export { blobToDataUri, dataUriToBlob, clapToDataUri } from './converters' export { generateClapFromSimpleStory, getEmptyClap } from './helpers' diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index 827a120d..734b5e24 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -1,9 +1,9 @@ import YAML from "yaml" -import { v4 as uuidv4 } from "uuid" import { ClapHeader, ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "../types" import { getValidNumber } from "../utils/getValidNumber" import { dataUriToBlob } from "../converters/dataUriToBlob" +import { UUID } from "@/utils/uuid" type StringOrBlob = string | Blob @@ -155,7 +155,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false const maybeClapMeta = maybeArray[1] as ClapMeta const clapMeta: ClapMeta = { - id: typeof maybeClapMeta.title === "string" ? maybeClapMeta.id : uuidv4(), + id: typeof maybeClapMeta.title === "string" ? maybeClapMeta.id : UUID(), title: typeof maybeClapMeta.title === "string" ? maybeClapMeta.title : "", description: typeof maybeClapMeta.description === "string" ? maybeClapMeta.description : "", synopsis: typeof maybeClapMeta.synopsis === "string" ? maybeClapMeta.synopsis : "", diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index f87017d4..40608455 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -1,9 +1,9 @@ import YAML from "yaml" -import { v4 as uuidv4 } from "uuid" import { getValidNumber } from "@/utils/getValidNumber" import { ClapHeader, ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "../types" +import { UUID } from "@/utils/uuid" export async function serializeClap({ meta, // ClapMeta @@ -130,7 +130,7 @@ export async function serializeClap({ } const clapMeta: ClapMeta = { - id: meta.id || uuidv4(), + id: meta.id || UUID(), title: typeof meta.title === "string" ? meta.title : "Untitled", description: typeof meta.description === "string" ? meta.description : "", synopsis: typeof meta.synopsis === "string" ? meta.synopsis : "", diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index c38dffe8..cf0ada55 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -2,3 +2,4 @@ export { generateSeed } from './generateSeed' export { getClapAssetSourceType } from './getClapAssetSourceType' export { getValidNumber } from './getValidNumber' export { isValidNumber } from './isValidNumber' +export { UUID } from './uuid' \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/uuid.ts b/packages/aitube-clap/src/utils/uuid.ts new file mode 100644 index 00000000..b2452e0e --- /dev/null +++ b/packages/aitube-clap/src/utils/uuid.ts @@ -0,0 +1,5 @@ +import PureUUID from "pure-uuid" + +export function UUID() { + return new PureUUID(4).format() +} \ No newline at end of file From 193b85410e81f356922f08a4e95c022f72f48143 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Apr 2024 20:15:00 +0200 Subject: [PATCH 010/346] 0.0.3 --- packages/aitube-client/bun.lockb | Bin 17719 -> 18050 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index cc9befe29d8859a46daef1c76da3f806181e5fd9..8be2fff77a4d2124a9cb3be115b3195fff72cc81 100755 GIT binary patch delta 681 zcmdnq#n{x#I6+Ty)oX9}X=-2CUoC$g|3tTHRqloW-3O2E#dJzvQ%ksKkna zp@9*od2#`#!R9A?IgE@}n{V=!GqM6D7#KG16`a6d@A1p_qCmREgk{SgygDzLYVut3 z{sC!OomUgsZU{XO?0WVpqTuM2#8pYUI~&y9-fr}WsNYld<5HK7PM^=cvS|+&0L^D) z_{aYbNb7;!2_aZ)de~$A&Zh4F;3FeaZ!oE+-*W38!xtuev-jz^?Do~E=aM@ZDfB@= zGDk%A{6@;S@VKL6c7-y(wG5MdN++-s|DXstuh}H=flk`L;OPS|!9e|3wa@{=1 toP(FoOs^!ps-UzeRkyS>Gi7q3y|g@>r?0CIXX^ru)iVSso-C*|0{}kxwqyVR delta 465 zcmZqbW!&DyI6+VIW|95HsUuhHW&i+oOm<=b diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 2cd5c16e..8a035645 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,11 +18,11 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "^0.0.5" + "@aitube/clap": "^0.0.6" }, "peerDependencies": { "typescript": "^5.4.5", - "@aitube/clap": "^0.0.5" + "@aitube/clap": "^0.0.6" }, "dependencies": { "uuid": "^9.0.1", From 5563f7a8cc4aefab3d928cb980c09daf3e746d47 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 27 Apr 2024 13:00:19 +0200 Subject: [PATCH 011/346] release 0.0.4: fix aitube api url --- packages/aitube-client/README.md | 27 +++++++++++- packages/aitube-client/package.json | 2 +- .../api/{generateClap.ts => createClap.ts} | 22 ++++++---- .../api/{extendClap.ts => editClapModels.ts} | 16 +++++--- .../src/api/editClapStoryboards.ts | 30 ++++++++++++++ packages/aitube-client/src/api/exportClap.ts | 31 -------------- .../src/api/exportClapToVideo.ts | 41 +++++++++++++++++++ packages/aitube-client/src/api/index.ts | 7 ++-- packages/aitube-client/src/config.ts | 22 +++++++++- packages/aitube-client/src/index.ts | 4 +- 10 files changed, 150 insertions(+), 52 deletions(-) rename packages/aitube-client/src/api/{generateClap.ts => createClap.ts} (51%) rename packages/aitube-client/src/api/{extendClap.ts => editClapModels.ts} (57%) create mode 100644 packages/aitube-client/src/api/editClapStoryboards.ts delete mode 100644 packages/aitube-client/src/api/exportClap.ts create mode 100644 packages/aitube-client/src/api/exportClapToVideo.ts diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index f3ca02b9..14385e1c 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -5,10 +5,16 @@ ## ATTENTION AiTube is currently in heavy development, and for the moment -the API client is reserved for private use. +the API client is reserved for *private use* (it is used by AI Stories Factory). We are sorry for any inconvenience this might cause. +## Caveats + +The official domain for AiTube is `aitube.at`, however right now +the Hugging Face Space is not configured to use this as a domain, +so we need to perform all API calls to `jbilcke-hf-ai-tube.hf.space`. + ## Installation To install the package, run the following command: @@ -27,6 +33,25 @@ import { parseClap, serializeClap } from '@aitube/client'; UNDOCUMENTED API */ + +const storyOnly = await createClap({ + prompt: "story about a dog", + token: "ultra secret token unavailable to common mortals" +}) + +const storyWithStoryboards = await editClapStoryboards(clap) + +const mp4VideoFile = await exportClapToVideos(storyWithStoryboards) +``` + +## Customizing the server + +The hostname can be overriden by defining the `AITUBE_HOSTNAME` environment variable. + +eg: + +```bash +AITUBE_HOSTNAME=http://localhost:3000 ``` ## Build Instructions diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 8a035645..c39b7e70 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.3", + "version": "0.0.4", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/generateClap.ts b/packages/aitube-client/src/api/createClap.ts similarity index 51% rename from packages/aitube-client/src/api/generateClap.ts rename to packages/aitube-client/src/api/createClap.ts index 3fb53603..8c2724ef 100644 --- a/packages/aitube-client/src/api/generateClap.ts +++ b/packages/aitube-client/src/api/createClap.ts @@ -2,23 +2,29 @@ import { ClapProject, fetchClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" -export async function generateClap({ - prompt = "", +export async function createClap({ + prompt, + height = 512, + width = 288, + token, }: { prompt: string + height?: number + width?: number + token?: string }): Promise { - if (!prompt) { throw new Error(`please provide a prompt`) } + + if (typeof prompt !== "string" || !prompt.length) { throw new Error(`please provide a prompt`) } - // AiTube Stories is nice, but we also need to leave some compute for AiTube Live and AiTube Gaming - const height = 1024 - const width = 512 + const hasToken = typeof token === "string" && token.length > 0 const clap = await fetchClap(`${aitubeApiUrl}generate/story`, { method: "POST", headers: { "Content-Type": "application/json", - // TODO pass the JWT so that only the AI Stories Factory can call the API - // Authorization: `Bearer ${hfApiToken}`, + ...hasToken && { + "Authorization": `Bearer ${token}` + } }, body: JSON.stringify({ prompt, diff --git a/packages/aitube-client/src/api/extendClap.ts b/packages/aitube-client/src/api/editClapModels.ts similarity index 57% rename from packages/aitube-client/src/api/extendClap.ts rename to packages/aitube-client/src/api/editClapModels.ts index 21e733ed..d3572ae8 100644 --- a/packages/aitube-client/src/api/extendClap.ts +++ b/packages/aitube-client/src/api/editClapModels.ts @@ -2,23 +2,29 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" -export async function extendClap({ +export async function editClapModels({ clap, + token, }: { clap: ClapProject + token?: string }): Promise { + if (!clap) { throw new Error(`please provide a clap to extend`) } + + const hasToken = typeof token === "string" && token.length > 0 - const extendedClap = await fetchClap(`${aitubeApiUrl}generate/storyboards`, { + const newClap = await fetchClap(`${aitubeApiUrl}edit/models`, { method: "POST", headers: { "Content-Type": "application/x-gzip", - // TODO pass the JWT so that only the AI Stories Factory can call the API - // Authorization: `Bearer ${hfApiToken}`, + ...hasToken && { + "Authorization": `Bearer ${token}` + } }, body: await serializeClap(clap), cache: "no-store", }) - return extendedClap + return newClap } \ No newline at end of file diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts new file mode 100644 index 00000000..513678b6 --- /dev/null +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -0,0 +1,30 @@ +import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/config" + +export async function editClapStoryboards({ + clap, + token, +}: { + clap: ClapProject + token?: string +}): Promise { + + if (!clap) { throw new Error(`please provide a clap to extend`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const newClap = await fetchClap(`${aitubeApiUrl}edit/storyboards`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + return newClap +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/exportClap.ts b/packages/aitube-client/src/api/exportClap.ts deleted file mode 100644 index 6acdb0ff..00000000 --- a/packages/aitube-client/src/api/exportClap.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ClapProject, serializeClap, blobToDataUri } from "@aitube/clap" - -import { aitubeApiUrl } from "@/config" - -export async function exportClap({ - clap, -}: { - clap: ClapProject -}): Promise { - if (!clap) { throw new Error(`please provide a clap`) } - - // remember: a space needs to be public for the classic fetch() to work - const res = await fetch(`${aitubeApiUrl}generate/video`, { - method: "POST", - headers: { - "Content-Type": "application/x-gzip", - // TODO pass the JWT so that only the AI Stories Factory can call the API - // Authorization: `Bearer ${hfApiToken}`, - }, - body: await serializeClap(clap), - cache: "no-store", - // we can also use this (see https://vercel.com/blog/vercel-cache-api-nextjs-cache) - // next: { revalidate: 1 } - }) - - const blob = await res.blob() - - const dataURL = await blobToDataUri(blob) - - return dataURL -} \ No newline at end of file diff --git a/packages/aitube-client/src/api/exportClapToVideo.ts b/packages/aitube-client/src/api/exportClapToVideo.ts new file mode 100644 index 00000000..afd7f619 --- /dev/null +++ b/packages/aitube-client/src/api/exportClapToVideo.ts @@ -0,0 +1,41 @@ +import { ClapProject, serializeClap, blobToDataUri } from "@aitube/clap" + +import { aitubeApiUrl } from "@/config" + +export type SupportedExportFormat = "mp4" | "webm" +export const defaultExportFormat = "mp4" + +export async function exportClapToVideo({ + clap, + format = defaultExportFormat, + token, +}: { + clap: ClapProject + format?: SupportedExportFormat + token?: string +}): Promise { + + if (!clap) { throw new Error(`please provide a clap`) } + + if (format !== "mp4" && format !== "webm") { throw new Error(`please provide a valid format ("${format}" is unrecognized)`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const res = await fetch(`${aitubeApiUrl}export?f=${format}`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + const blob = await res.blob() + + const dataURL = await blobToDataUri(blob) + + return dataURL +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index 80e926fa..df778603 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -1,3 +1,4 @@ -export { exportClap } from "./exportClap" -export { extendClap } from "./extendClap" -export { generateClap } from "./generateClap" \ No newline at end of file +export { exportClapToVideo } from "./exportClapToVideo" +export { editClapStoryboards } from "./editClapStoryboards" +export { editClapModels } from "./editClapModels" +export { createClap } from "./createClap" \ No newline at end of file diff --git a/packages/aitube-client/src/config.ts b/packages/aitube-client/src/config.ts index c43322d2..d8953f5e 100644 --- a/packages/aitube-client/src/config.ts +++ b/packages/aitube-client/src/config.ts @@ -1,3 +1,21 @@ -export const aitubeUrl = `${process.env.AI_TUBE_URL || "https://aitube.at" }` -export const aitubeApiUrl = aitubeUrl + (aitubeUrl.endsWith("/") ? "" : "/") + "api/" +// unfortunately, this doesn't work yet due to a redirection issue +// const defaultAitubeHostname = "aitube.at" + +// so we have to use the direct space hostname instead +export const defaultAitubeHostname = "jbilcke-hf-ai-tube.hf.space" + +// we leave the opportunity to override this at runtime +export const aitubeUrl = `${ + process.env.AITUBE_HOSTNAME || + `https://${defaultAitubeHostname}` +}` + +// note: let's keep it simple and only support one version at a time +export const aitubeApiVersion = "v1" + +export const aitubeApiUrl = `${ + aitubeUrl +}${ + aitubeUrl.endsWith("/") ? "" : "/" +}api/${aitubeApiVersion}/` diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index d2c414e0..65ce263d 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -1 +1,3 @@ -export { exportClap, extendClap, generateClap } from './api' + +export { exportClapToVideo, editClapStoryboards, editClapModels, createClap } from './api' +export { defaultAitubeHostname, aitubeUrl, aitubeApiVersion, aitubeApiUrl } from './config' From c85d498ab57176a87479ebe7055aec65d501a523 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 27 Apr 2024 13:04:06 +0200 Subject: [PATCH 012/346] fix documentation --- packages/aitube-client/README.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index 14385e1c..be041830 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -26,22 +26,25 @@ npm install @aitube/client ## Getting Started ```typescript -import { parseClap, serializeClap } from '@aitube/client'; +import {createClap, editClapStoryboards, exportClapToVideo } from '@aitube/client'; -/* +const ultraSecret = "ultra secret token unavailable to common mortals" - UNDOCUMENTED API - -*/ - -const storyOnly = await createClap({ +const basicClap = await createClap({ prompt: "story about a dog", - token: "ultra secret token unavailable to common mortals" + token: ultraSecret }) -const storyWithStoryboards = await editClapStoryboards(clap) +const illustratedClap = await editClapStoryboards({ + clap: basicClap, + token: ultraSecret +}) -const mp4VideoFile = await exportClapToVideos(storyWithStoryboards) +const mp4VideoFile = await exportClapToVideo({ + clap: illustratedClap, + format: "mp4", + token: ultraSecret +}) ``` ## Customizing the server From a10aff7bedade68c4f0601d1e883a9ff773436bc Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 27 Apr 2024 18:29:21 +0200 Subject: [PATCH 013/346] fix incorrect route --- packages/aitube-client/README.md | 2 +- packages/aitube-client/package.json | 2 +- packages/aitube-client/src/api/createClap.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index be041830..b0413930 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -26,7 +26,7 @@ npm install @aitube/client ## Getting Started ```typescript -import {createClap, editClapStoryboards, exportClapToVideo } from '@aitube/client'; +import { createClap, editClapStoryboards, exportClapToVideo } from '@aitube/client'; const ultraSecret = "ultra secret token unavailable to common mortals" diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index c39b7e70..824ecd28 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/createClap.ts b/packages/aitube-client/src/api/createClap.ts index 8c2724ef..c1d306bb 100644 --- a/packages/aitube-client/src/api/createClap.ts +++ b/packages/aitube-client/src/api/createClap.ts @@ -18,7 +18,7 @@ export async function createClap({ const hasToken = typeof token === "string" && token.length > 0 - const clap = await fetchClap(`${aitubeApiUrl}generate/story`, { + const clap = await fetchClap(`${aitubeApiUrl}create`, { method: "POST", headers: { "Content-Type": "application/json", From d463125fd2a44010b545b56924bc3a7be9d752d1 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Apr 2024 12:56:05 +0200 Subject: [PATCH 014/346] rename model to entity --- packages/aitube-clap/README.md | 2 +- packages/aitube-clap/src/factories/index.ts | 2 +- packages/aitube-clap/src/factories/newClap.ts | 10 ++- .../aitube-clap/src/factories/newEntity.ts | 38 ++++++++ .../aitube-clap/src/factories/newModel.ts | 37 -------- .../aitube-clap/src/factories/newSegment.ts | 3 +- .../src/helpers/buildEntityIndex.ts | 9 ++ .../helpers/generateClapFromSimpleStory.ts | 2 +- packages/aitube-clap/src/helpers/index.ts | 1 + packages/aitube-clap/src/index.ts | 16 ++-- packages/aitube-clap/src/io/parseClap.ts | 86 +++++++++++-------- packages/aitube-clap/src/io/serializeClap.ts | 16 ++-- packages/aitube-clap/src/types.ts | 76 +++++++++++----- 13 files changed, 177 insertions(+), 121 deletions(-) create mode 100644 packages/aitube-clap/src/factories/newEntity.ts delete mode 100644 packages/aitube-clap/src/factories/newModel.ts create mode 100644 packages/aitube-clap/src/helpers/buildEntityIndex.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 37a8ea59..3591cfbf 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -24,7 +24,7 @@ npm install @aitube/clap import { parseClap, serializeClap } from '@aitube/clap'; // fetch a Clap file -const res = await fetch("< some .clap file hosted from somewhere >") +const res = await fetch("https://..../file.clap") const file = await res.blob() // open the Clap file diff --git a/packages/aitube-clap/src/factories/index.ts b/packages/aitube-clap/src/factories/index.ts index 9aaa7c94..5b0085f8 100644 --- a/packages/aitube-clap/src/factories/index.ts +++ b/packages/aitube-clap/src/factories/index.ts @@ -1,3 +1,3 @@ export { newClap } from './newClap' -export { newModel } from './newModel' +export { newEntity } from './newEntity' export { newSegment } from './newSegment' diff --git a/packages/aitube-clap/src/factories/newClap.ts b/packages/aitube-clap/src/factories/newClap.ts index 718ae2dc..40235748 100644 --- a/packages/aitube-clap/src/factories/newClap.ts +++ b/packages/aitube-clap/src/factories/newClap.ts @@ -1,11 +1,12 @@ -import { ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "@/types" +import { ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" import { getValidNumber } from "@/utils/getValidNumber" import { UUID } from "@/utils/uuid" +import { buildEntityIndex } from "@/helpers/buildEntityIndex" // generate an empty clap file, or copy one from a source export function newClap(clap: { meta?: Partial - models?: ClapModel[] + entities?: ClapEntity[] scenes?: ClapScene[] segments?: ClapSegment[] } = {}): ClapProject { @@ -27,9 +28,10 @@ export function newClap(clap: { isInteractive: typeof clap?.meta?.isInteractive === "boolean" ? clap.meta.isInteractive : false, } - const models: ClapModel[] = clap?.models && Array.isArray(clap.models) ? clap.models : [] + const entities: ClapEntity[] = clap?.entities && Array.isArray(clap.entities) ? clap.entities : [] const scenes: ClapScene[] = clap?.scenes && Array.isArray(clap.scenes) ? clap.scenes : [] const segments: ClapSegment[] = clap?.segments && Array.isArray(clap.segments) ? clap.segments : [] + const entityIndex = buildEntityIndex(entities) - return { meta, models, scenes, segments } + return { meta, entities, entityIndex, scenes, segments } } diff --git a/packages/aitube-clap/src/factories/newEntity.ts b/packages/aitube-clap/src/factories/newEntity.ts new file mode 100644 index 00000000..d103e412 --- /dev/null +++ b/packages/aitube-clap/src/factories/newEntity.ts @@ -0,0 +1,38 @@ +import { ClapAssetSource, ClapEntity, ClapEntityAppearance, ClapEntityAudioEngine, ClapEntityGender, ClapEntityRegion, ClapSegmentCategory } from "@/types" +import { generateSeed } from "@/utils/generateSeed" +import { isValidNumber } from "@/utils/isValidNumber" +import { UUID } from "@/utils/uuid" + +export function newEntity(maybeEntity?: Partial) { + + const entity: ClapEntity = { + id: typeof maybeEntity?.id === "string" ? maybeEntity.id : UUID(), + category: typeof maybeEntity?.category === "string" ? (maybeEntity.category as ClapSegmentCategory) : "character", + triggerName: typeof maybeEntity?.triggerName === "string" ? maybeEntity.triggerName : "", + label: typeof maybeEntity?.label === "string" ? maybeEntity.label : "", + description: typeof maybeEntity?.description === "string" ? maybeEntity.description : "", + author: typeof maybeEntity?.author === "string" ? maybeEntity.author : "", + thumbnailUrl: typeof maybeEntity?.thumbnailUrl === "string" ? maybeEntity.thumbnailUrl : "", + seed: isValidNumber(maybeEntity?.seed) ? (maybeEntity?.seed || 0) : generateSeed(), + + imagePrompt: typeof maybeEntity?.imagePrompt === "string" ? maybeEntity.imagePrompt : "", + imageSourceType: typeof maybeEntity?.imageSourceType === "string" ? (maybeEntity.imageSourceType as ClapAssetSource) : "EMPTY", + imageEngine: typeof maybeEntity?.imageEngine === "string" ? maybeEntity.imageEngine : "", + imageId: typeof maybeEntity?.imageId === "string" ? maybeEntity.imageId : "", + audioPrompt: typeof maybeEntity?.audioPrompt === "string" ? maybeEntity.audioPrompt : "", + audioSourceType: typeof maybeEntity?.audioSourceType === "string" ? (maybeEntity.audioSourceType as ClapAssetSource) : "EMPTY", + audioEngine: typeof maybeEntity?.audioEngine === "string" ? (maybeEntity.audioEngine as ClapEntityAudioEngine) : "Parler-TTS", + audioId: typeof maybeEntity?.audioId === "string" ? maybeEntity.audioId : "", + + // those are only used by certain types of entities + age: isValidNumber(maybeEntity?.age) ? (maybeEntity?.age || 0) : 25, + + // TODO find a way to validate those, using lists + // TODO: we are going to use `variant: ClapEntityVariant` instead, which is gonna be an arbitrary string + gender: typeof maybeEntity?.gender === "string" ? (maybeEntity.gender as ClapEntityGender) : "object", + region: typeof maybeEntity?.region === "string" ? (maybeEntity.region as ClapEntityRegion) : "global", + appearance: typeof maybeEntity?.appearance === "string" ? (maybeEntity.appearance as ClapEntityAppearance) : "neutral", + } + + return entity +} diff --git a/packages/aitube-clap/src/factories/newModel.ts b/packages/aitube-clap/src/factories/newModel.ts deleted file mode 100644 index 3675f451..00000000 --- a/packages/aitube-clap/src/factories/newModel.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ClapAssetSource, ClapModel, ClapModelAppearance, ClapModelAudioEngine, ClapModelGender, ClapModelRegion, ClapSegmentCategory } from "@/types" -import { generateSeed } from "@/utils/generateSeed" -import { isValidNumber } from "@/utils/isValidNumber" -import { UUID } from "@/utils/uuid" - -export function newModel(maybeModel?: Partial) { - - const model: ClapModel = { - id: typeof maybeModel?.id === "string" ? maybeModel.id : UUID(), - category: typeof maybeModel?.category === "string" ? (maybeModel.category as ClapSegmentCategory) : "character", - triggerName: typeof maybeModel?.triggerName === "string" ? maybeModel.triggerName : "", - label: typeof maybeModel?.label === "string" ? maybeModel.label : "", - description: typeof maybeModel?.description === "string" ? maybeModel.description : "", - author: typeof maybeModel?.author === "string" ? maybeModel.author : "", - thumbnailUrl: typeof maybeModel?.thumbnailUrl === "string" ? maybeModel.thumbnailUrl : "", - seed: isValidNumber(maybeModel?.seed) ? (maybeModel?.seed || 0) : generateSeed(), - - imagePrompt: typeof maybeModel?.imagePrompt === "string" ? maybeModel.imagePrompt : "", - imageSourceType: typeof maybeModel?.imageSourceType === "string" ? (maybeModel.imageSourceType as ClapAssetSource) : "EMPTY", - imageEngine: typeof maybeModel?.imageEngine === "string" ? maybeModel.imageEngine : "", - imageId: typeof maybeModel?.imageId === "string" ? maybeModel.imageId : "", - audioPrompt: typeof maybeModel?.audioPrompt === "string" ? maybeModel.audioPrompt : "", - audioSourceType: typeof maybeModel?.audioSourceType === "string" ? (maybeModel.audioSourceType as ClapAssetSource) : "EMPTY", - audioEngine: typeof maybeModel?.audioEngine === "string" ? (maybeModel.audioEngine as ClapModelAudioEngine) : "Parler-TTS", - audioId: typeof maybeModel?.audioId === "string" ? maybeModel.audioId : "", - - // those are only used by certain types of models - age: isValidNumber(maybeModel?.age) ? (maybeModel?.age || 0) : 25, - - // TODO find a way to validate those, using lists - gender: typeof maybeModel?.gender === "string" ? (maybeModel.gender as ClapModelGender) : "object", - region: typeof maybeModel?.region === "string" ? (maybeModel.region as ClapModelRegion) : "global", - appearance: typeof maybeModel?.appearance === "string" ? (maybeModel.appearance as ClapModelAppearance) : "neutral", - } - - return model -} diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts index e7657017..ff74f0e3 100644 --- a/packages/aitube-clap/src/factories/newSegment.ts +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -26,7 +26,7 @@ export function newSegment(maybeSegment?: Partial) { startTimeInMs, endTimeInMs, category: typeof maybeSegment?.category === "string" ? maybeSegment.category : "generic", - modelId: typeof maybeSegment?.modelId === "string" ? maybeSegment.modelId : "", + entityId: typeof maybeSegment?.entityId === "string" ? maybeSegment.entityId : "", sceneId: typeof maybeSegment?.sceneId === "string" ? maybeSegment.sceneId : "", prompt: typeof maybeSegment?.prompt === "string" ? maybeSegment.prompt : "", label: typeof maybeSegment?.label === "string" ? maybeSegment.label : "", @@ -35,6 +35,7 @@ export function newSegment(maybeSegment?: Partial) { status: typeof maybeSegment?.status === "string" ? maybeSegment.status : "to_generate", assetUrl: typeof maybeSegment?.assetUrl === "string" ? maybeSegment.assetUrl : "", assetDurationInMs, + assetSourceType: typeof maybeSegment?.assetSourceType === "string" ? maybeSegment.assetSourceType : "EMPTY", createdBy: typeof maybeSegment?.createdBy === "string" ? maybeSegment.createdBy : "ai", editedBy: typeof maybeSegment?.editedBy === "string" ? maybeSegment.editedBy : "ai", outputGain: isValidNumber(maybeSegment?.outputGain) ? (maybeSegment?.outputGain || 0) : 0, diff --git a/packages/aitube-clap/src/helpers/buildEntityIndex.ts b/packages/aitube-clap/src/helpers/buildEntityIndex.ts new file mode 100644 index 00000000..c0bee792 --- /dev/null +++ b/packages/aitube-clap/src/helpers/buildEntityIndex.ts @@ -0,0 +1,9 @@ +import { ClapEntity } from "@/types" + +export function buildEntityIndex(entities: ClapEntity[] = []): Record { + const index: Record = {} + for (const entity of entities) { + index[entity.id] = entity + } + return index +} \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts index 3ab010fd..c92d161b 100644 --- a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts +++ b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts @@ -61,7 +61,7 @@ export function generateClapFromSimpleStory({ startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, category: "interface", - // modelId: string + // entityId: string // sceneId: string prompt: "a hello world", label: "hello world", diff --git a/packages/aitube-clap/src/helpers/index.ts b/packages/aitube-clap/src/helpers/index.ts index b4dc6ad9..02d819aa 100644 --- a/packages/aitube-clap/src/helpers/index.ts +++ b/packages/aitube-clap/src/helpers/index.ts @@ -1,2 +1,3 @@ export { getEmptyClap } from './getEmptyClap' export { generateClapFromSimpleStory } from './generateClapFromSimpleStory' +export { buildEntityIndex } from './buildEntityIndex' diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 31d5a76f..43ef4927 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -4,22 +4,22 @@ export { ClapSegmentStatus, ClapAuthor, ClapAssetSource, - ClapModelGender, - ClapModelAppearance, - ClapModelRegion, - ClapModelTimbre, - ClapModelAudioEngine, + ClapEntityGender, + ClapEntityAppearance, + ClapEntityRegion, + ClapEntityTimbre, + ClapEntityAudioEngine, ClapVoice, ClapHeader, ClapMeta, ClapSceneEvent, ClapScene, ClapSegment, - ClapModel, + ClapEntity, ClapProject, } from './types' -export { newClap, newModel, newSegment } from './factories' +export { newClap, newEntity, newSegment } from './factories' export { parseClap, serializeClap, fetchClap } from './io' export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber, UUID } from './utils' export { blobToDataUri, dataUriToBlob, clapToDataUri } from './converters' -export { generateClapFromSimpleStory, getEmptyClap } from './helpers' +export { generateClapFromSimpleStory, getEmptyClap, buildEntityIndex } from './helpers' diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index 734b5e24..ca944b8a 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -1,9 +1,10 @@ import YAML from "yaml" -import { ClapHeader, ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "../types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "../types" import { getValidNumber } from "../utils/getValidNumber" import { dataUriToBlob } from "../converters/dataUriToBlob" import { UUID } from "@/utils/uuid" +import { buildEntityIndex } from "@/helpers/buildEntityIndex" type StringOrBlob = string | Blob @@ -26,7 +27,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false if ( typeof src === "object" && Array.isArray( (src as any)?.scenes) && - Array.isArray((src as any)?.models) + Array.isArray((src as any)?.entities) ) { if (debug) { console.log("parseClap: input is already a Clap file, nothing to do:", src) @@ -172,40 +173,40 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false } /* - in case we want to support streaming (mix of models and segments etc), we could do it this way: + in case we want to support streaming (mix of entities and segments etc), we could do it this way: - const maybeModelsOrSegments = rawData.slice(2) - maybeModelsOrSegments.forEach((unknownElement: any) => { + const maybeEntitiesOrSegments = rawData.slice(2) + maybeEntitiesOrSegments.forEach((unknownElement: any) => { if (isValidNumber(unknownElement?.track)) { maybeSegments.push(unknownElement as ClapSegment) } else { - maybeModels.push(unknownElement as ClapModel) + maybeEntities.push(unknownElement as ClapEntity) } }) */ - const expectedNumberOfModels = maybeClapHeader.numberOfModels || 0 + const expectedNumberOfEntities = maybeClapHeader.numberOfEntities || 0 const expectedNumberOfScenes = maybeClapHeader.numberOfScenes || 0 const expectedNumberOfSegments = maybeClapHeader.numberOfSegments || 0 // note: we assume the order is strictly enforced! - // if you implement streaming (mix of models and segments) you will have to rewrite this! + // if you implement streaming (mix of entities and segments) you will have to rewrite this! const afterTheHeaders = 2 - const afterTheModels = afterTheHeaders + expectedNumberOfModels + const afterTheEntities = afterTheHeaders + expectedNumberOfEntities - const afterTheScenes = afterTheModels + expectedNumberOfScenes + const afterTheScenes = afterTheEntities + expectedNumberOfScenes - // note: if there are no expected models, maybeModels will be empty - const maybeModels = maybeArray.slice(afterTheHeaders, afterTheModels) as ClapModel[] + // note: if there are no expected entities, maybeEntities will be empty + const maybeEntities = maybeArray.slice(afterTheHeaders, afterTheEntities) as ClapEntity[] // note: if there are no expected scenes, maybeScenes will be empty - const maybeScenes = maybeArray.slice(afterTheModels, afterTheScenes) as ClapScene[] + const maybeScenes = maybeArray.slice(afterTheEntities, afterTheScenes) as ClapScene[] const maybeSegments = maybeArray.slice(afterTheScenes) as ClapSegment[] - const clapModels: ClapModel[] = maybeModels.map(({ + const clapEntities: ClapEntity[] = maybeEntities.map(({ id, category, triggerName, @@ -280,7 +281,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false startTimeInMs, endTimeInMs, category, - modelId, + entityId, sceneId, prompt, label, @@ -289,38 +290,47 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false status, assetUrl, assetDurationInMs, + assetSourceType, createdBy, editedBy, outputGain, seed, - }) => ({ - // TODO: we should verify each of those, probably - id, - track, - startTimeInMs, - endTimeInMs, - category, - modelId, - sceneId, - prompt, - label, - outputType, - renderId, - status, - assetUrl, - assetDurationInMs, - createdBy, - editedBy, - outputGain, - seed, - })) + }) => { + if (endTimeInMs > clapMeta.durationInMs) { + clapMeta.durationInMs = endTimeInMs + } + return { + // TODO: we should verify each of those, probably + id, + track, + startTimeInMs, + endTimeInMs, + category, + entityId, + sceneId, + prompt, + label, + outputType, + renderId, + status, + assetUrl, + assetDurationInMs, + assetSourceType, + createdBy, + editedBy, + outputGain, + seed, + } + }) if (debug) { - console.log(`parseClap: successfully parsed ${clapModels.length} models, ${clapScenes.length} scenes and ${clapSegments.length} segments`) + console.log(`parseClap: successfully parsed ${clapEntities.length} entities, ${clapScenes.length} scenes and ${clapSegments.length} segments`) } + return { meta: clapMeta, - models: clapModels, + entities: clapEntities, + entityIndex: buildEntityIndex(clapEntities), scenes: clapScenes, segments: clapSegments } diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index 40608455..9fde15b7 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -2,19 +2,19 @@ import YAML from "yaml" import { getValidNumber } from "@/utils/getValidNumber" -import { ClapHeader, ClapMeta, ClapModel, ClapProject, ClapScene, ClapSegment } from "../types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "../types" import { UUID } from "@/utils/uuid" export async function serializeClap({ meta, // ClapMeta - models, // ClapModel[] + entities, // ClapEntity[] scenes, // ClapScene[] segments, // ClapSegment[] }: ClapProject): Promise { // we play it safe, and we verify the structure of the parameters, // to make sure we generate a valid clap file - const clapModels: ClapModel[] = models.map(({ + const clapEntities: ClapEntity[] = entities.map(({ id, category, triggerName, @@ -88,7 +88,7 @@ export async function serializeClap({ startTimeInMs, endTimeInMs, category, - modelId, + entityId, sceneId, prompt, label, @@ -97,6 +97,7 @@ export async function serializeClap({ status, assetUrl, assetDurationInMs, + assetSourceType, createdBy, editedBy, outputGain, @@ -107,7 +108,7 @@ export async function serializeClap({ startTimeInMs, endTimeInMs, category, - modelId, + entityId, sceneId, prompt, label, @@ -116,6 +117,7 @@ export async function serializeClap({ status, assetUrl, assetDurationInMs, + assetSourceType, createdBy, editedBy, outputGain, @@ -124,7 +126,7 @@ export async function serializeClap({ const clapHeader: ClapHeader = { format: "clap-0", - numberOfModels: clapModels.length, + numberOfEntities: clapEntities.length, numberOfScenes: clapScenes.length, numberOfSegments: clapSegments.length, } @@ -149,7 +151,7 @@ export async function serializeClap({ const entries = [ clapHeader, clapMeta, - ...clapModels, + ...clapEntities, ...clapScenes, ...clapSegments ] diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index b8ae6f5b..f4126e4e 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -1,3 +1,6 @@ +export type ClapFormat = + | "clap-0" + | "clap-1" export type ClapSegmentCategory = | "splat" @@ -43,7 +46,7 @@ export type ClapSegmentStatus = export type ClapAuthor = | "auto" // the element was edited automatically using basic if/else logical rules - | "ai" // the element was edited using a large language model + | "ai" // the element was edited using a large language entity | "human" // the element was edited by a human export type ClapAssetSource = @@ -58,16 +61,27 @@ export type ClapAssetSource = | "EMPTY" -export type ClapModelGender = +// @deprecated we are going to use ClapEntityVariant (see below) +export type ClapEntityGender = | "male" | "female" | "person" | "object" -export type ClapModelAppearance = "serious" | "neutral" | "friendly" | "chill" +// this is what we should be using - using presets like "male" / "female" is okay, +// but we are going to also enable arbitrary strings +// export type ClapEntityVariant = +// | "male" +// | "female" +// | "person" +// | "object" +// | string + +// @deprecated - we are going to use the ClapEntityVariant instead +export type ClapEntityAppearance = "serious" | "neutral" | "friendly" | "chill" // this is used for accent, style.. -export type ClapModelRegion = +export type ClapEntityRegion = | "global" | "american" | "european" @@ -87,24 +101,24 @@ export type ClapModelRegion = // be associated with African American (AADOS) characters // // "high" could be used for some other countries, eg. asia -export type ClapModelTimbre = "high" | "neutral" | "deep" +export type ClapEntityTimbre = "high" | "neutral" | "deep" -export type ClapModelAudioEngine = "ElevenLabs" | "XTTS" | "Parler-TTS" +export type ClapEntityAudioEngine = "ElevenLabs" | "XTTS" | "Parler-TTS" export type ClapVoice = { name: string - gender: ClapModelGender + gender: ClapEntityGender age: number - region: ClapModelRegion - timbre: ClapModelTimbre - appearance: ClapModelAppearance - audioEngine: ClapModelAudioEngine + region: ClapEntityRegion + timbre: ClapEntityTimbre + appearance: ClapEntityAppearance + audioEngine: ClapEntityAudioEngine audioId: string } export type ClapHeader = { - format: "clap-0" - numberOfModels: number + format: ClapFormat + numberOfEntities: number numberOfScenes: number numberOfSegments: number } @@ -159,7 +173,7 @@ export type ClapSegment = { startTimeInMs: number endTimeInMs: number category: ClapSegmentCategory - modelId: string + entityId: string sceneId: string prompt: string label: string @@ -168,13 +182,16 @@ export type ClapSegment = { status: ClapSegmentStatus assetUrl: string assetDurationInMs: number + assetSourceType: ClapAssetSource createdBy: ClapAuthor editedBy: ClapAuthor outputGain: number seed: number } -export type ClapModel = { +// TODO: this class name is too confusing, +// we should rename it to ClapEntity +export type ClapEntity = { id: string category: ClapSegmentCategory triggerName: string @@ -184,7 +201,6 @@ export type ClapModel = { thumbnailUrl: string seed: number - // TODO: create those 4 fields across all the code base: imagePrompt: string imageSourceType: ClapAssetSource imageEngine: string @@ -192,20 +208,34 @@ export type ClapModel = { audioPrompt: string audioSourceType: ClapAssetSource - audioEngine: ClapModelAudioEngine + audioEngine: ClapEntityAudioEngine audioId: string - // TODO: rename to audioVendor, audioId and add an audioSourceType - // those are only used by certain types of models + // could be replaced by an inceptionDate, so it can be used to compute the absolute "age" of anything: + // a pyramid, a person, a spaceship.. + // maybe also with a destructionDate age: number - gender: ClapModelGender - region: ClapModelRegion - appearance: ClapModelAppearance + + // @deprecated TODO: we are going to use `variant: ClapEntityVariant` instead, which is gonna be an arbitrary string + // + // thay way clap entities could be used for inanimate or fantastic entities like: + // buildings, vehicles, robots, animals, people, aliens.. + // (anything that needs visual and audio consistency) + // @deprecated + gender: ClapEntityGender + + // we can keep this, this is generic enough + // ClapEntityRegion should be renamed to ClapEntityRegion + region: ClapEntityRegion + + // @deprecated TODO: we are going to use `variant: ClapEntityVariant` instead, which is gonna be an arbitrary string + appearance: ClapEntityAppearance } export type ClapProject = { meta: ClapMeta - models: ClapModel[] + entities: ClapEntity[] + entityIndex: Record scenes: ClapScene[] segments: ClapSegment[] // let's keep room for other stuff (screenplay etc) From 702a11eea89aca32247009a8977b9083421e0880 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Apr 2024 12:57:03 +0200 Subject: [PATCH 015/346] 0.0.7 --- packages/aitube-clap/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 370619fc..c6be8dad 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.6", + "version": "0.0.7", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", From 457621cc27cbb031fdc07510f91dc667d6c9b81e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Apr 2024 13:00:30 +0200 Subject: [PATCH 016/346] 0.0.7 --- packages/aitube-client/bun.lockb | Bin 18050 -> 18050 bytes packages/aitube-client/package.json | 6 ++-- .../src/api/editClapDialogues.ts | 30 ++++++++++++++++++ ...{editClapModels.ts => editClapEntities.ts} | 4 +-- .../src/api/editClapStoryboards.ts | 2 +- packages/aitube-client/src/api/index.ts | 3 +- packages/aitube-client/src/index.ts | 2 +- 7 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 packages/aitube-client/src/api/editClapDialogues.ts rename packages/aitube-client/src/api/{editClapModels.ts => editClapEntities.ts} (84%) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 8be2fff77a4d2124a9cb3be115b3195fff72cc81..9823b76ad76548ff9b4294df85d38449f53dec3a 100755 GIT binary patch delta 168 zcmZqbWo+tYoS>($Mkh4i?^m5z%*9GB!S=twYXf{4)?4T11ifr4N!WPMdZS+zA0zwZ zLT2^NANckPIb6!_-`%)%qcrbI)yO{$jhyEMI=9tY+J3hbyVdgf>o3`3i3k3_SwB;^ zDYZj*lR52a)M2V( zExCXvM(wdkSbw~F_|l3jERIaxc9!9wv+W^85C&c_E-)@OlQ=Ri23{~OFfKN;Y%(?z W3N|iuXL@jTa%C-(F*zTT%SE@qW=Zq_ diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 824ecd28..05773272 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.5", + "version": "0.0.7", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,11 +18,11 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "^0.0.6" + "@aitube/clap": "0.0.7" }, "peerDependencies": { "typescript": "^5.4.5", - "@aitube/clap": "^0.0.6" + "@aitube/clap": "0.0.7" }, "dependencies": { "uuid": "^9.0.1", diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts new file mode 100644 index 00000000..815c140f --- /dev/null +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -0,0 +1,30 @@ +import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/config" + +export async function editClapDialogues({ + clap, + token, +}: { + clap: ClapProject + token?: string +}): Promise { + + if (!clap) { throw new Error(`please provide a valid clap project`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const newClap = await fetchClap(`${aitubeApiUrl}edit/dialogues`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + return newClap +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/editClapModels.ts b/packages/aitube-client/src/api/editClapEntities.ts similarity index 84% rename from packages/aitube-client/src/api/editClapModels.ts rename to packages/aitube-client/src/api/editClapEntities.ts index d3572ae8..bd4caf9c 100644 --- a/packages/aitube-client/src/api/editClapModels.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -2,7 +2,7 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" -export async function editClapModels({ +export async function editClapEntities({ clap, token, }: { @@ -14,7 +14,7 @@ export async function editClapModels({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/models`, { + const newClap = await fetchClap(`${aitubeApiUrl}edit/entities`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index 513678b6..d8899b7f 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -10,7 +10,7 @@ export async function editClapStoryboards({ token?: string }): Promise { - if (!clap) { throw new Error(`please provide a clap to extend`) } + if (!clap) { throw new Error(`please provide a valid clap project`) } const hasToken = typeof token === "string" && token.length > 0 diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index df778603..42d6d38a 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -1,4 +1,5 @@ export { exportClapToVideo } from "./exportClapToVideo" export { editClapStoryboards } from "./editClapStoryboards" -export { editClapModels } from "./editClapModels" +export { editClapDialogues } from "./editClapDialogues" +export { editClapEntities } from "./editClapEntities" export { createClap } from "./createClap" \ No newline at end of file diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index 65ce263d..7221098e 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -1,3 +1,3 @@ -export { exportClapToVideo, editClapStoryboards, editClapModels, createClap } from './api' +export { exportClapToVideo, editClapStoryboards, editClapDialogues, editClapEntities, createClap } from './api' export { defaultAitubeHostname, aitubeUrl, aitubeApiVersion, aitubeApiUrl } from './config' From 8587111de044da233936b661fd51609bb41e856e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Apr 2024 15:08:55 +0200 Subject: [PATCH 017/346] bump to 0.0.8 --- packages/aitube-client/README.md | 9 +++++- packages/aitube-client/package.json | 2 +- .../aitube-client/src/api/editClapVideos.ts | 30 +++++++++++++++++++ packages/aitube-client/src/api/index.ts | 1 + packages/aitube-client/src/index.ts | 17 +++++++++-- 5 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 packages/aitube-client/src/api/editClapVideos.ts diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index b0413930..a3a4707c 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -26,7 +26,14 @@ npm install @aitube/client ## Getting Started ```typescript -import { createClap, editClapStoryboards, exportClapToVideo } from '@aitube/client'; +import { + createClap, + editClapEntities, + editClapDialogues, + editClapStoryboards, + editClapVideos, + exportClapToVideo + } from '@aitube/client'; const ultraSecret = "ultra secret token unavailable to common mortals" diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 05773272..307a8b2c 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.7", + "version": "0.0.8", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts new file mode 100644 index 00000000..58243296 --- /dev/null +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -0,0 +1,30 @@ +import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/config" + +export async function editClapVideos({ + clap, + token, +}: { + clap: ClapProject + token?: string +}): Promise { + + if (!clap) { throw new Error(`please provide a valid clap project`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const newClap = await fetchClap(`${aitubeApiUrl}edit/videos`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + return newClap +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index 42d6d38a..6c52655e 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -1,5 +1,6 @@ export { exportClapToVideo } from "./exportClapToVideo" export { editClapStoryboards } from "./editClapStoryboards" +export { editClapVideos } from "./editClapVideos" export { editClapDialogues } from "./editClapDialogues" export { editClapEntities } from "./editClapEntities" export { createClap } from "./createClap" \ No newline at end of file diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index 7221098e..a2c15d69 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -1,3 +1,16 @@ -export { exportClapToVideo, editClapStoryboards, editClapDialogues, editClapEntities, createClap } from './api' -export { defaultAitubeHostname, aitubeUrl, aitubeApiVersion, aitubeApiUrl } from './config' +export { + createClap, + editClapDialogues, + editClapEntities, + editClapStoryboards, + editClapVideos, + exportClapToVideo, +} from './api' + +export { + defaultAitubeHostname, + aitubeUrl, + aitubeApiVersion, + aitubeApiUrl +} from './config' From edda41ab5aca8b39722f2b3f2597d5ff5dd4f771 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Apr 2024 15:19:34 +0200 Subject: [PATCH 018/346] =?UTF-8?q?=F0=9F=8D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/aitube-engine/.gitignore | 177 ++++++++++++++++++ packages/aitube-engine/.npmignore | 4 + packages/aitube-engine/.prettierrc.json | 9 + packages/aitube-engine/LICENSE.md | 21 +++ packages/aitube-engine/README.md | 55 ++++++ packages/aitube-engine/bun.lockb | Bin 0 -> 18050 bytes packages/aitube-engine/package.json | 46 +++++ packages/aitube-engine/src/index.ts | 12 ++ .../src/prompts/getCharacterPrompt.ts | 26 +++ .../prompts/getCharacterReferencePrompt.ts | 30 +++ .../prompts/getSpeechBackgroundAudioPrompt.ts | 52 +++++ .../prompts/getSpeechForegroundAudioPrompt.ts | 20 ++ .../src/prompts/getVideoPrompt.ts | 89 +++++++++ packages/aitube-engine/src/prompts/index.ts | 5 + .../aitube-engine/src/utils/deduplicate.ts | 3 + .../src/utils/deduplicatePrompt.ts | 5 + packages/aitube-engine/src/utils/index.ts | 2 + packages/aitube-engine/tsconfig.json | 31 +++ packages/aitube-engine/tsconfig.types.json | 13 ++ 19 files changed, 600 insertions(+) create mode 100644 packages/aitube-engine/.gitignore create mode 100644 packages/aitube-engine/.npmignore create mode 100644 packages/aitube-engine/.prettierrc.json create mode 100644 packages/aitube-engine/LICENSE.md create mode 100644 packages/aitube-engine/README.md create mode 100755 packages/aitube-engine/bun.lockb create mode 100644 packages/aitube-engine/package.json create mode 100644 packages/aitube-engine/src/index.ts create mode 100644 packages/aitube-engine/src/prompts/getCharacterPrompt.ts create mode 100644 packages/aitube-engine/src/prompts/getCharacterReferencePrompt.ts create mode 100644 packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts create mode 100644 packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts create mode 100644 packages/aitube-engine/src/prompts/getVideoPrompt.ts create mode 100644 packages/aitube-engine/src/prompts/index.ts create mode 100644 packages/aitube-engine/src/utils/deduplicate.ts create mode 100644 packages/aitube-engine/src/utils/deduplicatePrompt.ts create mode 100644 packages/aitube-engine/src/utils/index.ts create mode 100644 packages/aitube-engine/tsconfig.json create mode 100644 packages/aitube-engine/tsconfig.types.json diff --git a/packages/aitube-engine/.gitignore b/packages/aitube-engine/.gitignore new file mode 100644 index 00000000..ea8fe6a7 --- /dev/null +++ b/packages/aitube-engine/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo \ No newline at end of file diff --git a/packages/aitube-engine/.npmignore b/packages/aitube-engine/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-engine/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-engine/.prettierrc.json b/packages/aitube-engine/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-engine/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-engine/LICENSE.md b/packages/aitube-engine/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-engine/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-engine/README.md b/packages/aitube-engine/README.md new file mode 100644 index 00000000..0474f8ba --- /dev/null +++ b/packages/aitube-engine/README.md @@ -0,0 +1,55 @@ +# @aitube/engine + +*The engine powering AiTube.at* + +## ATTENTION + +AiTube is currently in heavy development, and for the moment +the engine is reserved for *internal use by AiTube itself*. + +We are sorry for any inconvenience this might cause. + +## Installation + +To install the package, run the following command: + +```bash +npm install @aitube/engine +``` + +## Getting Started + +```typescript +import { dedu, editClapStoryboards, exportClapToVideo } from '@aitube/engine'; + +``` + +## Build Instructions + +Install [Bun](https://bun.sh/) + +Run the following commands: + +```bash +bun install + +bun run build +``` + +To publish: + +```bash +bun run build + +bun run build:declaration + +bun run publish +``` + +## Contributing + +We welcome contributions! Please feel free to submit a pull request. + +## License + +This package is under the MIT License. See `LICENSE` file for more details. diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..4d8faa1d687c03b17da603e272b3cd826b994092 GIT binary patch literal 18050 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 WrZRwTx`z(H=^H2-_f!A>{{9ytA2Tli literal 0 HcmV?d00001 diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json new file mode 100644 index 00000000..080045f4 --- /dev/null +++ b/packages/aitube-engine/package.json @@ -0,0 +1,46 @@ +{ + "name": "@aitube/engine", + "module": "index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "version": "0.0.0", + "description": "The engine powering AiTube.at", + "scripts": { + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", + "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "publish": "npm publish --access public" + }, + "devDependencies": { + "@types/uuid": "^9.0.8", + "bun-types": "latest", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "typescript": "^5.4.5", + "@aitube/clap": "0.0.7" + }, + "peerDependencies": { + "typescript": "^5.4.5", + "@aitube/clap": "0.0.7" + }, + "dependencies": { + "uuid": "^9.0.1", + "yaml": "^2.4.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/jbilcke-hf/aitube-engine.git" + }, + "keywords": [ + "AI cinema", + "AiTube" + ], + "author": "Julian Bilcke", + "license": "MIT", + "files": [ + "dist/*.js", + "dist/*.d.ts", + "dist/**/*.d.ts" + ] +} diff --git a/packages/aitube-engine/src/index.ts b/packages/aitube-engine/src/index.ts new file mode 100644 index 00000000..3eae5811 --- /dev/null +++ b/packages/aitube-engine/src/index.ts @@ -0,0 +1,12 @@ +export { + getCharacterPrompt, + getCharacterReferencePrompt, + getSpeechBackgroundAudioPrompt, + getSpeechForegroundAudioPrompt, + getVideoPrompt, +} from './prompts' + +export { + deduplicate, + deduplicatePrompt, +} from './utils' diff --git a/packages/aitube-engine/src/prompts/getCharacterPrompt.ts b/packages/aitube-engine/src/prompts/getCharacterPrompt.ts new file mode 100644 index 00000000..306c89d8 --- /dev/null +++ b/packages/aitube-engine/src/prompts/getCharacterPrompt.ts @@ -0,0 +1,26 @@ +import { ClapEntity } from "@aitube/clap" + +export function getCharacterPrompt(entity: ClapEntity): string { + + let characterPrompt = "" + if (entity.description) { + characterPrompt = [ + // the label (character name) can help making the prompt more unique + // this might backfires however, if the name is + // something like "SUN", "SILVER" etc + // I'm not sure stable diffusion really needs this, + // so let's skip it for now (might still be useful for locations, though) + // we also want to avoid triggering "famous people" (BARBOSSA etc) + // entity.label, + + entity.description + ].join(", ") + } else { + characterPrompt = [ + entity.gender !== "object" ? entity.gender : "", + entity.age ? `aged ${entity.age}yo` : '', + entity.label ? `named ${entity.label}` : '', + ].map(i => i.trim()).filter(i => i).join(", ") + } + return characterPrompt +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getCharacterReferencePrompt.ts b/packages/aitube-engine/src/prompts/getCharacterReferencePrompt.ts new file mode 100644 index 00000000..61b69dda --- /dev/null +++ b/packages/aitube-engine/src/prompts/getCharacterReferencePrompt.ts @@ -0,0 +1,30 @@ +import { ClapEntity } from "@aitube/clap" + +import { getCharacterPrompt } from "./getCharacterPrompt" + +/** + * Return a prompt for a "formal" picture, centered, neutral etc + * + * @param entity + * @returns + */ +export function getCharacterReferencePrompt(entity: ClapEntity) { + const characterPrompt = [ + `beautiful`, + `close-up`, + `photo portrait`, + `id photo`, + getCharacterPrompt(entity), + `neutral expression`, + `neutral background`, + `frontal`, + `photo studio`, + `crisp`, + `sharp`, + `intricate details`, + `centered`, + // `aligned` + ].map(i => i.trim()).filter(i => i).join(", ") + + return characterPrompt +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts b/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts new file mode 100644 index 00000000..e540c270 --- /dev/null +++ b/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts @@ -0,0 +1,52 @@ +import { ClapEntity, ClapSegment } from "@aitube/clap" + +import { getCharacterPrompt } from "./getCharacterPrompt" + +/** + * Construct an audio background for a voice from a list of active segments + * + * @param segments + * @returns + */ +export function getSpeechBackgroundAudioPrompt( + segments: ClapSegment[] = [], + entityIndex: Record = {}, + extraPositivePrompt: string[] = [] // "clear sound, high quality" etc +): string { + return segments + .filter(({ category, outputType }) => ( + category === "dialogue" || + category === "weather" || + category === "location" + )) + .sort((a, b) => b.label.localeCompare(a.label)) + .map(segment => { + const entity: ClapEntity | undefined = entityIndex[segment?.entityId || ""] || undefined + + if (segment.category === "dialogue") { + // if we can't find the entity then we are unable + // to make any assumption about the gender, age and voice timbre + if (!entity) { + return `person, speaking normally` + } + + const characterPrompt = getCharacterPrompt(entity) + + return `${characterPrompt}, speaking normally` + + } else if (segment.category === "location") { + // the location is part of the background noise + // but this might produce unexpected results - we'll see! + return segment.prompt + } else if (segment.category === "weather") { + // the weather is part of the background noise + // here too this might produce weird and unexpected results 🍿 + return segment.prompt + } + // ignore the rest + return "" + }) + .filter(x => x) + .concat([ ...extraPositivePrompt ]) + .join(". ") +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts b/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts new file mode 100644 index 00000000..84b2334d --- /dev/null +++ b/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts @@ -0,0 +1,20 @@ +import { ClapSegment } from "@aitube/clap" + +/** + * Construct an audio foreground for a voice from a list of active segments + * + * This is the "dialogue" prompt, ie. the actual spoken words, + * so we don't need to do anything fancy here, we only use the raw text + * + * @param segments + * @returns + */ +export function getSpeechForegroundAudioPrompt( + segments: ClapSegment[] = [] +): string { + return segments + .filter(({ category }) => category === "dialogue") + .sort((a, b) => b.label.localeCompare(a.label)) + .map(({ prompt }) => prompt).filter(x => x) + .join(". ") +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts new file mode 100644 index 00000000..e3dbf059 --- /dev/null +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -0,0 +1,89 @@ +import { ClapEntity, ClapSegment } from "@aitube/clap" + +import { deduplicatePrompt } from "@/utils/deduplicatePrompt" +import { getCharacterPrompt } from "@/prompts/getCharacterPrompt" + +/** + * Construct a video prompt from a list of active segments + * + * @param segments + * @returns + */ +export function getVideoPrompt( + segments: ClapSegment[] = [], + entitiesIndex: Record = {}, + extraPositivePrompt: string[] = [] +): string { + + // console.log("entitiesIndex:", entitiesIndex) + + // to construct the video we need to collect all the segments describing it + // we ignore unrelated categories (music, dialogue) or non-prompt items (eg. an audio sample) + const tmp = segments + .filter(({ category, outputType }) => { + if (outputType === "audio") { + return false + } + + if ( + category === "character" || + category === "location" || + category === "time" || + category === "era" || + category === "lighting" || + category === "weather" || + category === "action" || + category === "style" || + category === "camera" || + category === "generic" + ) { + return true + } + return false + }) + + tmp.sort((a, b) => b.label.localeCompare(a.label)) + + let videoPrompt = tmp.map(segment => { + const entity: ClapEntity | undefined = entitiesIndex[segment?.entityId || ""] || undefined + + if (segment.category === "dialogue") { + + // if we can't find the entity, then we are unable + // to make any assumption about the gender, age or appearance + if (!entity) { + console.log("ERROR: this is a dialogue, but couldn't find the entity!") + return `portrait of a person speaking, blurry background, bokeh` + } + + const characterTrigger = entity?.triggerName || "" + const characterLabel = entity?.label || "" + const characterDescription = entity?.description || "" + const dialogueLine = segment?.prompt || "" + + const characterPrompt = getCharacterPrompt(entity) + + // in the context of a video, we some something additional: + // we create a "bokeh" style + return `portrait of a person speaking, blurry background, bokeh, ${characterPrompt}` + + } else if (segment.category === "location") { + + // if we can't find the location's entity, we default to returning the prompt + if (!entity) { + console.log("ERROR: this is a location, but couldn't find the entity!") + return segment.prompt + } + + return entity.description + } else { + return segment.prompt + } + }).filter(x => x) + + videoPrompt = videoPrompt.concat([ + ...extraPositivePrompt + ]) + + return deduplicatePrompt(videoPrompt.join(", ")) +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/index.ts b/packages/aitube-engine/src/prompts/index.ts new file mode 100644 index 00000000..82c5e41d --- /dev/null +++ b/packages/aitube-engine/src/prompts/index.ts @@ -0,0 +1,5 @@ +export { getCharacterPrompt } from "./getCharacterPrompt" +export { getCharacterReferencePrompt } from "./getCharacterReferencePrompt" +export { getSpeechBackgroundAudioPrompt } from "./getSpeechBackgroundAudioPrompt" +export { getSpeechForegroundAudioPrompt } from "./getSpeechForegroundAudioPrompt" +export { getVideoPrompt } from "./getVideoPrompt" diff --git a/packages/aitube-engine/src/utils/deduplicate.ts b/packages/aitube-engine/src/utils/deduplicate.ts new file mode 100644 index 00000000..93d21b85 --- /dev/null +++ b/packages/aitube-engine/src/utils/deduplicate.ts @@ -0,0 +1,3 @@ +export function deduplicate(items: string[]): string[] { + return Object.keys(items.reduce((acc, item) => ({ ...acc, [item]: item }), {})) +} \ No newline at end of file diff --git a/packages/aitube-engine/src/utils/deduplicatePrompt.ts b/packages/aitube-engine/src/utils/deduplicatePrompt.ts new file mode 100644 index 00000000..2532f890 --- /dev/null +++ b/packages/aitube-engine/src/utils/deduplicatePrompt.ts @@ -0,0 +1,5 @@ +import { deduplicate } from "@/utils/deduplicate" + +export function deduplicatePrompt(input: string): string { + return deduplicate(input.split(",").map(item => item.trim())).join(", ") +} \ No newline at end of file diff --git a/packages/aitube-engine/src/utils/index.ts b/packages/aitube-engine/src/utils/index.ts new file mode 100644 index 00000000..31f2f734 --- /dev/null +++ b/packages/aitube-engine/src/utils/index.ts @@ -0,0 +1,2 @@ +export { deduplicate } from "./deduplicate" +export { deduplicatePrompt } from "./deduplicatePrompt" diff --git a/packages/aitube-engine/tsconfig.json b/packages/aitube-engine/tsconfig.json new file mode 100644 index 00000000..ab7cc3ed --- /dev/null +++ b/packages/aitube-engine/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/aitube-engine/tsconfig.types.json b/packages/aitube-engine/tsconfig.types.json new file mode 100644 index 00000000..a6a3f211 --- /dev/null +++ b/packages/aitube-engine/tsconfig.types.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts" + ] +} From 805bb46ca96dc9d1fe438292751e0a21f5887b85 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Apr 2024 15:22:44 +0200 Subject: [PATCH 019/346] fix doc --- packages/aitube-engine/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/aitube-engine/README.md b/packages/aitube-engine/README.md index 0474f8ba..0eae80b8 100644 --- a/packages/aitube-engine/README.md +++ b/packages/aitube-engine/README.md @@ -20,7 +20,15 @@ npm install @aitube/engine ## Getting Started ```typescript -import { dedu, editClapStoryboards, exportClapToVideo } from '@aitube/engine'; +import { + getCharacterPrompt, + getCharacterReferencePrompt, + getSpeechBackgroundAudioPrompt, + getSpeechForegroundAudioPrompt, + getVideoPrompt, + deduplicate, + deduplicatePrompt, +} from '@aitube/engine' ``` From f4d1a026d0222701933c942f7f8e60fb4b3bfb37 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 30 Apr 2024 13:27:00 +0200 Subject: [PATCH 020/346] initial commit --- packages/aitube-io/.gitignore | 177 ++++++++++++++++++ packages/aitube-io/.npmignore | 4 + packages/aitube-io/.prettierrc.json | 9 + packages/aitube-io/LICENSE.md | 21 +++ packages/aitube-io/README.md | 74 ++++++++ packages/aitube-io/bun.lockb | Bin 0 -> 29700 bytes packages/aitube-io/package.json | 44 +++++ packages/aitube-io/src/delete/deleteFile.ts | 14 ++ .../src/delete/deleteFilesWithName.ts | 13 ++ packages/aitube-io/src/delete/index.ts | 3 + .../src/delete/removeTemporaryFiles.ts | 21 +++ .../src/fetch/downloadFileAsBase64.ts | 27 +++ packages/aitube-io/src/fetch/index.ts | 1 + .../aitube-io/src/image/convertImageTo.ts | 31 +++ .../aitube-io/src/image/convertImageToJpeg.ts | 27 +++ .../src/image/convertImageToOriginal.ts | 6 + .../aitube-io/src/image/convertImageToPng.ts | 23 +++ .../aitube-io/src/image/convertImageToWebp.ts | 41 ++++ packages/aitube-io/src/image/imageFormats.ts | 1 + packages/aitube-io/src/image/index.ts | 7 + packages/aitube-io/src/image/resizeImage.ts | 55 ++++++ packages/aitube-io/src/index.ts | 37 ++++ packages/aitube-io/src/read/index.ts | 6 + .../src/read/readJpegFileToBase64.ts | 18 ++ .../aitube-io/src/read/readMp3FileToBase64.ts | 18 ++ .../aitube-io/src/read/readMp4FileToBase64.ts | 18 ++ packages/aitube-io/src/read/readPlainText.ts | 13 ++ .../aitube-io/src/read/readPngFileToBase64.ts | 18 ++ .../aitube-io/src/read/readWavFileToBase64.ts | 18 ++ .../aitube-io/src/tmp/getRandomDirectory.ts | 9 + packages/aitube-io/src/tmp/index.ts | 1 + packages/aitube-io/src/write/index.ts | 1 + .../aitube-io/src/write/writeBase64ToFile.ts | 29 +++ packages/aitube-io/tsconfig.json | 31 +++ packages/aitube-io/tsconfig.types.json | 13 ++ 35 files changed, 829 insertions(+) create mode 100644 packages/aitube-io/.gitignore create mode 100644 packages/aitube-io/.npmignore create mode 100644 packages/aitube-io/.prettierrc.json create mode 100644 packages/aitube-io/LICENSE.md create mode 100644 packages/aitube-io/README.md create mode 100755 packages/aitube-io/bun.lockb create mode 100644 packages/aitube-io/package.json create mode 100644 packages/aitube-io/src/delete/deleteFile.ts create mode 100644 packages/aitube-io/src/delete/deleteFilesWithName.ts create mode 100644 packages/aitube-io/src/delete/index.ts create mode 100644 packages/aitube-io/src/delete/removeTemporaryFiles.ts create mode 100644 packages/aitube-io/src/fetch/downloadFileAsBase64.ts create mode 100644 packages/aitube-io/src/fetch/index.ts create mode 100644 packages/aitube-io/src/image/convertImageTo.ts create mode 100644 packages/aitube-io/src/image/convertImageToJpeg.ts create mode 100644 packages/aitube-io/src/image/convertImageToOriginal.ts create mode 100644 packages/aitube-io/src/image/convertImageToPng.ts create mode 100644 packages/aitube-io/src/image/convertImageToWebp.ts create mode 100644 packages/aitube-io/src/image/imageFormats.ts create mode 100644 packages/aitube-io/src/image/index.ts create mode 100644 packages/aitube-io/src/image/resizeImage.ts create mode 100644 packages/aitube-io/src/index.ts create mode 100644 packages/aitube-io/src/read/index.ts create mode 100644 packages/aitube-io/src/read/readJpegFileToBase64.ts create mode 100644 packages/aitube-io/src/read/readMp3FileToBase64.ts create mode 100644 packages/aitube-io/src/read/readMp4FileToBase64.ts create mode 100644 packages/aitube-io/src/read/readPlainText.ts create mode 100644 packages/aitube-io/src/read/readPngFileToBase64.ts create mode 100644 packages/aitube-io/src/read/readWavFileToBase64.ts create mode 100644 packages/aitube-io/src/tmp/getRandomDirectory.ts create mode 100644 packages/aitube-io/src/tmp/index.ts create mode 100644 packages/aitube-io/src/write/index.ts create mode 100644 packages/aitube-io/src/write/writeBase64ToFile.ts create mode 100644 packages/aitube-io/tsconfig.json create mode 100644 packages/aitube-io/tsconfig.types.json diff --git a/packages/aitube-io/.gitignore b/packages/aitube-io/.gitignore new file mode 100644 index 00000000..ea8fe6a7 --- /dev/null +++ b/packages/aitube-io/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo \ No newline at end of file diff --git a/packages/aitube-io/.npmignore b/packages/aitube-io/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-io/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-io/.prettierrc.json b/packages/aitube-io/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-io/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-io/LICENSE.md b/packages/aitube-io/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-io/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-io/README.md b/packages/aitube-io/README.md new file mode 100644 index 00000000..b59295c7 --- /dev/null +++ b/packages/aitube-io/README.md @@ -0,0 +1,74 @@ +# @aitube/io + +*Collection of useful I/O utilities for NodeJS. Used by AiTube.at* + +## ATTENTION + +AiTube is currently in heavy development, so this library is experimental, +and may be subject to unannounced breaking changes. + +We are sorry for any inconvenience this might cause. + +## Installation + +To install the package, run the following command: + +```bash +npm install @aitube/io +``` + +## Getting Started + +```typescript +import { + deleteFile, + deleteFilesWithName, + removeTemporaryFiles, + downloadFileAsBase64, + convertImageTo, + convertImageToJpeg, + convertImageToOriginal, + convertImageToPng, + convertImageToWebp, + resizeImage, + readJpegFileToBase64, + readMp3FileToBase64, + readMp4FileToBase64, + readPlainText, + readPngFileToBase64, + readWavFileToBase64, + getRandomDirectory, + writeBase64ToFile, +} from '@aitube/io' + +``` + +## Build Instructions + +Install [Bun](https://bun.sh/) + +Run the following commands: + +```bash +bun install + +bun run build +``` + +To publish: + +```bash +bun run build + +bun run build:declaration + +bun run publish +``` + +## Contributing + +We welcome contributions! Please feel free to submit a pull request. + +## License + +This package is under the MIT License. See `LICENSE` file for more details. diff --git a/packages/aitube-io/bun.lockb b/packages/aitube-io/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..a4bb7afc1a322f6c962dc144f7f491bf2e8650f9 GIT binary patch literal 29700 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 L_-`8i@BRHB7d8KM literal 0 HcmV?d00001 diff --git a/packages/aitube-io/package.json b/packages/aitube-io/package.json new file mode 100644 index 00000000..53d7a1ae --- /dev/null +++ b/packages/aitube-io/package.json @@ -0,0 +1,44 @@ +{ + "name": "@aitube/io", + "module": "index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "version": "0.0.0", + "description": "Collection of useful I/O utilities for NodeJS. Used by AiTube.at", + "scripts": { + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", + "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "publish": "npm publish --access public" + }, + "devDependencies": { + "@types/mime-types": "^2.1.4", + "@types/uuid": "^9.0.8", + "bun-types": "latest", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "typescript": "^5.4.5" + }, + "peerDependencies": {}, + "dependencies": { + "mime-types": "^2.1.35", + "sharp": "^0.33.3", + "uuid": "^9.0.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/jbilcke-hf/aitube-io.git" + }, + "keywords": [ + "AiTube", + "FFmpeg" + ], + "author": "Julian Bilcke", + "license": "MIT", + "files": [ + "dist/*.js", + "dist/*.d.ts", + "dist/**/*.d.ts" + ] +} diff --git a/packages/aitube-io/src/delete/deleteFile.ts b/packages/aitube-io/src/delete/deleteFile.ts new file mode 100644 index 00000000..7dabfe8b --- /dev/null +++ b/packages/aitube-io/src/delete/deleteFile.ts @@ -0,0 +1,14 @@ +import { rm } from "node:fs/promises" + +export async function deleteFile(filePath: string, debug?: boolean): Promise { + try { + await rm(filePath, { recursive: true, force: true }) + // await unlink(filePath) + return true + } catch (err) { + if (debug) { + console.error(`failed to unlink file at ${filePath}: ${err}`) + } + } + return false +} \ No newline at end of file diff --git a/packages/aitube-io/src/delete/deleteFilesWithName.ts b/packages/aitube-io/src/delete/deleteFilesWithName.ts new file mode 100644 index 00000000..31d95782 --- /dev/null +++ b/packages/aitube-io/src/delete/deleteFilesWithName.ts @@ -0,0 +1,13 @@ +import { readdir } from "node:fs/promises" +import path from "node:path" + +import { deleteFile } from "./deleteFile" + +export const deleteFilesWithName = async (dir: string, name: string, debug?: boolean) => { + // console.log(`deleteFilesWithName(${dir}, ${name})`) + for (const file of await readdir(dir)) { + if (file.includes(name)) { + await deleteFile(path.join(dir, file)) + } + } +} diff --git a/packages/aitube-io/src/delete/index.ts b/packages/aitube-io/src/delete/index.ts new file mode 100644 index 00000000..6e4f88e1 --- /dev/null +++ b/packages/aitube-io/src/delete/index.ts @@ -0,0 +1,3 @@ +export { deleteFile } from "./deleteFile" +export { deleteFilesWithName } from "./deleteFilesWithName" +export { removeTemporaryFiles } from "./removeTemporaryFiles" \ No newline at end of file diff --git a/packages/aitube-io/src/delete/removeTemporaryFiles.ts b/packages/aitube-io/src/delete/removeTemporaryFiles.ts new file mode 100644 index 00000000..d290be82 --- /dev/null +++ b/packages/aitube-io/src/delete/removeTemporaryFiles.ts @@ -0,0 +1,21 @@ +import { existsSync, promises as fs } from "node:fs" + +// note: this function will never fail +export async function removeTemporaryFiles(filesPaths: string[]) { + try { + // Cleanup temporary files - you could choose to do this or leave it to the user + await Promise.all(filesPaths.map(async (filePath) => { + try { + if (existsSync(filePath)) { + await fs.rm(filePath) + } + } catch (err) { + // + } + })) + } catch (err) { + // no big deal, except a bit of tmp file leak + // although.. if delete failed, it could also indicate + // that the file has already been cleaned-up, so even better! + } +} \ No newline at end of file diff --git a/packages/aitube-io/src/fetch/downloadFileAsBase64.ts b/packages/aitube-io/src/fetch/downloadFileAsBase64.ts new file mode 100644 index 00000000..fca5ecd6 --- /dev/null +++ b/packages/aitube-io/src/fetch/downloadFileAsBase64.ts @@ -0,0 +1,27 @@ +import { lookup } from "mime-types" + +export const downloadFileAsBase64 = async (remoteUrl: string): Promise => { + // const controller = new AbortController() + + // download the file + const response = await fetch(remoteUrl, { + // signal: controller.signal + }) + + // get as Buffer + const arrayBuffer = await response.arrayBuffer() + const buffer = Buffer.from(arrayBuffer) + + // convert it to base64 + const base64 = buffer.toString('base64') + + + const res = lookup(remoteUrl) + let contentType = res.toString() + if (typeof res === "boolean" && res === false) { + contentType = response.headers.get('content-type') || "" + } + + const assetUrl = `data:${contentType};base64,${base64}` + return assetUrl +}; \ No newline at end of file diff --git a/packages/aitube-io/src/fetch/index.ts b/packages/aitube-io/src/fetch/index.ts new file mode 100644 index 00000000..7471cec2 --- /dev/null +++ b/packages/aitube-io/src/fetch/index.ts @@ -0,0 +1 @@ +export { downloadFileAsBase64 } from "./downloadFileAsBase64" \ No newline at end of file diff --git a/packages/aitube-io/src/image/convertImageTo.ts b/packages/aitube-io/src/image/convertImageTo.ts new file mode 100644 index 00000000..c7287347 --- /dev/null +++ b/packages/aitube-io/src/image/convertImageTo.ts @@ -0,0 +1,31 @@ +import { convertImageToJpeg } from "./convertImageToJpeg" +import { convertImageToPng } from "./convertImageToPng" +import { convertImageToWebp } from "./convertImageToWebp" +import { ImageFileExt } from "./imageFormats" + +/** + * Convert an image to one of the supported file formats + * + * @param imgBase64 + * @param outputFormat + * @returns + */ +export async function convertImageTo(imgBase64: string = "", outputFormat: ImageFileExt): Promise { + const format = outputFormat.trim().toLowerCase() as ImageFileExt + if (!["jpeg", "jpg", "png", "webp"].includes(format)) { + throw new Error(`unsupported file format "${format}"`) + } + + const isJpeg = format === "jpg" || format === "jpeg" + + + if (isJpeg) { + return convertImageToJpeg(imgBase64) + } + + if (format === "webp") { + return convertImageToWebp(imgBase64) + } + + return convertImageToPng(imgBase64) +} diff --git a/packages/aitube-io/src/image/convertImageToJpeg.ts b/packages/aitube-io/src/image/convertImageToJpeg.ts new file mode 100644 index 00000000..7ef63e91 --- /dev/null +++ b/packages/aitube-io/src/image/convertImageToJpeg.ts @@ -0,0 +1,27 @@ +import sharp from "sharp" + +export async function convertImageToJpeg(imgBase64: string = "", quality: number = 92): Promise { + + const base64WithoutHeader = imgBase64.split(";base64,")[1] || "" + + if (!base64WithoutHeader) { + const slice = `${imgBase64 || ""}`.slice(0, 50) + throw new Error(`couldn't process input image "${slice}..."`) + } + + // Convert base64 to buffer + const tmpBuffer = Buffer.from(base64WithoutHeader, 'base64') + + // Resize the buffer to the target size + const newBuffer = await sharp(tmpBuffer) + .jpeg({ + quality, + // we don't use progressive: true because we pre-load images anyway + }) + .toBuffer() + + // Convert the buffer back to base64 + const newImageBase64 = newBuffer.toString('base64') + + return `data:image/jpeg;base64,${newImageBase64}` +} \ No newline at end of file diff --git a/packages/aitube-io/src/image/convertImageToOriginal.ts b/packages/aitube-io/src/image/convertImageToOriginal.ts new file mode 100644 index 00000000..92971f64 --- /dev/null +++ b/packages/aitube-io/src/image/convertImageToOriginal.ts @@ -0,0 +1,6 @@ + +// you are reading it right: this function does.. nothing! +// it is a NOOP conversion function +export async function convertImageToOriginal(imgBase64: string = ""): Promise { + return imgBase64 +} \ No newline at end of file diff --git a/packages/aitube-io/src/image/convertImageToPng.ts b/packages/aitube-io/src/image/convertImageToPng.ts new file mode 100644 index 00000000..8edd35bc --- /dev/null +++ b/packages/aitube-io/src/image/convertImageToPng.ts @@ -0,0 +1,23 @@ +import sharp from "sharp" + +export async function convertImageToPng(imgBase64: string = ""): Promise { + + const base64WithoutHeader = imgBase64.split(";base64,")[1] || "" + + if (!base64WithoutHeader) { + const slice = `${imgBase64 || ""}`.slice(0, 50) + throw new Error(`couldn't process input image "${slice}..."`) + } + + // Convert base64 to buffer + const tmpBuffer = Buffer.from(base64WithoutHeader, 'base64') + + const newBuffer = await sharp(tmpBuffer) + .png() + .toBuffer() + + // Convert the buffer back to base64 + const newImageBase64 = newBuffer.toString('base64') + + return `data:image/png;base64,${newImageBase64}` +} \ No newline at end of file diff --git a/packages/aitube-io/src/image/convertImageToWebp.ts b/packages/aitube-io/src/image/convertImageToWebp.ts new file mode 100644 index 00000000..2d936faa --- /dev/null +++ b/packages/aitube-io/src/image/convertImageToWebp.ts @@ -0,0 +1,41 @@ +import sharp from "sharp" + +export async function convertImageToWebp(imgBase64: string = ""): Promise { + + const base64WithoutHeader = imgBase64.split(";base64,")[1] || "" + + if (!base64WithoutHeader) { + const slice = `${imgBase64 || ""}`.slice(0, 50) + throw new Error(`couldn't process input image "${slice}..."`) + } + + // Convert base64 to buffer + const tmpBuffer = Buffer.from(base64WithoutHeader, 'base64') + + // Resize the buffer to the target size + const newBuffer = await sharp(tmpBuffer) + .webp({ + // for options please see https://sharp.pixelplumbing.com/api-output#webp + + // preset: "photo", + + // effort: 3, + + // for a PNG-like quality + // lossless: true, + + // by default it is quality 80 + quality: 80, + + // nearLossless: true, + + // use high quality chroma subsampling + smartSubsample: true, + }) + .toBuffer() + + // Convert the buffer back to base64 + const newImageBase64 = newBuffer.toString('base64') + + return `data:image/webp;base64,${newImageBase64}` +} \ No newline at end of file diff --git a/packages/aitube-io/src/image/imageFormats.ts b/packages/aitube-io/src/image/imageFormats.ts new file mode 100644 index 00000000..027dfd62 --- /dev/null +++ b/packages/aitube-io/src/image/imageFormats.ts @@ -0,0 +1 @@ +export type ImageFileExt = "png" | "jpeg" | "jpg" | "webp" diff --git a/packages/aitube-io/src/image/index.ts b/packages/aitube-io/src/image/index.ts new file mode 100644 index 00000000..ab619315 --- /dev/null +++ b/packages/aitube-io/src/image/index.ts @@ -0,0 +1,7 @@ +export { convertImageTo } from "./convertImageTo" +export { convertImageToJpeg } from "./convertImageToJpeg" +export { convertImageToOriginal } from "./convertImageToOriginal" +export { convertImageToPng } from "./convertImageToPng" +export { convertImageToWebp } from "./convertImageToWebp" +export type { ImageFileExt } from "./imageFormats" +export { resizeImage } from "./resizeImage" \ No newline at end of file diff --git a/packages/aitube-io/src/image/resizeImage.ts b/packages/aitube-io/src/image/resizeImage.ts new file mode 100644 index 00000000..096ec42e --- /dev/null +++ b/packages/aitube-io/src/image/resizeImage.ts @@ -0,0 +1,55 @@ +import sharp from "sharp" + +export type ResizeImageParams = { + input: string + width?: number + height?: number + debug?: boolean + asBase64?: boolean // TODO: not implemented yet! +}; + +/** + * Resize an image to a given width and height. + * The input image can be a file path or a data URI (base64) + * The image ratio will be preserved if only one side is given. + * The image format (WebP, Jpeg, PNG) will be preserved. + * This function always return a base64 string (data URI with the mime type) + * + * @param param0 + * @returns + */ +export async function resizeImage({ input, width, height, debug, asBase64 }: ResizeImageParams): Promise { + let inputBuffer: Buffer; + + // Test if input is a data URI + const dataUriPattern = /^data:([a-zA-Z]+\/[a-zA-Z]+);base64,(.*)$/; + const matches = input.match(dataUriPattern); + + if (matches) { + const [, mimeType, base64Data] = matches; + if (!/^image\/(png|jpeg|webp)$/.test(mimeType)) { + throw new Error(`Unsupported image format. Expected PNG, JPEG, or WebP.`); + } + inputBuffer = Buffer.from(base64Data, "base64"); + } else { + // Assuming input is a file path + inputBuffer = await sharp(input).toBuffer(); + } + + const sharpInstance = sharp(inputBuffer) + .resize(width, height, { + fit: "inside", + withoutEnlargement: true + }); + + const outputBuffer = await sharpInstance.toBuffer(); + const outputMimeType = await sharpInstance.metadata().then(meta => meta.format); + + if (!outputMimeType) { + throw new Error("Failed to determine the image mime type after resizing."); + } + + const prefix = `data:image/${outputMimeType};base64,`; + const outputBase64 = outputBuffer.toString("base64"); + return `${prefix}${outputBase64}`; +} \ No newline at end of file diff --git a/packages/aitube-io/src/index.ts b/packages/aitube-io/src/index.ts new file mode 100644 index 00000000..18896003 --- /dev/null +++ b/packages/aitube-io/src/index.ts @@ -0,0 +1,37 @@ +export { + deleteFile, + deleteFilesWithName, + removeTemporaryFiles +} from "./delete" + +export { + downloadFileAsBase64, +} from "./fetch" + +export { + convertImageTo, + convertImageToJpeg, + convertImageToOriginal, + convertImageToPng, + convertImageToWebp, + resizeImage +} from "./image" + +export type { ImageFileExt } from "./image" + +export { + readJpegFileToBase64, + readMp3FileToBase64, + readMp4FileToBase64, + readPlainText, + readPngFileToBase64, + readWavFileToBase64 +} from "./read" + +export { + getRandomDirectory, +} from "./tmp" + +export { + writeBase64ToFile, +} from "./write" \ No newline at end of file diff --git a/packages/aitube-io/src/read/index.ts b/packages/aitube-io/src/read/index.ts new file mode 100644 index 00000000..4ed659f2 --- /dev/null +++ b/packages/aitube-io/src/read/index.ts @@ -0,0 +1,6 @@ +export { readJpegFileToBase64 } from "./readJpegFileToBase64" +export { readMp3FileToBase64 } from "./readMp3FileToBase64" +export { readMp4FileToBase64 } from "./readMp4FileToBase64" +export { readPlainText } from "./readPlainText" +export { readPngFileToBase64 } from "./readPngFileToBase64" +export { readWavFileToBase64 } from "./readWavFileToBase64" diff --git a/packages/aitube-io/src/read/readJpegFileToBase64.ts b/packages/aitube-io/src/read/readJpegFileToBase64.ts new file mode 100644 index 00000000..b79f3085 --- /dev/null +++ b/packages/aitube-io/src/read/readJpegFileToBase64.ts @@ -0,0 +1,18 @@ +import { readFile } from "node:fs/promises" + +export async function readJpegFileToBase64(filePath: string): Promise { + try { + // Read the file's content as a Buffer + const fileBuffer = await readFile(filePath); + + // Convert the buffer to a base64 string + const base64 = fileBuffer.toString('base64'); + + // Prefix the base64 string with the Data URI scheme for PNG images + return `data:image/jpeg;base64,${base64}`; + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error); + throw error; + } +} diff --git a/packages/aitube-io/src/read/readMp3FileToBase64.ts b/packages/aitube-io/src/read/readMp3FileToBase64.ts new file mode 100644 index 00000000..8cff2427 --- /dev/null +++ b/packages/aitube-io/src/read/readMp3FileToBase64.ts @@ -0,0 +1,18 @@ +import { readFile } from "node:fs/promises" + +export async function readMp3FileToBase64(filePath: string): Promise { + try { + // Read the file's content as a Buffer + const fileBuffer = await readFile(filePath); + + // Convert the buffer to a base64 string + const base64 = fileBuffer.toString('base64'); + + // Prefix the base64 string with the Data URI scheme for PNG images + return `data:audio/mp3;base64,${base64}`; + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error); + throw error; + } +} diff --git a/packages/aitube-io/src/read/readMp4FileToBase64.ts b/packages/aitube-io/src/read/readMp4FileToBase64.ts new file mode 100644 index 00000000..f13814cb --- /dev/null +++ b/packages/aitube-io/src/read/readMp4FileToBase64.ts @@ -0,0 +1,18 @@ +import { readFile } from "node:fs/promises" + +export async function readMp4FileToBase64(filePath: string): Promise { + try { + // Read the file's content as a Buffer + const fileBuffer = await readFile(filePath) + + // Convert the buffer to a base64 string + const base64 = fileBuffer.toString('base64') + + // Prefix the base64 string with the Data URI scheme for PNG images + return `data:video/mp4;base64,${base64}` + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error) + throw error + } +} diff --git a/packages/aitube-io/src/read/readPlainText.ts b/packages/aitube-io/src/read/readPlainText.ts new file mode 100644 index 00000000..6b3d5901 --- /dev/null +++ b/packages/aitube-io/src/read/readPlainText.ts @@ -0,0 +1,13 @@ +import { readFile } from "node:fs/promises" + +export async function readPlainText(filePath: string): Promise { + try { + const plainText = await readFile(filePath, "utf-8") + + return plainText + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error) + throw error + } +} diff --git a/packages/aitube-io/src/read/readPngFileToBase64.ts b/packages/aitube-io/src/read/readPngFileToBase64.ts new file mode 100644 index 00000000..a3475ceb --- /dev/null +++ b/packages/aitube-io/src/read/readPngFileToBase64.ts @@ -0,0 +1,18 @@ +import { readFile } from "node:fs/promises" + +export async function readPngFileToBase64(filePath: string): Promise { + try { + // Read the file's content as a Buffer + const fileBuffer = await readFile(filePath) + + // Convert the buffer to a base64 string + const base64 = fileBuffer.toString('base64') + + // Prefix the base64 string with the Data URI scheme for PNG images + return `data:image/png;base64,${base64}` + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error) + throw error + } +} diff --git a/packages/aitube-io/src/read/readWavFileToBase64.ts b/packages/aitube-io/src/read/readWavFileToBase64.ts new file mode 100644 index 00000000..00d182d5 --- /dev/null +++ b/packages/aitube-io/src/read/readWavFileToBase64.ts @@ -0,0 +1,18 @@ +import { readFile } from "node:fs/promises" + +export async function readWavFileToBase64(filePath: string): Promise { + try { + // Read the file's content as a Buffer + const fileBuffer = await readFile(filePath) + + // Convert the buffer to a base64 string + const base64 = fileBuffer.toString('base64') + + // Prefix the base64 string with the Data URI scheme for PNG images + return `data:audio/wav;base64,${base64}` + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error) + throw error + } +} diff --git a/packages/aitube-io/src/tmp/getRandomDirectory.ts b/packages/aitube-io/src/tmp/getRandomDirectory.ts new file mode 100644 index 00000000..40b37a2a --- /dev/null +++ b/packages/aitube-io/src/tmp/getRandomDirectory.ts @@ -0,0 +1,9 @@ +import { tmpdir } from "node:os" +import { join } from "node:path" +import { mkdtemp } from "node:fs/promises" + +import { v4 as uuidv4 } from "uuid" + +export async function getRandomDirectory(): Promise { + return mkdtemp(join(tmpdir(), uuidv4())) +} \ No newline at end of file diff --git a/packages/aitube-io/src/tmp/index.ts b/packages/aitube-io/src/tmp/index.ts new file mode 100644 index 00000000..3050210d --- /dev/null +++ b/packages/aitube-io/src/tmp/index.ts @@ -0,0 +1 @@ +export { getRandomDirectory } from "./getRandomDirectory" \ No newline at end of file diff --git a/packages/aitube-io/src/write/index.ts b/packages/aitube-io/src/write/index.ts new file mode 100644 index 00000000..ef25f916 --- /dev/null +++ b/packages/aitube-io/src/write/index.ts @@ -0,0 +1 @@ +export { writeBase64ToFile } from "./writeBase64ToFile" \ No newline at end of file diff --git a/packages/aitube-io/src/write/writeBase64ToFile.ts b/packages/aitube-io/src/write/writeBase64ToFile.ts new file mode 100644 index 00000000..c7e16f09 --- /dev/null +++ b/packages/aitube-io/src/write/writeBase64ToFile.ts @@ -0,0 +1,29 @@ +import { writeFile } from "node:fs/promises" + +export async function writeBase64ToFile(base64Data: string, filePath: string): Promise { + const data = base64Data.split(";base64,").pop() + if (!data) { throw new Error("Invalid base64 content") } + await writeFile(filePath, data, { encoding: "base64" }) + return filePath +} + +// legacy way: with more manual steps + +/* +export async function writeBase64ToFile(content: string, filePath: string): Promise { + + // Remove "data:image/png;base64," from the start of the data url + const base64Data = content.split(";base64,")[1] + + // Convert base64 to binary + const data = Buffer.from(base64Data, "base64") + + // Write binary data to file + try { + await fs.writeFile(filePath, data) + // console.log("File written successfully") + } catch (error) { + console.error("An error occurred:", error) + } +} +*/ \ No newline at end of file diff --git a/packages/aitube-io/tsconfig.json b/packages/aitube-io/tsconfig.json new file mode 100644 index 00000000..ab7cc3ed --- /dev/null +++ b/packages/aitube-io/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/aitube-io/tsconfig.types.json b/packages/aitube-io/tsconfig.types.json new file mode 100644 index 00000000..a6a3f211 --- /dev/null +++ b/packages/aitube-io/tsconfig.types.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts" + ] +} From 4ac71a31c9b2f885fa476046a20f36e0ed831962 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 16:48:40 +0200 Subject: [PATCH 021/346] bump to 0.0.8 --- packages/aitube-clap/README.md | 28 ++++- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/index.ts | 35 +++++- packages/aitube-clap/src/io/index.ts | 1 + packages/aitube-clap/src/io/updateClap.ts | 111 ++++++++++++++++++ packages/aitube-clap/src/types.ts | 14 +++ .../aitube-clap/src/utils/filterSegments.ts | 30 +++++ .../src/utils/filterSegmentsWithinRange.ts | 52 ++++++++ packages/aitube-clap/src/utils/index.ts | 2 + 9 files changed, 265 insertions(+), 10 deletions(-) create mode 100644 packages/aitube-clap/src/io/updateClap.ts create mode 100644 packages/aitube-clap/src/utils/filterSegments.ts create mode 100644 packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 3591cfbf..40d603d6 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -4,11 +4,31 @@ ## Introduction -This library is used to manipulate Clap files, the file format -used by AiTube, a modern platform for AI cinema and AI gaming. +This library is used to manipulate Clap files, the file format used to describe AI scenes for AiTube. -It is designed to support short-to-long 2D, 3D and 4D experiences, -such as conventional films or more modern forms of art such as gaussian splatting movies with a soundtrack. +It in an open interchange format that other people can use freely for their own projects. + +## Design and capabilities + +A Clap file (.clap) is a compressed YAML stream of documents that describe all aspects of a scene. + +(to be continued) + +## Roadmap + +- [ ] Create a DRAFT for the specification +- [x] Use it in production +- [x] First working implementation for NodeJS + +## Implementations: + +- [ ] C++ library (for native binding): TODO +- [x] Python (in progress): [py-aitube-clap](https://github.com/jbilcke-hf/py-aitube-clap) +- [x] NodeJS (released): [aitube-clap](https://github.com/jbilcke-hf/aitube-clap) +- [ ] Swift: TODO +- [ ] G TODO +- [ ] Java TODO +- [ ] Haskell TODO ## Installation diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index c6be8dad..acffd27b 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.7", + "version": "0.0.8", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 43ef4927..4d234e3d 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -18,8 +18,33 @@ export { ClapEntity, ClapProject, } from './types' -export { newClap, newEntity, newSegment } from './factories' -export { parseClap, serializeClap, fetchClap } from './io' -export { generateSeed, getClapAssetSourceType, getValidNumber, isValidNumber, UUID } from './utils' -export { blobToDataUri, dataUriToBlob, clapToDataUri } from './converters' -export { generateClapFromSimpleStory, getEmptyClap, buildEntityIndex } from './helpers' +export { + newClap, + newEntity, + newSegment +} from './factories' +export { + parseClap, + serializeClap, + fetchClap, + updateClap +} from './io' +export { + filterSegments, + filterSegmentsWithinRange, + generateSeed, + getClapAssetSourceType, + getValidNumber, + isValidNumber, + UUID +} from './utils' +export { + blobToDataUri, + dataUriToBlob, + clapToDataUri +} from './converters' +export { + generateClapFromSimpleStory, + getEmptyClap, + buildEntityIndex +} from './helpers' diff --git a/packages/aitube-clap/src/io/index.ts b/packages/aitube-clap/src/io/index.ts index df059df7..8095718e 100644 --- a/packages/aitube-clap/src/io/index.ts +++ b/packages/aitube-clap/src/io/index.ts @@ -1,3 +1,4 @@ export { parseClap } from './parseClap' export { serializeClap } from './serializeClap' export { fetchClap } from './fetchClap' +export { updateClap } from './updateClap' diff --git a/packages/aitube-clap/src/io/updateClap.ts b/packages/aitube-clap/src/io/updateClap.ts new file mode 100644 index 00000000..14474358 --- /dev/null +++ b/packages/aitube-clap/src/io/updateClap.ts @@ -0,0 +1,111 @@ +import { ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" +import { newClap } from "@/factories/newClap" + +/** + * This function takes two clap projects (an old and a newer one) and merge them. + * + * The most common use case is when we generate a Clap project in multiple steps, + * sending only partial results over the wire to preserve bandwidth and compute time. + * + * The new clap can either be partial (should be the preferred use case), or full. + * If the new clap is a full one, then you will get ID collions (overlapping). + + * A simple rule is used when that happen: newer content will overwrite older content. + * + * @param existingClap + * @param newerClap + */ +export async function updateClap(existingClap: ClapProject, newerClap: ClapProject, { + inlineReplace = false +}: { + // Whether to replace the existing clap "inline" or not. Defaults to false. + // + // true: the function will have side effects as the existing clap will be modified and returned + // false: the function will have no side effects, the existing clap will be untouched and instead a new object will be created. + // + // Depending on your code architecture or use case, + // you will either want the version with or without the side effects + // but keep in mind that Clap files can get large (in megabytes or even gigabytes) + // and you may have to switch to the inline mode for performance reasons + inlineReplace?: boolean +} = { + inlineReplace: false +}): Promise { + + const clap = inlineReplace ? existingClap : newClap() + + for (const [metaFieldKey, metaFieldValue] of Object.entries(newerClap.meta)) { + (clap.meta as any)[metaFieldKey] = metaFieldValue + } + + // create some temporary indexes for faster checking + const existingEntityIndex: Record = {} + for (const entity of existingClap.entities) { + existingEntityIndex[entity.id] = entity + } + + const existingSceneIndex: Record = {} + for (const scene of existingClap.scenes) { + existingSceneIndex[scene.id] = scene + } + + const existingSegmentIndex: Record = {} + for (const segment of existingClap.segments) { + existingSegmentIndex[segment.id] = segment + } + + // we replace all the data + for (const entity of newerClap.entities) { + if (existingEntityIndex[entity.id]) { + existingEntityIndex[entity.id] = { + ...existingEntityIndex[entity.id], + ...entity + } + } else { + existingEntityIndex[entity.id] = entity + } + } + + for (const scene of newerClap.scenes) { + if (existingSceneIndex[scene.id]) { + existingSceneIndex[scene.id] = { + ...existingSceneIndex[scene.id], + ...scene + } + } else { + existingSceneIndex[scene.id] = scene + } + } + + for (const segment of newerClap.segments) { + if (existingSegmentIndex[segment.id]) { + existingSegmentIndex[segment.id] = { + ...existingSegmentIndex[segment.id], + ...segment + } + } else { + existingSegmentIndex[segment.id] = segment + } + } + + // sort by ascending line + clap.scenes.sort((a, b) => a.startAtLine - b.startAtLine) + + // sort by ascending start time + // in case of equivalent time (which happens a lot) we sort by ascending track number + clap.segments.sort((a, b) => { + if (a.startTimeInMs === b.startTimeInMs) { + return a.track - b.track + } else { + return a.startTimeInMs - b.startTimeInMs + } + }) + + // we re-create the entity index + // create some temporary indexes for faster checking + for (const entity of clap.entities) { + clap.entityIndex[entity.id] = entity + } + + return clap +} \ No newline at end of file diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index f4126e4e..7970228f 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -105,6 +105,20 @@ export type ClapEntityTimbre = "high" | "neutral" | "deep" export type ClapEntityAudioEngine = "ElevenLabs" | "XTTS" | "Parler-TTS" +export enum ClapSegmentFilteringMode { + // the start of a segment must be within the range + START, + + // the end of a segment must be within the range + END, + + // any end of a segment must be within the range + ANY, + + // both ends of a segment must be within the range + BOTH, +} + export type ClapVoice = { name: string gender: ClapEntityGender diff --git a/packages/aitube-clap/src/utils/filterSegments.ts b/packages/aitube-clap/src/utils/filterSegments.ts new file mode 100644 index 00000000..5e83f089 --- /dev/null +++ b/packages/aitube-clap/src/utils/filterSegments.ts @@ -0,0 +1,30 @@ +import { ClapSegment, ClapSegmentFilteringMode } from "@/types" +import { filterSegmentsWithinRange } from "./filterSegmentsWithinRange" + +/** + * Return all the segments within the provided reference segment, for the given mode: + * + * - START: the start of a segment must be within the provided segment's range + * - END: the end of a segment must be within the provided segment's range + * - ANY: any end of a segment must be within the provided segment's range + * - BOTH: both ends of a segment must be within the provided segment's range + * + * @param mode + * @param segment + * @param segments + * @returns + */ +export function filterSegments( + mode: ClapSegmentFilteringMode, + segment?: ClapSegment, + segments?: ClapSegment[] +): ClapSegment[] { + + const array = Array.isArray(segments) ? segments : [] + + if (!segment || !array.length) { return [] } + + const { startTimeInMs, endTimeInMs } = segment + + return filterSegmentsWithinRange(mode, startTimeInMs, endTimeInMs, segments) +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts b/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts new file mode 100644 index 00000000..7a8bdba4 --- /dev/null +++ b/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts @@ -0,0 +1,52 @@ +import { ClapSegment, ClapSegmentFilteringMode } from "@/types" + +/** + * Return all the segments within the provided range, for the given mode: + * + * - START: the start of a segment must be within the range + * - END: the end of a segment must be within the range + * - ANY: any end of a segment must be within the range + * - BOTH: both ends of a segment must be within the range + * + * @param mode + * @param startTimeInMs + * @param endTimeInMs + * @param segments + * @returns + */ +export function filterSegmentsWithinRange( + mode: ClapSegmentFilteringMode, + startTimeInMs: number, + endTimeInMs: number, + segments?: ClapSegment[] +): ClapSegment[] { + + const array = Array.isArray(segments) ? segments : [] + + if (!array.length) { return [] } + + switch (mode) { + case ClapSegmentFilteringMode.START: + return array.filter(s => startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + case ClapSegmentFilteringMode.END: + return array.filter(s => startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + case ClapSegmentFilteringMode.BOTH: + return array.filter(s => startTimeInMs <= s.startTimeInMs && s.endTimeInMs <= endTimeInMs) + + // less efficient version is: + // array.filter(s => + // (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + // && + // (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + // ) + + case ClapSegmentFilteringMode.ANY: + return array.filter(s => + (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + || + (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + ) + default: + throw new Error(`unknown ClapSegmentFilteringMode "${mode}"`) + } +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index cf0ada55..bfb3701d 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -1,3 +1,5 @@ +export { filterSegments } from './filterSegments' +export { filterSegmentsWithinRange } from './filterSegmentsWithinRange' export { generateSeed } from './generateSeed' export { getClapAssetSourceType } from './getClapAssetSourceType' export { getValidNumber } from './getValidNumber' From 31cd236b5c95e4326156db3d8d8111205db2cb33 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 16:54:19 +0200 Subject: [PATCH 022/346] 0.0.9 (also add category filtering) --- packages/aitube-clap/package.json | 2 +- .../aitube-clap/src/utils/filterSegments.ts | 8 +++--- .../src/utils/filterSegmentsWithinRange.ts | 25 +++++++++++-------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index acffd27b..6896e665 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/utils/filterSegments.ts b/packages/aitube-clap/src/utils/filterSegments.ts index 5e83f089..1fc4653f 100644 --- a/packages/aitube-clap/src/utils/filterSegments.ts +++ b/packages/aitube-clap/src/utils/filterSegments.ts @@ -1,4 +1,4 @@ -import { ClapSegment, ClapSegmentFilteringMode } from "@/types" +import { ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode } from "@/types" import { filterSegmentsWithinRange } from "./filterSegmentsWithinRange" /** @@ -12,12 +12,14 @@ import { filterSegmentsWithinRange } from "./filterSegmentsWithinRange" * @param mode * @param segment * @param segments + * @param category optional, to also filter by category * @returns */ export function filterSegments( mode: ClapSegmentFilteringMode, segment?: ClapSegment, - segments?: ClapSegment[] + segments?: ClapSegment[], + category?: ClapSegmentCategory ): ClapSegment[] { const array = Array.isArray(segments) ? segments : [] @@ -26,5 +28,5 @@ export function filterSegments( const { startTimeInMs, endTimeInMs } = segment - return filterSegmentsWithinRange(mode, startTimeInMs, endTimeInMs, segments) + return filterSegmentsWithinRange(mode, startTimeInMs, endTimeInMs, segments, category) } \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts b/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts index 7a8bdba4..ceebc630 100644 --- a/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts +++ b/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts @@ -1,4 +1,4 @@ -import { ClapSegment, ClapSegmentFilteringMode } from "@/types" +import { ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode } from "@/types" /** * Return all the segments within the provided range, for the given mode: @@ -11,14 +11,16 @@ import { ClapSegment, ClapSegmentFilteringMode } from "@/types" * @param mode * @param startTimeInMs * @param endTimeInMs - * @param segments + * @param segments + * @param category optional, to also filter by category * @returns */ export function filterSegmentsWithinRange( mode: ClapSegmentFilteringMode, startTimeInMs: number, endTimeInMs: number, - segments?: ClapSegment[] + segments?: ClapSegment[], + category?: ClapSegmentCategory ): ClapSegment[] { const array = Array.isArray(segments) ? segments : [] @@ -27,24 +29,27 @@ export function filterSegmentsWithinRange( switch (mode) { case ClapSegmentFilteringMode.START: - return array.filter(s => startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + return array.filter(s => (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) && (category ? s.category === category : true)) case ClapSegmentFilteringMode.END: - return array.filter(s => startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + return array.filter(s => (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) && (category ? s.category === category : true)) case ClapSegmentFilteringMode.BOTH: - return array.filter(s => startTimeInMs <= s.startTimeInMs && s.endTimeInMs <= endTimeInMs) + return array.filter(s => (startTimeInMs <= s.startTimeInMs && s.endTimeInMs <= endTimeInMs) && (category ? s.category === category : true)) // less efficient version is: // array.filter(s => // (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) // && // (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + // && + // (category ? s.category === category : true) // ) case ClapSegmentFilteringMode.ANY: - return array.filter(s => - (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) - || - (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + return array.filter(s => ( + (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + || + (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + ) && (category ? s.category === category : true) ) default: throw new Error(`unknown ClapSegmentFilteringMode "${mode}"`) From 7c5f5b1fd6194e0242f44725897e97b9d7510319 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 16:57:35 +0200 Subject: [PATCH 023/346] 0.0.9 --- packages/aitube-client/bun.lockb | Bin 18050 -> 17668 bytes packages/aitube-client/package.json | 8 ++------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 9823b76ad76548ff9b4294df85d38449f53dec3a..7385d3fb7ade031d537d6c2480dd2341caeaba12 100755 GIT binary patch delta 3792 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 TuF3UE1dvAAQ~p6SrXKh=wL13N diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 307a8b2c..535da3c7 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -22,11 +22,7 @@ }, "peerDependencies": { "typescript": "^5.4.5", - "@aitube/clap": "0.0.7" - }, - "dependencies": { - "uuid": "^9.0.1", - "yaml": "^2.4.1" + "@aitube/clap": "0.0.9" }, "repository": { "type": "git", From 5a6850f37bad909a6298207c2016e9922c248269 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 17:00:02 +0200 Subject: [PATCH 024/346] 0.0.1 --- packages/aitube-engine/bun.lockb | Bin 18050 -> 17668 bytes packages/aitube-engine/package.json | 10 +++------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 4d8faa1d687c03b17da603e272b3cd826b994092..9de2befe9a5323942a5703f05a9ead067caf0978 100755 GIT binary patch delta 3720 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 CN7B^* diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 080045f4..00a47999 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,15 +18,11 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.7" + "@aitube/clap": "0.0.9" }, "peerDependencies": { "typescript": "^5.4.5", - "@aitube/clap": "0.0.7" - }, - "dependencies": { - "uuid": "^9.0.1", - "yaml": "^2.4.1" + "@aitube/clap": "0.0.9" }, "repository": { "type": "git", From 879f4cd2ebe8129c2046c6371d4a4b62bbef7a82 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 17:09:09 +0200 Subject: [PATCH 025/346] don't forget to export the ClapSegmentFilteringMode --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 6896e665..d16f2004 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.9", + "version": "0.0.10", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 4d234e3d..1d61bb36 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -9,6 +9,7 @@ export { ClapEntityRegion, ClapEntityTimbre, ClapEntityAudioEngine, + ClapSegmentFilteringMode, ClapVoice, ClapHeader, ClapMeta, From b0b352dbfa6a4d4125bf1d7898bf2b8cc792c5a3 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 17:13:08 +0200 Subject: [PATCH 026/346] 0.0.11 --- packages/aitube-client/bun.lockb | Bin 17668 -> 17636 bytes packages/aitube-client/package.json | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 7385d3fb7ade031d537d6c2480dd2341caeaba12..55910659bba744e21b4f4a9bc3703deef46365f9 100755 GIT binary patch delta 1304 zcmb`HT}YEr7{}k^=Un^J`O&s=n`NWavv-z`LCHj<3#}-Ehyt|_OsEjI5k{~eGn6i7 z2fB@dx{68$kr6>bnRruoMy)A$69fhk^mWny|2kL{8 zNJ;;Nme{vXOS^B&+5Wdz&GOVM?_4I*({^;c`tI|E`+MgOPV9>aIXM;(qFzl3uW+Z| zh<=MGQ+1VE~PNhyea_8 zkfq6N=H9p$mRc340n8dEv;?S(16lx$TEMcY13usfJTwo4ihCmnPC)5+`KOlmjGxie!q(?EizP%WY#kp7@Dvlx;RomsSq8Otz( z$U2)s2x`}&bhs9T8`}hJf&vMG!6@5hL=oZ;)calsav`|#gNOH=^L=yp&bjBE`B5=^ zON{A0ZJ|}`@-%;M+&ez67 z1~h3Ve9LoXrLu4fpw{K`RBp5ta9sloD%Tr1L9C{1tjWwSE9(P_{AqV3xm75aT21-W z9e{N^bJ_xBtW<8f%Uu1hoUU=l$@RYEHSYN2I$p9|uzR}J<$jHq&Ustg`-^v`hn}Y^ ztxp<`|49v5-a1BKT#dFaM$11A|N5P+e%(Fu_uIq+|FxdPRIs79bKu_f$1}6ByoW6# zCoXqRH5nQ2pjEi!Vcp$YhEK&-`Fi-t`8hp+YkWD>0#K0~`=P9%RlM?%?k=muh!uQ9 ztS$mo@{QhMJ~7rZ%X->^PbUmm-3<6l_`GPp60i}J0xMuo+W{@+2DBpW$-dZ!4rsS> zuo*Z(5Cj0+aYWgMK`o$l>VOZ>UOY4p$wSeXUO=DHvph~!Zq6Ln&0Qg%WF~-r6)A#W z#EkqJ)TAS%3RT_?SG2G(G@cqOoSW-YZ%h`8pdQpCSgi**R%$7GZ2acYuEk<;DvA_L z6OgAv2ZU-o4b2rSZ)0)r7l=c0BHYdkL&zWDHcKj(=#$Y%drkaGfA3(=K&(IBW)1_1 YMC{zz#3jEuGww%rmx_on+hG^~0D4c7yZ`_I diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 535da3c7..b01cf122 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.9", + "version": "0.0.11", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,11 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.7" + "@aitube/clap": "0.0.10" }, "peerDependencies": { - "typescript": "^5.4.5", - "@aitube/clap": "0.0.9" + "@aitube/clap": "0.0.10" }, "repository": { "type": "git", From f03e67c82d6334563bb0aa9bb3ac1d7bc85bdd8d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 3 May 2024 17:14:27 +0200 Subject: [PATCH 027/346] 0.0.2 --- packages/aitube-engine/bun.lockb | Bin 17668 -> 17637 bytes packages/aitube-engine/package.json | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 9de2befe9a5323942a5703f05a9ead067caf0978..34124c5bd28d960a20be6c57fe0bbb54bc83a753 100755 GIT binary patch delta 1345 zcmb`HPe_wt9LL|sIh)gM&S`5ioetK>KkxQtI!1HHvCg%OD9Tf#=-&7HI!U67OZdcJoPFbV-d!8Gbvi24rP-hm0l6f6!Ykhj zx0uv7MZD4$Rg@{EXjYjt1?7E{MNG?-y<6z=q5W8PAH0M{6~F?_zy?Zy1JHIVRubkJp zA8@R-sHM;Y#daH%F)S0GTu@!LUbGmY0e;1cuam24Ji9#~y^Lo`@ac2_rh;EEn$L@+ zR}QQIZ&RrRe9hb!%c~l&3|X3d&D8dQz!uqecL;MCrJ&thz delta 1373 zcmcJPT}YE*6vy|d)6MqfOqa`a=4es*Zqv3kDpMr7ux}8HBC`)lun?WZBG{m^l!D0v z5p)p+T|^(Y27wV#K_B8x-GmWCrMw6Vqb^G8qW}N(4R#@TwF5u?&-0wKhx45GoK5wM za|0rwRGkU*{Qf$<<(4vf?8Bu(<@lS*v2?hte*Zw}-4~NX+s7h2z_OW=7eb>yZadM%iK6Bp%A!mh~|Me1t|7zzFof0&;*2&@z>A zMSyAtG%Dj4a|5I111HD@%K+mm01X;b9aVFCU8XW{IiOZ+ekw0o0eJ2KG%C+maRZxA znb;cDJEx5I>f{frJ;tm2nrlAgPwN2V)@mAn(lV7-qTZ_gS8f)laV*%?_e&e;>T=DyK!^P~Dn%f}~gyZ=V|3NE-C^PisjnKa#h zetKqj@bT6w%FF4So161rznYDVRC{Xee^O~zk6GB|E~R*52|g85W%uxt^K&`?&)7NC zJW!^sYoLtbsJP?}rMP4%R*Ya1F}eVh%MqnXZ865u%Xp3jTPFw@T?^PIY%h*qAy@=V zzzmqvYQPaI1{_6>C-Y(+3gEbvf+e5`_<$E+I(F+;Vo?b=I@O>GaJ=|vK9Y~(T)F_~ zlrziclxutXc&^?GnUHBO{&A%6eG<>)l+Pn={!)Dy9;dtBp*-c$HzOJ=N}k^ zPw^@Ay8)gSpPAir?P6=oFM~J`h6@AZm2LiQ!kN0~zmq4Ta&NFssFxXSA^ZlmQw{|i zSvr{f9&9kiHAklmhZ-v)(XOLChr2tvA`R-&+uPf5 Date: Sat, 4 May 2024 01:10:24 +0200 Subject: [PATCH 028/346] add parameter for the completion mode --- packages/aitube-client/package.json | 2 +- .../src/api/editClapDialogues.ts | 25 ++++++++++++++++- .../aitube-client/src/api/editClapEntities.ts | 26 ++++++++++++++++- .../src/api/editClapStoryboards.ts | 24 +++++++++++++++- .../aitube-client/src/api/editClapVideos.ts | 24 +++++++++++++++- .../src/api/exportClapToVideo.ts | 7 +++++ packages/aitube-client/src/api/index.ts | 3 +- packages/aitube-client/src/api/types.ts | 28 +++++++++++++++++++ packages/aitube-client/src/index.ts | 1 + 9 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 packages/aitube-client/src/api/types.ts diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index b01cf122..d01f837d 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.11", + "version": "0.0.12", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts index 815c140f..a41dc109 100644 --- a/packages/aitube-client/src/api/editClapDialogues.ts +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -1,12 +1,26 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" +import { ClapCompletionMode } from "./types" export async function editClapDialogues({ clap, + completionMode = ClapCompletionMode.MERGE, token, }: { clap: ClapProject + + /** + * Completion mode (optional, defaults to "merge") + * + * Possible values are: + * - full: the API and the client will return a full clap file. This is a very convenient and simple mode, but it is also very ineficient, so it should not be used for intensive applications. + * - partial: the API and the client will return a partial clap file, containing only the new values and changes. This is useful for real-time applications and streaming. + * - merge: the API will return a partial clap file, and the client will return a merge of the original with the new values. This is safe to run, there are no side-effects. + * - replace: the API will return a partial clap file, and the client will replace the original. This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + completionMode?: ClapCompletionMode + token?: string }): Promise { @@ -14,7 +28,16 @@ export async function editClapDialogues({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/dialogues`, { + const newClap = await fetchClap( + `${aitubeApiUrl}edit/dialogues${ + typeof completionMode === "string" + ? `?c=${ + completionMode === ClapCompletionMode.FULL + ? "full" + : "partial" + }` + : "" + }`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index bd4caf9c..73061acc 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -1,12 +1,27 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" +import { ClapCompletionMode } from "./types" export async function editClapEntities({ clap, + completionMode = ClapCompletionMode.MERGE, token, }: { + // A ClapProject instance clap: ClapProject + + /** + * Completion mode (optional, defaults to "merge") + * + * Possible values are: + * - full: the API and the client will return a full clap file. This is a very convenient and simple mode, but it is also very ineficient, so it should not be used for intensive applications. + * - partial: the API and the client will return a partial clap file, containing only the new values and changes. This is useful for real-time applications and streaming. + * - merge: the API will return a partial clap file, and the client will return a merge of the original with the new values. This is safe to run, there are no side-effects. + * - replace: the API will return a partial clap file, and the client will replace the original. This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + completionMode?: ClapCompletionMode + token?: string }): Promise { @@ -14,7 +29,16 @@ export async function editClapEntities({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/entities`, { + const newClap = await fetchClap( + `${aitubeApiUrl}edit/entities${ + typeof completionMode === "string" + ? `?c=${ + completionMode === ClapCompletionMode.FULL + ? "full" + : "partial" + }` + : "" + }`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index d8899b7f..1937181b 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -1,12 +1,26 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" +import { ClapCompletionMode } from "./types" export async function editClapStoryboards({ clap, + completionMode = ClapCompletionMode.MERGE, token, }: { clap: ClapProject + + /** + * Completion mode (optional, defaults to "merge") + * + * Possible values are: + * - full: the API and the client will return a full clap file. This is a very convenient and simple mode, but it is also very ineficient, so it should not be used for intensive applications. + * - partial: the API and the client will return a partial clap file, containing only the new values and changes. This is useful for real-time applications and streaming. + * - merge: the API will return a partial clap file, and the client will return a merge of the original with the new values. This is safe to run, there are no side-effects. + * - replace: the API will return a partial clap file, and the client will replace the original. This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + completionMode?: ClapCompletionMode + token?: string }): Promise { @@ -14,7 +28,15 @@ export async function editClapStoryboards({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/storyboards`, { + const newClap = await fetchClap(`${aitubeApiUrl}edit/storyboards${ + typeof completionMode === "string" + ? `?c=${ + completionMode === ClapCompletionMode.FULL + ? "full" + : "partial" + }` + : "" + }`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts index 58243296..c6a92c7e 100644 --- a/packages/aitube-client/src/api/editClapVideos.ts +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -1,12 +1,26 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/config" +import { ClapCompletionMode } from "./types" export async function editClapVideos({ clap, + completionMode = ClapCompletionMode.MERGE, token, }: { clap: ClapProject + + /** + * Completion mode (optional, defaults to "merge") + * + * Possible values are: + * - full: the API and the client will return a full clap file. This is a very convenient and simple mode, but it is also very ineficient, so it should not be used for intensive applications. + * - partial: the API and the client will return a partial clap file, containing only the new values and changes. This is useful for real-time applications and streaming. + * - merge: the API will return a partial clap file, and the client will return a merge of the original with the new values. This is safe to run, there are no side-effects. + * - replace: the API will return a partial clap file, and the client will replace the original. This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + completionMode?: ClapCompletionMode + token?: string }): Promise { @@ -14,7 +28,15 @@ export async function editClapVideos({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/videos`, { + const newClap = await fetchClap(`${aitubeApiUrl}edit/videos${ + typeof completionMode === "string" + ? `?c=${ + completionMode === ClapCompletionMode.FULL + ? "full" + : "partial" + }` + : "" + }`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/exportClapToVideo.ts b/packages/aitube-client/src/api/exportClapToVideo.ts index afd7f619..b9ae0836 100644 --- a/packages/aitube-client/src/api/exportClapToVideo.ts +++ b/packages/aitube-client/src/api/exportClapToVideo.ts @@ -11,7 +11,14 @@ export async function exportClapToVideo({ token, }: { clap: ClapProject + + /** + * Desired output video format (defaults to "mp4") + * + * Can be either "mp4" or "webm" + */ format?: SupportedExportFormat + token?: string }): Promise { diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index 6c52655e..1935fba5 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -3,4 +3,5 @@ export { editClapStoryboards } from "./editClapStoryboards" export { editClapVideos } from "./editClapVideos" export { editClapDialogues } from "./editClapDialogues" export { editClapEntities } from "./editClapEntities" -export { createClap } from "./createClap" \ No newline at end of file +export { createClap } from "./createClap" +export { ClapCompletionMode } from "./types" \ No newline at end of file diff --git a/packages/aitube-client/src/api/types.ts b/packages/aitube-client/src/api/types.ts new file mode 100644 index 00000000..b95dd79d --- /dev/null +++ b/packages/aitube-client/src/api/types.ts @@ -0,0 +1,28 @@ +export enum ClapCompletionMode { + /** + * the API and the client will return a full clap file. + * This is a very convenient and simple mode, but it is also very ineficient, + * so it should not be used for intensive applications. + */ + FULL = "full", + + /** + * the API and the client will return a partial clap file containing only the changes, + * containing only the new values and changes. + * This is useful for real-time applications and streaming. + */ + PARTIAL = "partial", + + /** + * the API will return a partial clap file containing only the changes, + * and the client will return a merge of the original with the new values. + * This is safe to run, there are no side-effects. + */ + MERGE = "merge", + + /** + * the API will return a partial clap file, and the client will replace the original. + * This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + REPLACE = "replace" +} \ No newline at end of file diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index a2c15d69..93da5e86 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -6,6 +6,7 @@ export { editClapStoryboards, editClapVideos, exportClapToVideo, + ClapCompletionMode, } from './api' export { From c046d6a6d14b6279bd9ab94f79873134cb5dde0f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 5 May 2024 13:18:45 +0200 Subject: [PATCH 029/346] bump to 0.0.13 --- packages/aitube-client/README.md | 14 ++++++- packages/aitube-client/bun.lockb | Bin 17636 -> 19117 bytes packages/aitube-client/package.json | 7 +++- packages/aitube-client/src/api/createClap.ts | 8 ++-- .../src/api/editClapDialogues.ts | 5 ++- .../aitube-client/src/api/editClapEntities.ts | 36 ++++++++++++------ .../src/api/editClapStoryboards.ts | 5 ++- .../aitube-client/src/api/editClapVideos.ts | 5 ++- .../src/api/exportClapToVideo.ts | 2 +- packages/aitube-client/src/api/index.ts | 1 - .../src/{ => constants}/config.ts | 7 +--- .../src/constants/defaultValues.ts | 10 +++++ packages/aitube-client/src/constants/index.ts | 18 +++++++++ .../src/{api => constants}/types.ts | 22 +++++++++++ packages/aitube-client/src/index.ts | 11 ++++-- packages/aitube-client/src/parsers/index.ts | 3 ++ .../src/parsers/parseEntityPrompt.ts | 27 +++++++++++++ .../aitube-client/src/parsers/parseString.ts | 7 ++++ .../src/parsers/parseStringArray.ts | 9 +++++ 19 files changed, 162 insertions(+), 35 deletions(-) rename packages/aitube-client/src/{ => constants}/config.ts (61%) create mode 100644 packages/aitube-client/src/constants/defaultValues.ts create mode 100644 packages/aitube-client/src/constants/index.ts rename packages/aitube-client/src/{api => constants}/types.ts (63%) create mode 100644 packages/aitube-client/src/parsers/index.ts create mode 100644 packages/aitube-client/src/parsers/parseEntityPrompt.ts create mode 100644 packages/aitube-client/src/parsers/parseString.ts create mode 100644 packages/aitube-client/src/parsers/parseStringArray.ts diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index a3a4707c..efad409e 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -28,11 +28,21 @@ npm install @aitube/client ```typescript import { createClap, - editClapEntities, editClapDialogues, + editClapEntities, editClapStoryboards, editClapVideos, - exportClapToVideo + exportClapToVideo, + defaultAitubeHostname, + defaultClapWidth, + defaultClapHeight, + defaultExportFormat, + aitubeUrl, + aitubeApiVersion, + aitubeApiUrl, + ClapCompletionMode, + ClapEntityPrompt, + SupportedExportFormat } from '@aitube/client'; const ultraSecret = "ultra secret token unavailable to common mortals" diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 55910659bba744e21b4f4a9bc3703deef46365f9..824b042dfde5f9a3c11da32d961ca46e8b383785 100755 GIT binary patch delta 4353 zcmds4eN>cH8h_t+W?*LEm2Vhe1{f4kY=)VEVL)KQ4_I~ZgI1lytrZazL_P-GEO&(x z+G=Y~j}wHBeEbXt?gBF33e*ETfw4eqfcxs!_^N6JVP!+pa;Su5 zk|2bke@$IuU2|1yYcIGC+#A3Qyzn;x z97R7n)*T`U3BWEOFL)UJjJJpS=N||1y#Hl~=a=zBc9T5{8gj!kcE}7X+#esn+g8<8 zuR^4Ctu^avfcv25h}MVEBVtPQgK&-m?ga8QjZ80#DYgN`#A-+A+siIBzET}___e#7 zP2H{yzc`RHd+z6ZdQ=<8xb%?YojbSZoXcDP*Z$AMCqzvNX6Wd#5SOkGE6oH`DQpz1 zh>g>*)+O6SL0A9=rJ#mp3hhv7rTazdRk@|NL>dBwOO&N{ORFWSSG#p55gRJp5z6x= zjf#e#EI~=8LWu>{F6mws)oa|+J1Xi0nAJ1{Sf{3}5V!6b)PP57=`oE<+MuCcCF>X=zC7*3HuT?I|AXIs;5uOFE*ZUY%Pv4*6w!IvR%mAq`@rr2n+~SH$$Q^#X2^X-IZQ-HXSd02a7Z-1JnX%2dkricIz6+|rjA zK5l9O;uBa<5`K!5_TLas0KXN2hAa^Yc%1|x2EtmrtO~{fxiO;p{O%}?5rq&;5MC_} z!t=}!Zj7v-zyxh9^0*8L<3tEIARUO%Rj@8g(fE;VSOWZd$UbEU`WbmV>Y&)pVLh25 zQCD%xwv^hf4b`hQPwF(>CoCzzg&YAZQc+Sd~Gr^2eM zuS|Vr?U}b1@0Vs&X(}=YZL^MzJiC85;ql*1tV;i9*UaS?9{xwSb|VwrI%hToBgJ*_1Nm4@2uIqwxW0S2X{T%_Uok|_ayE;wQ6MKqcxuHZF_wUk5uO$ zIP86|x$r>9b~42n%D+6;(qeitC3a+__27`}lhA|^p~F=T5wBi#R=2g=dSE8*S=O#HZQDwe*d;P?)xvCtv&nO#^SF9 zbK@Rw)ZM!>9{R~shg9mLUmE(R9P7T1EO7>UKgJ`5kv-N+7vf~v66+CVIuEurUZ&DG zj~GFl;=D8~L8gC$MbWf)FMS5KC*C8*&@k9OgG`GOJYpQ}Oz_gpi85&n9x;I`3|`VE z$@C;xB8iD!It*5m=n<3YF|bw1GQ}l%L=#mddC6du=@?ilMJ0RbIM~``k7%YBz}A^$ z$}oDw@zi4U(xeob-UQ1avk7?u>oR%7OgaO0Pb%`1;t?m)ohe?*Pm}3=uqk9uMSNge zQaz%D&Zl}sD;1=9mjt&LPOAEkHx_)5v2($;$nwoeM+d4l&bSiht4ulClljQ$k*s|i zpB>ax&&^0JFG?#2a;G&Q0Q}&CbO+nvciS&_);2yrP|^nXBoFc>(P< zr^O#fKYu;&Miu-vIxbSmgvI?=%;!XG`D)!$IC${a@dDjB!OI$bv#+MDt**u=h4V;i zR!w?5;}b269@X1;GekS>*laCQ_Q9*)_#11dK(L~+y9YTx_`JLU!hQV7#+>y@5Z2iO zhyz_P27dFmAdkU$E{uop9NrRmJf9RPyc|z(29!9mg;WUZf}66S?Ae0wb`G7*PA7G? zv7LwU-i-54vB%T-Oyj+nA9bWc*~|GH!!gMpWBg&oX;e-Q_McC$cnF_vQ4lUE$G|@G zNtOsnhVZG!9&pn56heOH3+ebV8Nx>uA7gxUadJ2r9K0FA0jELuI7FaIT+F$TQOlV? z8_ngo+If8z_KnwJ^PD5joe1HSa4tEA96y`kxHxW(nPca;`FAjGj+f(R7dQ@%CmO!E8`62S@K#PA@Fhm(*7VFNswW8?a8Jj^*p&c!6i*j!|S-vHrF`pP6-LPtt7M@&gi>-1l42n)6$uO8*p|0UC@u+$$j8t?DvyU! zL$1LXyphez9@v%m@?b0mm+>~AUz{Dqu3nX!a z0|j?j^B)YS@H~U@`vZ6@;fBj&NuEI(kf}1ST;Cjc@A?XNB{{ZXob)f(N delta 3402 zcmeHK3vX1%6~1%#z3XNDT6_K6_4V<}_<3dA-s*jt0mqs5R2 zyD5-@jD&ScR4Is%L{!LvHq@mxgtS0P5<*2=l|(#3!4j1k*Mv}1aB1T9JNNEQla~C0 zj&%0i@64Gq=X^7F?(E?`;>HfKJ23tEy7iM2w-y`-oLhBi&>rY~&wKG|>>1_hojHe2 zkNtGf#V6)UY6}b{y#03{)`0dqO_Bxzc(g;W>sr08ZKWiw>h5XhUXPF@2kfi6)^zo@ ztzX{`Yy)7}B5@nj|R~ zdNwpq*o%JFHD)cq05to5B@pm`$I-`+TC{}pICoJDCv?dwNfjLUJRVqY?Ce_6iO#O| z9eo|pttgKxsvFgRgkq1%Rt?Kz+ZATu37->DQbF_J$w(y&#rJp(eIgo{BPa1=<< zf*B(69TO#Oib(;lkJ4fDEP1Dy#%+r29T>DJ*BT=>2{iH~NF1mkh14nKJ`0W8F#tvm zYoi*>Y_w9+p~wrZGz_)fO5+a2b^~0qi;<(qej6pz6x$B)7lKh%YkTuQ2({e=ny>W% z&B4My3Z#}{dI2a(HyyL&_w6+9RAkvf)zcLDaR()#wmN7S>MYg?%AQ8mE+wN8%f%va>eO)pTzc8>XkMU)G%4 zH&S-i9GzcljxqznjWy#S1GEQej)QfP1T|-P+c-)D!cEuw{C}pj-S7od&aW^NWcY+RPJIS3BZ|41^H{-6I-iOYAGuiXqTbHj6b&nShUU+@*hBlfIK17dAQtGzwJii3*GV4$IjJNsK^~8jw&lfzi~a!g9#CC=Tx8Jq z@)OjT=cGRaWl>E*f~xYJw5K30+%yJs5olgvT;$SFVS;{8;H19;WIA+s|Ed z{z4g>cICwH*L}8OyXD2QM)R*W-Z_%?lT(}jact;#(@TLfw_ckUH^2MN{S9YJD?^$8 zq-A~&eNY+~4^v6m3c66{%Nami{(kV=p?@3)BwAGY}k zI5k%$=nX^FNU-Xz)gI-S5$$4tg0r&88mj7_`j^(&TnXVJ(;s zPRjOBO5^;OJgH~?yt5B)GcSZ=@T<--_)yA+z`s(eNg4TVF3^nHyN_pU>d?3_gD!`Z z{+Te$+Iy- z6%gj47*Y=LLwu6-hj&INLDb;y=lNMUH=c*% zGdIi&^Tors4z7*4V@{bbe%9;c`nXP>5*tFzA2%O0Ev}L4VmsToZmyqs0A8goBp0pc z%*AspoHyssm}}zV%OI)Z)!Ives~}7cYd-s#NPPpO^QxfzI80MB=g2XM=G1vuEv?%c z*0=1+#I8^Bmn@nmi{&-JKy4r*=@+BC%*^g5N?jMwQyZuWV42N=o)3Fum!Oxzp+fy8 zxGnwZ?(VH(FGmObsHh5`Lbxa8NLnD+kZW)&PmfnWgH>6gSr%Z27; ze>*#-h6wUhSq5r~cnW=31aLQSaMM&z?f!yBqgalCoXjBu4MaTsze_nx-hZz1^iw}P zAd690z}kR%v4k%2kCmRZ`HvxXM4NRA9w2|<*(GnE-sjqHlEufcU=_Z&OD_K7MA_z^ z^d%S*)k>d^mB(TZ)YxzTwR(QGQ5J4kvat_vF{Q$&r%=DQe%>wK==IONjIlGdvDXar zc+?ZtFQ!Yy-YfI(z0wPZIxQjniaPP^(#2OBPR>=QRcTmgqJ2@1tVVEq!I*ygZC_h9 zdyc~ug=>mST>B=FhJL+WG~@JZdGEiS4TrFn1{m|jJmIhBTkY_9q z!h%a*AN0JHPQ*O&B`bXx3(2iEve!3-Yw=DooA!?rMUU(sypJSnF%#BZzf}*-Sh}m? z=_ p*8NuWO`B?sXx&Y7>G-VWBdxQy2tzP1b7V|;(=K8o`yO+Ne*-nkU#I{8 diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index d01f837d..214517f8 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.12", + "version": "0.0.13", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -38,5 +38,8 @@ "dist/*.js", "dist/*.d.ts", "dist/**/*.d.ts" - ] + ], + "dependencies": { + "query-string": "^9.0.0" + } } diff --git a/packages/aitube-client/src/api/createClap.ts b/packages/aitube-client/src/api/createClap.ts index c1d306bb..0d17c64f 100644 --- a/packages/aitube-client/src/api/createClap.ts +++ b/packages/aitube-client/src/api/createClap.ts @@ -1,11 +1,13 @@ import { ClapProject, fetchClap } from "@aitube/clap" -import { aitubeApiUrl } from "@/config" +import { aitubeApiUrl } from "@/constants/config" + +import { defaultClapHeight, defaultClapWidth } from "@/constants/defaultValues" export async function createClap({ prompt, - height = 512, - width = 288, + height = defaultClapHeight, + width = defaultClapWidth, token, }: { prompt: string diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts index a41dc109..9d702768 100644 --- a/packages/aitube-client/src/api/editClapDialogues.ts +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -1,7 +1,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" -import { aitubeApiUrl } from "@/config" -import { ClapCompletionMode } from "./types" +import { aitubeApiUrl } from "@/constants/config" + +import { ClapCompletionMode } from "../constants/types" export async function editClapDialogues({ clap, diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index 73061acc..44421e8d 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -1,16 +1,22 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import queryString from "query-string" -import { aitubeApiUrl } from "@/config" -import { ClapCompletionMode } from "./types" +import { aitubeApiUrl } from "@/constants/config" + +import { ClapCompletionMode, ClapEntityPrompt } from "../constants/types" export async function editClapEntities({ clap, + entityPrompts = [], completionMode = ClapCompletionMode.MERGE, token, }: { // A ClapProject instance clap: ClapProject + // a list of entity prompts + entityPrompts: ClapEntityPrompt[], + /** * Completion mode (optional, defaults to "merge") * @@ -29,16 +35,24 @@ export async function editClapEntities({ const hasToken = typeof token === "string" && token.length > 0 + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode === ClapCompletionMode.FULL + ? "full" + : "partial" + } + + if (entityPrompts.length) { + // if "params.e = JSON.stringify(item)" works with UTF-8 characters, + // then we don't need to import "js-base64" + // otherwise you will have to do: + // params.e = jsBase64.encode(JSON.stringify(item)) + params.e = JSON.stringify(entityPrompts) + } + const newClap = await fetchClap( - `${aitubeApiUrl}edit/entities${ - typeof completionMode === "string" - ? `?c=${ - completionMode === ClapCompletionMode.FULL - ? "full" - : "partial" - }` - : "" - }`, { + `${aitubeApiUrl}edit/entities?${queryString.stringify(params)}`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index 1937181b..be8ddbad 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -1,7 +1,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" -import { aitubeApiUrl } from "@/config" -import { ClapCompletionMode } from "./types" +import { aitubeApiUrl } from "@/constants/config" + +import { ClapCompletionMode } from "../constants/types" export async function editClapStoryboards({ clap, diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts index c6a92c7e..1673194a 100644 --- a/packages/aitube-client/src/api/editClapVideos.ts +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -1,7 +1,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" -import { aitubeApiUrl } from "@/config" -import { ClapCompletionMode } from "./types" +import { aitubeApiUrl } from "@/constants/config" + +import { ClapCompletionMode } from "../constants/types" export async function editClapVideos({ clap, diff --git a/packages/aitube-client/src/api/exportClapToVideo.ts b/packages/aitube-client/src/api/exportClapToVideo.ts index b9ae0836..b5857b26 100644 --- a/packages/aitube-client/src/api/exportClapToVideo.ts +++ b/packages/aitube-client/src/api/exportClapToVideo.ts @@ -1,6 +1,6 @@ import { ClapProject, serializeClap, blobToDataUri } from "@aitube/clap" -import { aitubeApiUrl } from "@/config" +import { aitubeApiUrl } from "@/constants/config" export type SupportedExportFormat = "mp4" | "webm" export const defaultExportFormat = "mp4" diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index 1935fba5..f8f9b6af 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -4,4 +4,3 @@ export { editClapVideos } from "./editClapVideos" export { editClapDialogues } from "./editClapDialogues" export { editClapEntities } from "./editClapEntities" export { createClap } from "./createClap" -export { ClapCompletionMode } from "./types" \ No newline at end of file diff --git a/packages/aitube-client/src/config.ts b/packages/aitube-client/src/constants/config.ts similarity index 61% rename from packages/aitube-client/src/config.ts rename to packages/aitube-client/src/constants/config.ts index d8953f5e..5486afaf 100644 --- a/packages/aitube-client/src/config.ts +++ b/packages/aitube-client/src/constants/config.ts @@ -1,9 +1,4 @@ - -// unfortunately, this doesn't work yet due to a redirection issue -// const defaultAitubeHostname = "aitube.at" - -// so we have to use the direct space hostname instead -export const defaultAitubeHostname = "jbilcke-hf-ai-tube.hf.space" +import { defaultAitubeHostname } from "./defaultValues" // we leave the opportunity to override this at runtime export const aitubeUrl = `${ diff --git a/packages/aitube-client/src/constants/defaultValues.ts b/packages/aitube-client/src/constants/defaultValues.ts new file mode 100644 index 00000000..cba60934 --- /dev/null +++ b/packages/aitube-client/src/constants/defaultValues.ts @@ -0,0 +1,10 @@ +// unfortunately, this doesn't work yet due to a redirection issue +// const defaultAitubeHostname = "aitube.at" + +// so we have to use the direct space hostname instead +export const defaultAitubeHostname = "jbilcke-hf-ai-tube.hf.space" + +export const defaultClapWidth = 512 +export const defaultClapHeight = 288 + +export const defaultExportFormat = "mp4" \ No newline at end of file diff --git a/packages/aitube-client/src/constants/index.ts b/packages/aitube-client/src/constants/index.ts new file mode 100644 index 00000000..d6ae0443 --- /dev/null +++ b/packages/aitube-client/src/constants/index.ts @@ -0,0 +1,18 @@ +export { + defaultAitubeHostname, + defaultClapWidth, + defaultClapHeight, + defaultExportFormat +} from './defaultValues' + +export { + aitubeUrl, + aitubeApiVersion, + aitubeApiUrl +} from './config' + +export { + ClapCompletionMode, + ClapEntityPrompt, + SupportedExportFormat +} from "./types" diff --git a/packages/aitube-client/src/api/types.ts b/packages/aitube-client/src/constants/types.ts similarity index 63% rename from packages/aitube-client/src/api/types.ts rename to packages/aitube-client/src/constants/types.ts index b95dd79d..16081db7 100644 --- a/packages/aitube-client/src/api/types.ts +++ b/packages/aitube-client/src/constants/types.ts @@ -1,3 +1,5 @@ +export type SupportedExportFormat = "mp4" | "webm" + export enum ClapCompletionMode { /** * the API and the client will return a full clap file. @@ -25,4 +27,24 @@ export enum ClapCompletionMode { * This is the most efficient mode, but it relies on side-effects and inline object updates. */ REPLACE = "replace" +} + + +export type ClapEntityPrompt = { + name: string + + // age of the person, animal or entity (eg. robot, talking spaceship etc) + age: string + + // characterization of the person, animal or entity (texture, hair color, gender etc) + variant: string + + // region from where the person, animal or entity is coming from (human, mechanical, alien planet, european, south-american etc) + region: string + + // identity picture + identityImage: string + + // identity voice + identityVoice: string } \ No newline at end of file diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index 93da5e86..efdcf6cd 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -6,12 +6,17 @@ export { editClapStoryboards, editClapVideos, exportClapToVideo, - ClapCompletionMode, } from './api' export { defaultAitubeHostname, + defaultClapWidth, + defaultClapHeight, + defaultExportFormat, aitubeUrl, aitubeApiVersion, - aitubeApiUrl -} from './config' + aitubeApiUrl, + ClapCompletionMode, + ClapEntityPrompt, + SupportedExportFormat +} from "./constants" diff --git a/packages/aitube-client/src/parsers/index.ts b/packages/aitube-client/src/parsers/index.ts new file mode 100644 index 00000000..f45716f5 --- /dev/null +++ b/packages/aitube-client/src/parsers/index.ts @@ -0,0 +1,3 @@ +export { parseEntityPrompt } from "./parseEntityPrompt" +export { parseString } from "./parseString" +export { parseStringArray } from "./parseStringArray" \ No newline at end of file diff --git a/packages/aitube-client/src/parsers/parseEntityPrompt.ts b/packages/aitube-client/src/parsers/parseEntityPrompt.ts new file mode 100644 index 00000000..96957aa3 --- /dev/null +++ b/packages/aitube-client/src/parsers/parseEntityPrompt.ts @@ -0,0 +1,27 @@ + + +import { ClapEntityPrompt } from "@/constants/types" + +import { parseString } from "./parseString" + +export function parseEntityPrompt(entityPrompt: Partial = {}): ClapEntityPrompt { + + return { + name: parseString(entityPrompt?.name), + + // age of the person, animal or entity (eg. robot, talking spaceship etc) + age: parseString(entityPrompt?.age), + + // characterization of the person, animal or entity (texture, hair color, gender etc) + variant: parseString(entityPrompt?.variant), + + // region from where the person, animal or entity is coming from (human, mechanical, alien planet, european, south-american etc) + region: parseString(entityPrompt?.region), + + // identity picture + identityImage: parseString(entityPrompt?.identityImage), + + // identity voice + identityVoice: parseString(entityPrompt?.identityVoice), + } +} \ No newline at end of file diff --git a/packages/aitube-client/src/parsers/parseString.ts b/packages/aitube-client/src/parsers/parseString.ts new file mode 100644 index 00000000..60ea2911 --- /dev/null +++ b/packages/aitube-client/src/parsers/parseString.ts @@ -0,0 +1,7 @@ +export function parseString(input?: any, defaultValue?: string): string { + const defValue = `${defaultValue || ""}` + + if (typeof input !== "string") { return defValue } + + return input || defValue +} \ No newline at end of file diff --git a/packages/aitube-client/src/parsers/parseStringArray.ts b/packages/aitube-client/src/parsers/parseStringArray.ts new file mode 100644 index 00000000..9b3c2e6f --- /dev/null +++ b/packages/aitube-client/src/parsers/parseStringArray.ts @@ -0,0 +1,9 @@ +export function parseStringArray(something: any): string[] { + let result: string[] = [] + if (typeof something === "string") { + result = [something] + } else if (Array.isArray(something)) { + result = something.map(thing => typeof thing === "string" ? thing : "").filter(x => x) + } + return result +} \ No newline at end of file From cb147e4528707c9757de0ccd1c0fddebae48e83d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 5 May 2024 15:17:41 +0200 Subject: [PATCH 030/346] bump to 0.0.14 --- packages/aitube-client/package.json | 2 +- .../src/api/editClapDialogues.ts | 14 ++++++------- .../aitube-client/src/api/editClapEntities.ts | 12 +++++------ .../src/api/editClapStoryboards.ts | 14 ++++++------- .../aitube-client/src/api/editClapVideos.ts | 14 ++++++------- packages/aitube-client/src/index.ts | 4 ++++ .../src/utils/applyClapCompletion.ts | 21 +++++++++++++++++++ packages/aitube-client/src/utils/index.ts | 1 + 8 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 packages/aitube-client/src/utils/applyClapCompletion.ts create mode 100644 packages/aitube-client/src/utils/index.ts diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 214517f8..99e2c144 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.13", + "version": "0.0.14", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts index 9d702768..2b48eea4 100644 --- a/packages/aitube-client/src/api/editClapDialogues.ts +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -1,8 +1,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" - -import { ClapCompletionMode } from "../constants/types" +import { ClapCompletionMode } from "@/constants/types" +import { applyClapCompletion } from "@/utils" export async function editClapDialogues({ clap, @@ -32,11 +32,7 @@ export async function editClapDialogues({ const newClap = await fetchClap( `${aitubeApiUrl}edit/dialogues${ typeof completionMode === "string" - ? `?c=${ - completionMode === ClapCompletionMode.FULL - ? "full" - : "partial" - }` + ? `?c=${completionMode}` : "" }`, { method: "POST", @@ -50,5 +46,7 @@ export async function editClapDialogues({ cache: "no-store", }) - return newClap + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result } \ No newline at end of file diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index 44421e8d..60ad1442 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -2,8 +2,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" - -import { ClapCompletionMode, ClapEntityPrompt } from "../constants/types" +import { ClapCompletionMode, ClapEntityPrompt } from "@/constants/types" +import { applyClapCompletion } from "@/utils" export async function editClapEntities({ clap, @@ -38,9 +38,7 @@ export async function editClapEntities({ const params: Record = {} if (typeof completionMode === "string") { - params.c = completionMode === ClapCompletionMode.FULL - ? "full" - : "partial" + params.c = completionMode } if (entityPrompts.length) { @@ -64,5 +62,7 @@ export async function editClapEntities({ cache: "no-store", }) - return newClap + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result } \ No newline at end of file diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index be8ddbad..a3c53a49 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -1,8 +1,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" - -import { ClapCompletionMode } from "../constants/types" +import { ClapCompletionMode } from "@/constants/types" +import { applyClapCompletion } from "@/utils" export async function editClapStoryboards({ clap, @@ -31,11 +31,7 @@ export async function editClapStoryboards({ const newClap = await fetchClap(`${aitubeApiUrl}edit/storyboards${ typeof completionMode === "string" - ? `?c=${ - completionMode === ClapCompletionMode.FULL - ? "full" - : "partial" - }` + ? `?c=${completionMode}` : "" }`, { method: "POST", @@ -49,5 +45,7 @@ export async function editClapStoryboards({ cache: "no-store", }) - return newClap + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result } \ No newline at end of file diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts index 1673194a..bd9a4ec9 100644 --- a/packages/aitube-client/src/api/editClapVideos.ts +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -1,8 +1,8 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" - -import { ClapCompletionMode } from "../constants/types" +import { ClapCompletionMode } from "@/constants/types" +import { applyClapCompletion } from "@/utils" export async function editClapVideos({ clap, @@ -31,11 +31,7 @@ export async function editClapVideos({ const newClap = await fetchClap(`${aitubeApiUrl}edit/videos${ typeof completionMode === "string" - ? `?c=${ - completionMode === ClapCompletionMode.FULL - ? "full" - : "partial" - }` + ? `?c=${completionMode}` : "" }`, { method: "POST", @@ -49,5 +45,7 @@ export async function editClapVideos({ cache: "no-store", }) - return newClap + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result } \ No newline at end of file diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index efdcf6cd..c681adbc 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -20,3 +20,7 @@ export { ClapEntityPrompt, SupportedExportFormat } from "./constants" + +export { + applyClapCompletion +} from "./utils" \ No newline at end of file diff --git a/packages/aitube-client/src/utils/applyClapCompletion.ts b/packages/aitube-client/src/utils/applyClapCompletion.ts new file mode 100644 index 00000000..adf461e3 --- /dev/null +++ b/packages/aitube-client/src/utils/applyClapCompletion.ts @@ -0,0 +1,21 @@ +import { ClapProject, updateClap } from "@aitube/clap" + +import { ClapCompletionMode } from ".." + +export async function applyClapCompletion( + existingClap: ClapProject, + newerClap: ClapProject, + clapCompletionMode: ClapCompletionMode +): Promise { + // in both those mode we leave full control to what is inside "newerClap" + if (clapCompletionMode === ClapCompletionMode.FULL || clapCompletionMode === ClapCompletionMode.PARTIAL) { + return newerClap + } + + // else we are in ClapCompletionMode.MERGE or ClapCompletionMode.REPLACE + const result = await updateClap(existingClap, newerClap, { + inlineReplace: clapCompletionMode === ClapCompletionMode.REPLACE + }) + + return result +} \ No newline at end of file diff --git a/packages/aitube-client/src/utils/index.ts b/packages/aitube-client/src/utils/index.ts new file mode 100644 index 00000000..917b5631 --- /dev/null +++ b/packages/aitube-client/src/utils/index.ts @@ -0,0 +1 @@ +export { applyClapCompletion } from "./applyClapCompletion" \ No newline at end of file From d91347cc79d2c5fc350c7e19526cd185b1b13cce Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 5 May 2024 15:19:55 +0200 Subject: [PATCH 031/346] small doc update --- packages/aitube-client/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index efad409e..dbcc6956 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -42,7 +42,8 @@ import { aitubeApiUrl, ClapCompletionMode, ClapEntityPrompt, - SupportedExportFormat + SupportedExportFormat, + applyClapCompletion } from '@aitube/client'; const ultraSecret = "ultra secret token unavailable to common mortals" From 5b7293fb74e54b481092b11fa47a17e2bdf826a5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 5 May 2024 19:06:45 +0200 Subject: [PATCH 032/346] 0.0.15 --- packages/aitube-client/package.json | 2 +- packages/aitube-client/src/api/editClapEntities.ts | 2 +- packages/aitube-client/src/api/exportClapToVideo.ts | 4 ++-- packages/aitube-client/src/constants/types.ts | 5 +++++ packages/aitube-client/src/parsers/parseEntityPrompt.ts | 3 +++ 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 99e2c144..cd81fa76 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.14", + "version": "0.0.15", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index 60ad1442..4bf54ace 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -15,7 +15,7 @@ export async function editClapEntities({ clap: ClapProject // a list of entity prompts - entityPrompts: ClapEntityPrompt[], + entityPrompts?: ClapEntityPrompt[], /** * Completion mode (optional, defaults to "merge") diff --git a/packages/aitube-client/src/api/exportClapToVideo.ts b/packages/aitube-client/src/api/exportClapToVideo.ts index b5857b26..ae820382 100644 --- a/packages/aitube-client/src/api/exportClapToVideo.ts +++ b/packages/aitube-client/src/api/exportClapToVideo.ts @@ -1,9 +1,8 @@ import { ClapProject, serializeClap, blobToDataUri } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" +import { defaultExportFormat, SupportedExportFormat } from "@/constants" -export type SupportedExportFormat = "mp4" | "webm" -export const defaultExportFormat = "mp4" export async function exportClapToVideo({ clap, @@ -24,6 +23,7 @@ export async function exportClapToVideo({ if (!clap) { throw new Error(`please provide a clap`) } + // TODO use an enum instead, and check the enum object if (format !== "mp4" && format !== "webm") { throw new Error(`please provide a valid format ("${format}" is unrecognized)`) } const hasToken = typeof token === "string" && token.length > 0 diff --git a/packages/aitube-client/src/constants/types.ts b/packages/aitube-client/src/constants/types.ts index 16081db7..9a70ded4 100644 --- a/packages/aitube-client/src/constants/types.ts +++ b/packages/aitube-client/src/constants/types.ts @@ -1,3 +1,5 @@ +import { ClapSegmentCategory } from "@aitube/clap" + export type SupportedExportFormat = "mp4" | "webm" export enum ClapCompletionMode { @@ -33,6 +35,9 @@ export enum ClapCompletionMode { export type ClapEntityPrompt = { name: string + // eg. "character", "location" + category: ClapSegmentCategory + // age of the person, animal or entity (eg. robot, talking spaceship etc) age: string diff --git a/packages/aitube-client/src/parsers/parseEntityPrompt.ts b/packages/aitube-client/src/parsers/parseEntityPrompt.ts index 96957aa3..88859462 100644 --- a/packages/aitube-client/src/parsers/parseEntityPrompt.ts +++ b/packages/aitube-client/src/parsers/parseEntityPrompt.ts @@ -3,12 +3,15 @@ import { ClapEntityPrompt } from "@/constants/types" import { parseString } from "./parseString" +import { ClapSegmentCategory } from "@aitube/clap" export function parseEntityPrompt(entityPrompt: Partial = {}): ClapEntityPrompt { return { name: parseString(entityPrompt?.name), + category: parseString(entityPrompt?.category) as ClapSegmentCategory, + // age of the person, animal or entity (eg. robot, talking spaceship etc) age: parseString(entityPrompt?.age), From f3784e83aa9316f5923adc6d70caa6455912e57a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 7 May 2024 15:58:25 +0200 Subject: [PATCH 033/346] 0.0.12 --- packages/aitube-clap/README.md | 64 +++++++++- packages/aitube-clap/package.json | 2 +- .../src/constants/defaultValues.ts | 3 + packages/aitube-clap/src/factories/newClap.ts | 3 +- .../aitube-clap/src/factories/newEntity.ts | 3 +- .../aitube-clap/src/factories/newSegment.ts | 3 +- .../helpers/generateClapFromSimpleStory.ts | 12 +- packages/aitube-clap/src/index.ts | 3 + packages/aitube-clap/src/io/parseClap.ts | 3 +- packages/aitube-clap/src/io/serializeClap.ts | 5 +- packages/aitube-clap/src/types.ts | 114 ++++++++++++++---- packages/aitube-clap/src/utils/index.ts | 2 + .../src/utils/parseMediaOrientation.ts | 39 ++++++ .../src/utils/parseSegmentCategory.ts | 89 ++++++++++++++ 14 files changed, 305 insertions(+), 40 deletions(-) create mode 100644 packages/aitube-clap/src/constants/defaultValues.ts create mode 100644 packages/aitube-clap/src/utils/parseMediaOrientation.ts create mode 100644 packages/aitube-clap/src/utils/parseSegmentCategory.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 40d603d6..99d52362 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -41,7 +41,61 @@ npm install @aitube/clap ## Getting Started ```typescript -import { parseClap, serializeClap } from '@aitube/clap'; +import { + // types + ClapSegmentCategory, + ClapOutputType, + ClapSegmentStatus, + ClapAuthor, + ClapAssetSource, + ClapEntityGender, + ClapEntityAppearance, + ClapEntityRegion, + ClapEntityTimbre, + ClapEntityAudioEngine, + ClapSegmentFilteringMode, + ClapVoice, + ClapHeader, + ClapMeta, + ClapSceneEvent, + ClapScene, + ClapSegment, + ClapEntity, + ClapProject, + ClapMediaOrientation, + + // factories + newClap, + newEntity, + newSegment, + + // main input/output handlers + parseClap, + serializeClap, + fetchClap, + updateClap, + + // utilities + filterSegments, + filterSegmentsWithinRange, + generateSeed, + getClapAssetSourceType, + getValidNumber, + isValidNumber, + parseMediaOrientation, + UUID, + + // converters + blobToDataUri, + dataUriToBlob, + clapToDataUri, + + // helpers + generateClapFromSimpleStory, + getEmptyClap, + buildEntityIndex +} from "@aitube/clap" + // fetch a Clap file const res = await fetch("https://..../file.clap") @@ -51,12 +105,16 @@ const file = await res.blob() const clap: ClapProject = await parseClap(file) // perform arbitrary changes in the project -clap.segments.at(42).prompt = "a camel in the desert, medium-shot, award-winning, 4k, Canon EOS" clap.segments.at(64).assetUrl = await generateVideoWithAI(....) +const segment: ClapSegment = clap.segments.at(42) +segment.prompt = "a camel in the desert, medium-shot, award-winning, 4k, Canon EOS" + +const storyboards = clap.segment.filter(s => s.category === ClapSegmentCategory.STORYBOARD) + // save the Clap file -const newFile = await serializeClap(clap) +const newFile: ClapProject = await serializeClap(clap) ``` ## Build Instructions diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index d16f2004..ca2629f2 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.10", + "version": "0.0.12", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/constants/defaultValues.ts b/packages/aitube-clap/src/constants/defaultValues.ts new file mode 100644 index 00000000..6153b5f8 --- /dev/null +++ b/packages/aitube-clap/src/constants/defaultValues.ts @@ -0,0 +1,3 @@ +import { ClapMediaOrientation } from "@/types" + +export const defaultMediaOrientation = ClapMediaOrientation.LANDSCAPE \ No newline at end of file diff --git a/packages/aitube-clap/src/factories/newClap.ts b/packages/aitube-clap/src/factories/newClap.ts index 40235748..dd2d3856 100644 --- a/packages/aitube-clap/src/factories/newClap.ts +++ b/packages/aitube-clap/src/factories/newClap.ts @@ -2,6 +2,7 @@ import { ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/typ import { getValidNumber } from "@/utils/getValidNumber" import { UUID } from "@/utils/uuid" import { buildEntityIndex } from "@/helpers/buildEntityIndex" +import { parseMediaOrientation } from "@/utils" // generate an empty clap file, or copy one from a source export function newClap(clap: { @@ -17,7 +18,7 @@ export function newClap(clap: { description: typeof clap?.meta?.description === "string" ? clap.meta.description : "", synopsis: typeof clap?.meta?.synopsis === "string" ? clap.meta.synopsis : "", licence: typeof clap?.meta?.licence === "string" ? clap.meta.licence : "", - orientation: clap?.meta?.orientation === "portrait" ? "portrait" : clap?.meta?.orientation === "square" ? "square" : "landscape", + orientation: parseMediaOrientation(clap?.meta?.orientation), durationInMs: getValidNumber(clap?.meta?.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), width: getValidNumber(clap?.meta?.width, 256, 8192, 1024), height: getValidNumber(clap?.meta?.height, 256, 8192, 576), diff --git a/packages/aitube-clap/src/factories/newEntity.ts b/packages/aitube-clap/src/factories/newEntity.ts index d103e412..e77bd1b5 100644 --- a/packages/aitube-clap/src/factories/newEntity.ts +++ b/packages/aitube-clap/src/factories/newEntity.ts @@ -1,13 +1,14 @@ import { ClapAssetSource, ClapEntity, ClapEntityAppearance, ClapEntityAudioEngine, ClapEntityGender, ClapEntityRegion, ClapSegmentCategory } from "@/types" import { generateSeed } from "@/utils/generateSeed" import { isValidNumber } from "@/utils/isValidNumber" +import { parseSegmentCategory } from "@/utils/parseSegmentCategory" import { UUID } from "@/utils/uuid" export function newEntity(maybeEntity?: Partial) { const entity: ClapEntity = { id: typeof maybeEntity?.id === "string" ? maybeEntity.id : UUID(), - category: typeof maybeEntity?.category === "string" ? (maybeEntity.category as ClapSegmentCategory) : "character", + category: parseSegmentCategory(maybeEntity?.category, ClapSegmentCategory.CHARACTER), triggerName: typeof maybeEntity?.triggerName === "string" ? maybeEntity.triggerName : "", label: typeof maybeEntity?.label === "string" ? maybeEntity.label : "", description: typeof maybeEntity?.description === "string" ? maybeEntity.description : "", diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts index ff74f0e3..3a355580 100644 --- a/packages/aitube-clap/src/factories/newSegment.ts +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -2,6 +2,7 @@ import { ClapSegment } from "@/types" import { isValidNumber } from "@/utils/isValidNumber" import { generateSeed } from "@/utils/generateSeed" import { UUID } from "@/utils/uuid" +import { parseSegmentCategory } from "@/utils/parseSegmentCategory" export function newSegment(maybeSegment?: Partial) { @@ -25,7 +26,7 @@ export function newSegment(maybeSegment?: Partial) { track: isValidNumber(maybeSegment?.track) ? (maybeSegment?.track || 0) : 0, startTimeInMs, endTimeInMs, - category: typeof maybeSegment?.category === "string" ? maybeSegment.category : "generic", + category: parseSegmentCategory(maybeSegment?.category), entityId: typeof maybeSegment?.entityId === "string" ? maybeSegment.entityId : "", sceneId: typeof maybeSegment?.sceneId === "string" ? maybeSegment.sceneId : "", prompt: typeof maybeSegment?.prompt === "string" ? maybeSegment.prompt : "", diff --git a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts index c92d161b..3315f48b 100644 --- a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts +++ b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts @@ -2,7 +2,7 @@ import { defaultSegmentDurationInMs, demoStory } from "@/samples/stories" import { newClap } from "@/factories/newClap" import { newSegment } from "@/factories/newSegment" -import { ClapProject } from "@/types" +import { ClapProject, ClapSegmentCategory } from "@/types" export function generateClapFromSimpleStory({ story = demoStory, @@ -33,7 +33,7 @@ export function generateClapFromSimpleStory({ clap.segments.push(newSegment({ startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, - category: "interface", + category: ClapSegmentCategory.INTERFACE, prompt: "", label: "disclaimer", outputType: "interface", @@ -45,7 +45,7 @@ export function generateClapFromSimpleStory({ clap.segments.push(newSegment({ startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, - category: "interface", + category:ClapSegmentCategory.INTERFACE, prompt: "", label: "disclaimer", outputType: "interface", @@ -88,7 +88,7 @@ export function generateClapFromSimpleStory({ track: 0, startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, - category: "video", + category: ClapSegmentCategory.VIDEO, prompt: "", label: "video", outputType: "video", @@ -97,7 +97,7 @@ export function generateClapFromSimpleStory({ track: 1, startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, - category: "generic", + category: ClapSegmentCategory.GENERIC, prompt, label: prompt, outputType: "text", @@ -106,7 +106,7 @@ export function generateClapFromSimpleStory({ track: 2, startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, - category: "camera", + category: ClapSegmentCategory.CAMERA, prompt: "medium-shot", label: "medium-shot", outputType: "text", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 1d61bb36..6c8e85a6 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -18,6 +18,7 @@ export { ClapSegment, ClapEntity, ClapProject, + ClapMediaOrientation } from './types' export { newClap, @@ -37,6 +38,8 @@ export { getClapAssetSourceType, getValidNumber, isValidNumber, + parseMediaOrientation, + parseSegmentCategory, UUID } from './utils' export { diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index ca944b8a..66340cff 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -5,6 +5,7 @@ import { getValidNumber } from "../utils/getValidNumber" import { dataUriToBlob } from "../converters/dataUriToBlob" import { UUID } from "@/utils/uuid" import { buildEntityIndex } from "@/helpers/buildEntityIndex" +import { parseMediaOrientation } from "@/utils" type StringOrBlob = string | Blob @@ -161,7 +162,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false description: typeof maybeClapMeta.description === "string" ? maybeClapMeta.description : "", synopsis: typeof maybeClapMeta.synopsis === "string" ? maybeClapMeta.synopsis : "", licence: typeof maybeClapMeta.licence === "string" ? maybeClapMeta.licence : "", - orientation: maybeClapMeta.orientation === "portrait" ? "portrait" : maybeClapMeta.orientation === "square" ? "square" : "landscape", + orientation: parseMediaOrientation(maybeClapMeta.orientation), durationInMs: getValidNumber(maybeClapMeta.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), width: getValidNumber(maybeClapMeta.width, 128, 8192, 1024), height: getValidNumber(maybeClapMeta.height, 128, 8192, 576), diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index 9fde15b7..e03a6bbe 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -2,8 +2,9 @@ import YAML from "yaml" import { getValidNumber } from "@/utils/getValidNumber" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "../types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" import { UUID } from "@/utils/uuid" +import { parseMediaOrientation } from "@/utils/parseMediaOrientation" export async function serializeClap({ meta, // ClapMeta @@ -137,7 +138,7 @@ export async function serializeClap({ description: typeof meta.description === "string" ? meta.description : "", synopsis: typeof meta.synopsis === "string" ? meta.synopsis : "", licence: typeof meta.licence === "string" ? meta.licence : "", - orientation: meta.orientation === "portrait" ? "portrait" : meta.orientation === "square" ? "square" : "landscape", + orientation: parseMediaOrientation(meta.orientation), durationInMs: getValidNumber(meta.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), width: getValidNumber(meta.width, 256, 8192, 1024), height: getValidNumber(meta.height, 256, 8192, 576), diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 7970228f..7808f046 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -2,29 +2,94 @@ export type ClapFormat = | "clap-0" | "clap-1" -export type ClapSegmentCategory = - | "splat" - | "mesh" - | "depth" - | "event" - | "interface" - | "phenomenon" - | "video" - | "storyboard" - | "transition" - | "character" - | "location" - | "time" - | "era" - | "lighting" - | "weather" - | "action" - | "music" - | "sound" - | "dialogue" - | "style" - | "camera" - | "generic" +export enum ClapSegmentCategory { + // a 3D Gaussian Splatting object (eg. a .splatv) + SPLAT = "splat", + + // a 3D mesh object + MESH = "mesh", + + // a depth map + DEPTH = "depth", + + // a event happening in the scene + EVENT = "event", + + // a user interface element, such as an overlay or caption, or HTML content + INTERFACE = "interface", + + // a phenomenom triggering changes in the scene + PHENOMENON = "phenomenon", + + // a video clip, eg. mp4 or webm + // it is strongly recommended to use an open and royalty-free codec such as VP9, + // otherwise some web browsers might not be able to display it + VIDEO = "video", + + // a storyboard image, eg. jpg, png, webp, heic (note: most of the apps compatible with .clap prefer to work with jpg and png) + STORYBOARD = "storyboard", + + // a transition between two shots (eg. a cross-fade) + TRANSITION = "transition", + + // a character (person, animal, alien, robot, walking skeleton..) + CHARACTER = "character", + + // a location (indoor or outdoor eg. a house, castle, garden..) + LOCATION = "location", + + // the absolute time where the action takes place + // + // this can be anything that a language model or stable diffusion model can interpret, eg: + // eg. "today at 12am", "2024-01-01", "contemporary times", "14th century", 1960, "AB 31", "20 BC" + // + // ideally you should use a date formatting indicating the hour and timezone (if your LLM can understand those) + // that way it will be possible to automatically determine if it's day or night! + TIME = "time", + + // @deprecated - we should use TIME instead + ERA = "era", + + // how to lit the scene, colors, angles etc + LIGHTING = "lighting", + + // weather conditions in the scene (raining, sunny, cloudy, morning mist..) + WEATHER = "weather", + + // direct description of what is happening in the scene ("people talking", "bus passing by", "putting down the glass") + ACTION = "action", + + // some music + // like for all segments you can either give a prompt and/or work with an actual file (in the case mp3 or wav) + MUSIC = "music", + + // some sound + // eg. "dog barking", "foot steps", "crowded bar" + SOUND = "sound", + + // a dialogue line + // either the transcript and/or the generated TTS line + DIALOGUE = "dialogue", + + // a specific style to apply + // "cinematic", "1950s comic book", "Panavision 70 mm" + STYLE = "style", + + // type of shot eg "medium-shot", aperture, ISO.. + CAMERA = "camera", + + // ..anything else, from prompt to arbitrary/custom/obscure file format + // + // however if you have a special demand, something that could be popular and not too niche, + // we can turn it into its own category + GENERIC = "generic" +} + +export enum ClapMediaOrientation { + LANDSCAPE = "landscape", + PORTRAIT = "portrait", + SQUARE = "square" +} export type ClapOutputType = | "text" @@ -143,7 +208,8 @@ export type ClapMeta = { description: string synopsis: string licence: string - orientation: string + + orientation: ClapMediaOrientation // the default duration of the experience // the real one might last longer if made interactive diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index bfb3701d..45872350 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -4,4 +4,6 @@ export { generateSeed } from './generateSeed' export { getClapAssetSourceType } from './getClapAssetSourceType' export { getValidNumber } from './getValidNumber' export { isValidNumber } from './isValidNumber' +export { parseMediaOrientation } from './parseMediaOrientation' +export { parseSegmentCategory } from './parseSegmentCategory' export { UUID } from './uuid' \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseMediaOrientation.ts b/packages/aitube-clap/src/utils/parseMediaOrientation.ts new file mode 100644 index 00000000..67f6b595 --- /dev/null +++ b/packages/aitube-clap/src/utils/parseMediaOrientation.ts @@ -0,0 +1,39 @@ +import { defaultMediaOrientation } from "@/constants/defaultValues" +import { ClapMediaOrientation } from "@/types" + +export function parseMediaOrientation(input: any, defaultToUse?: ClapMediaOrientation): ClapMediaOrientation { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(ClapMediaOrientation).includes(unknownString as ClapMediaOrientation)) { + return unknownString as ClapMediaOrientation + } + + let orientation: ClapMediaOrientation = defaultToUse || defaultMediaOrientation + + unknownString = unknownString.toLowerCase() + + if ( + unknownString === "landscape" || + unknownString === "horizontal" + ) { + orientation = ClapMediaOrientation.LANDSCAPE + } + + if ( + unknownString === "portrait" || + unknownString === "vertical" || + unknownString === "mobile" + ) { + orientation = ClapMediaOrientation.PORTRAIT + } + + if ( + unknownString === "square" + ) { + orientation = ClapMediaOrientation.PORTRAIT + } + + return orientation +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseSegmentCategory.ts b/packages/aitube-clap/src/utils/parseSegmentCategory.ts new file mode 100644 index 00000000..7029a8a1 --- /dev/null +++ b/packages/aitube-clap/src/utils/parseSegmentCategory.ts @@ -0,0 +1,89 @@ +import { ClapSegmentCategory } from "@/types" + +export function parseSegmentCategory(input: any, defaultCategory?: ClapSegmentCategory): ClapSegmentCategory { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(ClapSegmentCategory).includes(unknownString as ClapSegmentCategory)) { + return unknownString as ClapSegmentCategory + } + + let category: ClapSegmentCategory = defaultCategory || ClapSegmentCategory.GENERIC + + // sometimes we want to use a LLM to generate the categories, + // but those aren't very precise and can hallucinate + // for instance they like to use plural + // so we need to be a bit flexible in how we detect those + + unknownString = unknownString.toLowerCase() + + if (unknownString === "splat" || unknownString === "splats" || unknownString === "splatting" || unknownString === "gaussian splat" || unknownString === "splatv") { + category = ClapSegmentCategory.SPLAT + } + else if (unknownString === "mesh" || unknownString === "meshes" || unknownString === "3d mesh") { + category = ClapSegmentCategory.MESH + } + else if (unknownString === "depth" || unknownString === "depthmap" || unknownString === "depth map") { + category = ClapSegmentCategory.DEPTH + } + else if (unknownString === "event" || unknownString === "events") { + category = ClapSegmentCategory.EVENT + } + else if (unknownString === "interface" || unknownString === "ui" || unknownString === "caption" || unknownString === "html") { + category = ClapSegmentCategory.INTERFACE + } + else if (unknownString === "phenomenon" || unknownString === "phenomenons" || unknownString === "effect" || unknownString === "effects" || unknownString === "mutation" || unknownString === "reaction" || unknownString === "transformation") { + category = ClapSegmentCategory.PHENOMENON + } + else if (unknownString === "video" || unknownString === "videos") { + category = ClapSegmentCategory.VIDEO + } + else if (unknownString === "storyboard" || unknownString === "storyboards") { + category = ClapSegmentCategory.STORYBOARD + } + else if (unknownString === "transition" || unknownString === "transitions" || unknownString === "cut" || unknownString === "cuts") { + category = ClapSegmentCategory.TRANSITION + } + else if (unknownString === "character" || unknownString === "characters" || unknownString === "actor" || unknownString === "person") { + category = ClapSegmentCategory.CHARACTER + } + else if (unknownString === "location" || unknownString === "locations" || unknownString === "place" || unknownString === "places") { + category = ClapSegmentCategory.LOCATION + } + else if (unknownString === "time" || unknownString === "timestamp") { + category = ClapSegmentCategory.TIME + } + else if (unknownString === "era") { + category = ClapSegmentCategory.ERA + } + else if (unknownString === "lighting" || unknownString === "light" || unknownString === "lighting") { + category = ClapSegmentCategory.LIGHTING + } + else if (unknownString === "weather" || unknownString === "sky" || unknownString === "meteo") { + category = ClapSegmentCategory.WEATHER + } + else if (unknownString === "action") { + category = ClapSegmentCategory.ACTION + } + else if (unknownString === "music") { + category = ClapSegmentCategory.MUSIC + } + else if (unknownString === "sound" || unknownString === "sounds") { + category = ClapSegmentCategory.SOUND + } + else if (unknownString === "dialogue" || unknownString === "dialogues" || unknownString === "speech" || unknownString === "voice" || unknownString === "voices") { + category = ClapSegmentCategory.DIALOGUE + } + else if (unknownString === "style") { + category = ClapSegmentCategory.STYLE + } + else if (unknownString === "camera") { + category = ClapSegmentCategory.CAMERA + } + else if (unknownString === "generic") { + category = ClapSegmentCategory.GENERIC + } + + return category +} \ No newline at end of file From 26c70858f9324f19a851fb6e4cb196cc5698bacd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 7 May 2024 16:00:14 +0200 Subject: [PATCH 034/346] 0.0.13 --- packages/aitube-clap/README.md | 4 ++++ packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/constants/index.ts | 1 + packages/aitube-clap/src/index.ts | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 packages/aitube-clap/src/constants/index.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 99d52362..290da2a5 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -64,6 +64,9 @@ import { ClapProject, ClapMediaOrientation, +// defaults + defaultMediaOrientation, + // factories newClap, newEntity, @@ -83,6 +86,7 @@ import { getValidNumber, isValidNumber, parseMediaOrientation, + parseSegmentCategory, UUID, // converters diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index ca2629f2..20db3c5d 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.12", + "version": "0.0.13", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/constants/index.ts b/packages/aitube-clap/src/constants/index.ts new file mode 100644 index 00000000..0910633b --- /dev/null +++ b/packages/aitube-clap/src/constants/index.ts @@ -0,0 +1 @@ +export { defaultMediaOrientation } from "./defaultValues" \ No newline at end of file diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 6c8e85a6..7b84fb35 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -20,6 +20,9 @@ export { ClapProject, ClapMediaOrientation } from './types' +export { + defaultMediaOrientation +} from './constants' export { newClap, newEntity, From c2f476c1d451cae435267b89ca7a2a9d04fdc887 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 7 May 2024 16:02:43 +0200 Subject: [PATCH 035/346] 0.0.16 --- packages/aitube-client/bun.lockb | Bin 19117 -> 19118 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 824b042dfde5f9a3c11da32d961ca46e8b383785..6e2acd04228a449f72994ef22b4f82fd8c8a29f4 100755 GIT binary patch delta 313 zcmZ2Gm2urv#tC|g#XTQ%!?WrFue<-d8N2VC&#M32v-|WOOn)ma*B+@X`$KM{|4c?k zw#hFU+IVz`z5VoSERhAVK(p)z8}NmTMdA9$e7ad)Y$B zJJ2?Op<_l`Wcr0QyfR_}(pE=gJwLJcaL;|&o|3a~?{AZ?{>fXFPB;j3G<=DzdU9r) z^>^>q&9B;mj=U&!UOh3Tdh+%3MQ^Sdi-WK09F!lcd8rb+@x;Tf1d-#AP@7&tzm| zo&1tfp7GFTPNu~?yp{|M4I&H-3_L*0F?k`g`s4@99E^gKU-H>A22IxFw-@Z>WnciQ z0xAFlF1V`GlUMTFGydNElD|jD!PHkVFW Date: Tue, 7 May 2024 16:06:47 +0200 Subject: [PATCH 036/346] 0.0.3 --- packages/aitube-engine/bun.lockb | Bin 17637 -> 17638 bytes packages/aitube-engine/package.json | 6 ++-- .../prompts/getSpeechBackgroundAudioPrompt.ts | 14 +++++----- .../prompts/getSpeechForegroundAudioPrompt.ts | 4 +-- .../src/prompts/getVideoPrompt.ts | 26 +++++++++--------- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 34124c5bd28d960a20be6c57fe0bbb54bc83a753..dd8ce60424909601a3b0e7b585dfd8e714d6ba13 100755 GIT binary patch delta 423 zcmV;Y0a*U!i2>$`0gx^sj7rdQghel8w?4bh*aeed10)z+s9P&>yURk^C;J>$RK%iz(zhjfuQ?^iD zb5YD4O}+4`ObF6IMotTVPqUp$K8)zzX5Nl&J^cV7ZlzZdhN2~uN4K^E1jPFouq(xo zinGlV$O}Lb>A9qTX_;V0pkNd5I{AIqIjw*`;Ls?&(>M}KQ9V!qh?r(sXV9z-92O88 zI>a4G@&}9yo#}^UY`(qwG>VUt)gQ<}5Qu>EU3%oqwmbJrg|q60QpD(WL#vTwdz05^ zqU_c%ZF;L<-t8+sHu7)zuP?eQh(heh7AYGG$!!L}=`LSiv)v#{5F0Z901f~E01N;C zfRF{>-)tI%um}M#E-)@JGqXZ5`~(5MlRq{Y0eh2KHs1kGvpF~20Rb_S4?Q8XI62@6 R0x>X?8AH4QGqcu14*|WFrY!&f delta 426 zcmaFX$@sLBae|(rW$(#=#20;AbcIA7u^p40eD=hI(1gs?k|SN`g#&nR=Z0?duViH0 zJNYD|JY&`7myD;GCY!LDY<|Jg!oh3Fz|bJVz`(!*#2k|onbjvRVCG;vIe8_oJtNoT zm%R3ZjzB4pDxd-|;DW1ao}9^N&$xN>O1>v74!vFSI_I3T^2^@ex;ruFm0Zu2#XYlo zucdJvI9~B*XZYvatVex1)dIioP-E7!%v!OBV{NK*B2#%?m8ic}*7pyAo6icL;C3+e z)mGV*zDX>s#Q)3p?XnzVpQ0lwT0BgS&C)Mw5J;%3DJwKu{@KAw(c;`Zfu4b$p}}S+!#^y*0JS%hWUQJTX?CB{ceADWT}DQO$qIIgn=LFKa57p< PmU7<1Xt4RZGe08$GZLbo diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 75eb05d8..7489fbb5 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.10" + "@aitube/clap": "0.0.13" }, "peerDependencies": { - "@aitube/clap": "0.0.10" + "@aitube/clap": "0.0.13" }, "repository": { "type": "git", diff --git a/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts b/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts index e540c270..45eda288 100644 --- a/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts +++ b/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapSegment } from "@aitube/clap" +import { ClapEntity, ClapSegment, ClapSegmentCategory } from "@aitube/clap" import { getCharacterPrompt } from "./getCharacterPrompt" @@ -15,15 +15,15 @@ export function getSpeechBackgroundAudioPrompt( ): string { return segments .filter(({ category, outputType }) => ( - category === "dialogue" || - category === "weather" || - category === "location" + category === ClapSegmentCategory.DIALOGUE || + category === ClapSegmentCategory.WEATHER || + category === ClapSegmentCategory.LOCATION )) .sort((a, b) => b.label.localeCompare(a.label)) .map(segment => { const entity: ClapEntity | undefined = entityIndex[segment?.entityId || ""] || undefined - if (segment.category === "dialogue") { + if (segment.category === ClapSegmentCategory.DIALOGUE) { // if we can't find the entity then we are unable // to make any assumption about the gender, age and voice timbre if (!entity) { @@ -34,11 +34,11 @@ export function getSpeechBackgroundAudioPrompt( return `${characterPrompt}, speaking normally` - } else if (segment.category === "location") { + } else if (segment.category === ClapSegmentCategory.LOCATION) { // the location is part of the background noise // but this might produce unexpected results - we'll see! return segment.prompt - } else if (segment.category === "weather") { + } else if (segment.category === ClapSegmentCategory.WEATHER) { // the weather is part of the background noise // here too this might produce weird and unexpected results 🍿 return segment.prompt diff --git a/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts b/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts index 84b2334d..8337bdb2 100644 --- a/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts +++ b/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts @@ -1,4 +1,4 @@ -import { ClapSegment } from "@aitube/clap" +import { ClapSegment, ClapSegmentCategory } from "@aitube/clap" /** * Construct an audio foreground for a voice from a list of active segments @@ -13,7 +13,7 @@ export function getSpeechForegroundAudioPrompt( segments: ClapSegment[] = [] ): string { return segments - .filter(({ category }) => category === "dialogue") + .filter(({ category }) => category === ClapSegmentCategory.DIALOGUE) .sort((a, b) => b.label.localeCompare(a.label)) .map(({ prompt }) => prompt).filter(x => x) .join(". ") diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index e3dbf059..e5eadb07 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapSegment } from "@aitube/clap" +import { ClapEntity, ClapSegment, ClapSegmentCategory } from "@aitube/clap" import { deduplicatePrompt } from "@/utils/deduplicatePrompt" import { getCharacterPrompt } from "@/prompts/getCharacterPrompt" @@ -26,16 +26,16 @@ export function getVideoPrompt( } if ( - category === "character" || - category === "location" || - category === "time" || - category === "era" || - category === "lighting" || - category === "weather" || - category === "action" || - category === "style" || - category === "camera" || - category === "generic" + category === ClapSegmentCategory.CHARACTER || + category === ClapSegmentCategory.LOCATION || + category === ClapSegmentCategory.TIME || + category === ClapSegmentCategory.ERA || // <- @deprecated + category === ClapSegmentCategory.LIGHTING || + category === ClapSegmentCategory.WEATHER || + category === ClapSegmentCategory.ACTION || + category === ClapSegmentCategory.STYLE || + category === ClapSegmentCategory.CAMERA || + category === ClapSegmentCategory.GENERIC ) { return true } @@ -47,7 +47,7 @@ export function getVideoPrompt( let videoPrompt = tmp.map(segment => { const entity: ClapEntity | undefined = entitiesIndex[segment?.entityId || ""] || undefined - if (segment.category === "dialogue") { + if (segment.category === ClapSegmentCategory.DIALOGUE) { // if we can't find the entity, then we are unable // to make any assumption about the gender, age or appearance @@ -67,7 +67,7 @@ export function getVideoPrompt( // we create a "bokeh" style return `portrait of a person speaking, blurry background, bokeh, ${characterPrompt}` - } else if (segment.category === "location") { + } else if (segment.category === ClapSegmentCategory.LOCATION) { // if we can't find the location's entity, we default to returning the prompt if (!entity) { From ce9d8046aeb31fbd320226b69134808fe6fbdea4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 7 May 2024 16:19:46 +0200 Subject: [PATCH 037/346] 0.0.14 --- packages/aitube-clap/README.md | 1 + packages/aitube-clap/package.json | 2 +- .../aitube-clap/src/factories/newSegment.ts | 5 +-- .../helpers/generateClapFromSimpleStory.ts | 16 ++++----- packages/aitube-clap/src/index.ts | 1 + packages/aitube-clap/src/types.ts | 36 +++++++++++++------ packages/aitube-clap/src/utils/index.ts | 1 + .../aitube-clap/src/utils/parseOutputType.ts | 13 +++++++ 8 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 packages/aitube-clap/src/utils/parseOutputType.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 290da2a5..41e44198 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -86,6 +86,7 @@ import { getValidNumber, isValidNumber, parseMediaOrientation, + parseOutputType, parseSegmentCategory, UUID, diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 20db3c5d..88f5f0e5 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.13", + "version": "0.0.14", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts index 3a355580..9ff9462e 100644 --- a/packages/aitube-clap/src/factories/newSegment.ts +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -1,8 +1,9 @@ -import { ClapSegment } from "@/types" +import { ClapOutputType, ClapSegment } from "@/types" import { isValidNumber } from "@/utils/isValidNumber" import { generateSeed } from "@/utils/generateSeed" import { UUID } from "@/utils/uuid" import { parseSegmentCategory } from "@/utils/parseSegmentCategory" +import { parseOutputType } from ".." export function newSegment(maybeSegment?: Partial) { @@ -31,7 +32,7 @@ export function newSegment(maybeSegment?: Partial) { sceneId: typeof maybeSegment?.sceneId === "string" ? maybeSegment.sceneId : "", prompt: typeof maybeSegment?.prompt === "string" ? maybeSegment.prompt : "", label: typeof maybeSegment?.label === "string" ? maybeSegment.label : "", - outputType: typeof maybeSegment?.outputType === "string" ? maybeSegment.outputType : "text", + outputType: parseOutputType(maybeSegment?.outputType, ClapOutputType.TEXT), renderId: typeof maybeSegment?.renderId === "string" ? maybeSegment.renderId : "", status: typeof maybeSegment?.status === "string" ? maybeSegment.status : "to_generate", assetUrl: typeof maybeSegment?.assetUrl === "string" ? maybeSegment.assetUrl : "", diff --git a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts index 3315f48b..8dd9d420 100644 --- a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts +++ b/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts @@ -2,7 +2,7 @@ import { defaultSegmentDurationInMs, demoStory } from "@/samples/stories" import { newClap } from "@/factories/newClap" import { newSegment } from "@/factories/newSegment" -import { ClapProject, ClapSegmentCategory } from "@/types" +import { ClapOutputType, ClapProject, ClapSegmentCategory } from "@/types" export function generateClapFromSimpleStory({ story = demoStory, @@ -36,7 +36,7 @@ export function generateClapFromSimpleStory({ category: ClapSegmentCategory.INTERFACE, prompt: "", label: "disclaimer", - outputType: "interface", + outputType: ClapOutputType.INTERFACE, })) currentElapsedTimeInMs += currentSegmentDurationInMs } @@ -48,7 +48,7 @@ export function generateClapFromSimpleStory({ category:ClapSegmentCategory.INTERFACE, prompt: "", label: "disclaimer", - outputType: "interface", + outputType: ClapOutputType.INTERFACE, })) currentElapsedTimeInMs += currentSegmentDurationInMs } @@ -60,12 +60,12 @@ export function generateClapFromSimpleStory({ // track: number startTimeInMs: currentElapsedTimeInMs, endTimeInMs: currentSegmentDurationInMs, - category: "interface", + category: ClapSegmentCategory.INTERFACE, // entityId: string // sceneId: string prompt: "a hello world", label: "hello world", - outputType: "interface" + outputType: ClapOutputType.INTERFACE, // renderId: string // status: ClapSegmentStatus // assetUrl: string @@ -91,7 +91,7 @@ export function generateClapFromSimpleStory({ category: ClapSegmentCategory.VIDEO, prompt: "", label: "video", - outputType: "video", + outputType: ClapOutputType.VIDEO, })) clap.segments.push(newSegment({ track: 1, @@ -100,7 +100,7 @@ export function generateClapFromSimpleStory({ category: ClapSegmentCategory.GENERIC, prompt, label: prompt, - outputType: "text", + outputType: ClapOutputType.TEXT, })) clap.segments.push(newSegment({ track: 2, @@ -109,7 +109,7 @@ export function generateClapFromSimpleStory({ category: ClapSegmentCategory.CAMERA, prompt: "medium-shot", label: "medium-shot", - outputType: "text", + outputType: ClapOutputType.TEXT, })) currentElapsedTimeInMs += currentSegmentDurationInMs diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 7b84fb35..6823d573 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -42,6 +42,7 @@ export { getValidNumber, isValidNumber, parseMediaOrientation, + parseOutputType, parseSegmentCategory, UUID } from './utils' diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 7808f046..60d90e0e 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -91,16 +91,32 @@ export enum ClapMediaOrientation { SQUARE = "square" } -export type ClapOutputType = - | "text" - | "animation" - | "interface" - | "event" - | "phenomenon" - | "transition" - | "image" - | "video" - | "audio" +export enum ClapOutputType { + // a plain text + TEXT = "text", + + // an animation (not used) + ANIMATION = "animation", + + // UI element + INTERFACE = "interface", + + // event + EVENT = "event", + + PHENOMENON = "phenomenon", + + TRANSITION = "transition", + + // image asset + IMAGE = "image", + + // video asset + VIDEO = "video", + + // audio asset + AUDIO = "audio" +} export type ClapSegmentStatus = | "to_generate" diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index 45872350..dbb16101 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -5,5 +5,6 @@ export { getClapAssetSourceType } from './getClapAssetSourceType' export { getValidNumber } from './getValidNumber' export { isValidNumber } from './isValidNumber' export { parseMediaOrientation } from './parseMediaOrientation' +export { parseOutputType } from './parseOutputType' export { parseSegmentCategory } from './parseSegmentCategory' export { UUID } from './uuid' \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseOutputType.ts b/packages/aitube-clap/src/utils/parseOutputType.ts new file mode 100644 index 00000000..d971cd08 --- /dev/null +++ b/packages/aitube-clap/src/utils/parseOutputType.ts @@ -0,0 +1,13 @@ +import { ClapOutputType } from "@/types" + +export function parseOutputType(input: any, defaultToUse?: ClapOutputType): ClapOutputType { + + let unknownString = `${input || ""}`.trim() || (defaultToUse || ClapOutputType.TEXT) + + // the "normal" case + if (Object.values(ClapOutputType).includes(unknownString as ClapOutputType)) { + return unknownString as ClapOutputType + } + + throw new Error(`unsupported output type "${unknownString}"`) +} \ No newline at end of file From 84af6092479e5aed6e4874e304b6b2db31a102c8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 7 May 2024 16:21:39 +0200 Subject: [PATCH 038/346] 0.0.17 --- packages/aitube-client/bun.lockb | Bin 19118 -> 19118 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 6e2acd04228a449f72994ef22b4f82fd8c8a29f4..cb747d768dd558bbd0b5d577febbd7f16de4265d 100755 GIT binary patch delta 146 zcmV;D0B!%Sl>x4m0gx^r#>ZWT-b^UY%2h2IQE$jWRy-r9rEE#bhQ9unRWzU;u}&%v z0S=R)11Gbf58V?$i;1e;fnITCPE9ZANMM-|@%3fTNbHPb6qKN4K`>vPxyiN!& z=)ozj2R_CgHs3k?qpjS+N)T0Tf+dE1v%MpN5dk!lKs6ZwG_zVYL=*uuv!6*10srei A)&Kwi delta 146 zcmV;D0B!%Sl>x4m0gx^rbBypUS89Gy*GK-@UB1pts{ad{jxOMr?HeA4StA|zu}&%v z0S%L(11Gbf58V?$5Qu>EU3%oqwmbJrg|q60QpD(WL#vTwdz05^qU_c%ZF;L<-t8+s zHu7)zuP?eQh(heh7AYGG$!!L}=`LSiv%MpN5dkxkKs6ZwGqYMXL=*utv!6*10S#wD AEC2ui diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 4d8f0976..c04f74e9 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.16", + "version": "0.0.17", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.13" + "@aitube/clap": "0.0.14" }, "peerDependencies": { - "@aitube/clap": "0.0.13" + "@aitube/clap": "0.0.14" }, "repository": { "type": "git", From e06fb145af536607f2668feefbebbeb6e62ff329 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 7 May 2024 16:22:52 +0200 Subject: [PATCH 039/346] 0.0.4 --- packages/aitube-engine/bun.lockb | Bin 17638 -> 17638 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index dd8ce60424909601a3b0e7b585dfd8e714d6ba13..5c15b8e361b48ad002c13623a889eca7e3e074d6 100755 GIT binary patch delta 166 zcmV;X09pU$i2>$`0gx^r{K4TlA{MuT{tNpI-NB|ie@H2ow>WxbdI2h+wk7d5u}NMM-|@%3fTNbHPb6qKN4K`>vPxyiN!& z=)ozj2R_CgHs3k?qpjS+N)T0Tf+dE1v)v#{5F0cA01f~E01N;CfRF{>-)tI%um}M# UE-)@JG_yi6loA0nv)4lp0XoP;yZ`_I delta 166 zcmV;X09pU$i2>$`0gx^rj7rdQghel8w?4bh*aeed10)z+s9P&>yURk^C;J>$u}EU3%oqwmbJrg|q60QpD(WL#vTwdz05^qU_c%ZF;L<-t8+s zHu7)zuP?eQh(heh7AYGG$!!L}=`LSiv)v#{5F0Z901f~E01N;CfRF{>-)tI%um}M# UE-)@JGqXZ5loA0mv)4lp0R&S-nE(I) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 7489fbb5..b0604ce2 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.3", + "version": "0.0.4", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.13" + "@aitube/clap": "0.0.14" }, "peerDependencies": { - "@aitube/clap": "0.0.13" + "@aitube/clap": "0.0.14" }, "repository": { "type": "git", From 3d920529a116ff17c609fa44fb399ae4a14b8a3f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 8 May 2024 15:29:17 +0200 Subject: [PATCH 040/346] 0.0.19 --- packages/aitube-client/README.md | 5 ++++- packages/aitube-client/package.json | 2 +- packages/aitube-client/src/api/createClap.ts | 5 ++++- .../src/api/editClapDialogues.ts | 20 ++++++++++++++----- .../aitube-client/src/api/editClapEntities.ts | 7 +++++++ .../src/api/editClapStoryboards.ts | 20 ++++++++++++++----- .../aitube-client/src/api/editClapVideos.ts | 20 ++++++++++++++----- .../src/api/exportClapToVideo.ts | 16 +++++++++++++-- 8 files changed, 75 insertions(+), 20 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index dbcc6956..27dc2a0d 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -44,23 +44,26 @@ import { ClapEntityPrompt, SupportedExportFormat, applyClapCompletion - } from '@aitube/client'; + } from '@aitube/client' const ultraSecret = "ultra secret token unavailable to common mortals" const basicClap = await createClap({ prompt: "story about a dog", + turbo: false, token: ultraSecret }) const illustratedClap = await editClapStoryboards({ clap: basicClap, + turbo: false, token: ultraSecret }) const mp4VideoFile = await exportClapToVideo({ clap: illustratedClap, format: "mp4", + turbo: false, token: ultraSecret }) ``` diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index c04f74e9..223ff480 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.17", + "version": "0.0.19", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/createClap.ts b/packages/aitube-client/src/api/createClap.ts index 0d17c64f..01530a7e 100644 --- a/packages/aitube-client/src/api/createClap.ts +++ b/packages/aitube-client/src/api/createClap.ts @@ -8,11 +8,13 @@ export async function createClap({ prompt, height = defaultClapHeight, width = defaultClapWidth, + turbo = false, token, }: { prompt: string height?: number width?: number + turbo?: boolean token?: string }): Promise { @@ -31,7 +33,8 @@ export async function createClap({ body: JSON.stringify({ prompt, width, - height + height, + turbo, }), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts index 2b48eea4..975bc6d6 100644 --- a/packages/aitube-client/src/api/editClapDialogues.ts +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -1,4 +1,5 @@ import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" import { ClapCompletionMode } from "@/constants/types" @@ -7,6 +8,7 @@ import { applyClapCompletion } from "@/utils" export async function editClapDialogues({ clap, completionMode = ClapCompletionMode.MERGE, + turbo = false, token, }: { clap: ClapProject @@ -22,6 +24,8 @@ export async function editClapDialogues({ */ completionMode?: ClapCompletionMode + turbo?: boolean + token?: string }): Promise { @@ -29,12 +33,18 @@ export async function editClapDialogues({ const hasToken = typeof token === "string" && token.length > 0 + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode + } + + if (turbo) { + params.t = "true" + } + const newClap = await fetchClap( - `${aitubeApiUrl}edit/dialogues${ - typeof completionMode === "string" - ? `?c=${completionMode}` - : "" - }`, { + `${aitubeApiUrl}edit/dialogues?${queryString.stringify(params)}`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index 4bf54ace..80b40e98 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -9,6 +9,7 @@ export async function editClapEntities({ clap, entityPrompts = [], completionMode = ClapCompletionMode.MERGE, + turbo = false, token, }: { // A ClapProject instance @@ -28,6 +29,8 @@ export async function editClapEntities({ */ completionMode?: ClapCompletionMode + turbo?: boolean + token?: string }): Promise { @@ -41,6 +44,10 @@ export async function editClapEntities({ params.c = completionMode } + if (turbo) { + params.t = "true" + } + if (entityPrompts.length) { // if "params.e = JSON.stringify(item)" works with UTF-8 characters, // then we don't need to import "js-base64" diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index a3c53a49..542b524d 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -1,3 +1,4 @@ +import queryString from "query-string" import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" @@ -7,6 +8,7 @@ import { applyClapCompletion } from "@/utils" export async function editClapStoryboards({ clap, completionMode = ClapCompletionMode.MERGE, + turbo = false, token, }: { clap: ClapProject @@ -22,6 +24,8 @@ export async function editClapStoryboards({ */ completionMode?: ClapCompletionMode + turbo?: boolean + token?: string }): Promise { @@ -29,11 +33,17 @@ export async function editClapStoryboards({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/storyboards${ - typeof completionMode === "string" - ? `?c=${completionMode}` - : "" - }`, { + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode + } + + if (turbo) { + params.t = "true" + } + + const newClap = await fetchClap(`${aitubeApiUrl}edit/storyboards?${queryString.stringify(params)}`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts index bd9a4ec9..9b9954c4 100644 --- a/packages/aitube-client/src/api/editClapVideos.ts +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -1,3 +1,4 @@ +import queryString from "query-string" import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" @@ -7,6 +8,7 @@ import { applyClapCompletion } from "@/utils" export async function editClapVideos({ clap, completionMode = ClapCompletionMode.MERGE, + turbo = false, token, }: { clap: ClapProject @@ -22,6 +24,8 @@ export async function editClapVideos({ */ completionMode?: ClapCompletionMode + turbo?: boolean + token?: string }): Promise { @@ -29,11 +33,17 @@ export async function editClapVideos({ const hasToken = typeof token === "string" && token.length > 0 - const newClap = await fetchClap(`${aitubeApiUrl}edit/videos${ - typeof completionMode === "string" - ? `?c=${completionMode}` - : "" - }`, { + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode + } + + if (turbo) { + params.t = "true" + } + + const newClap = await fetchClap(`${aitubeApiUrl}edit/videos?${queryString.stringify(params)}`, { method: "POST", headers: { "Content-Type": "application/x-gzip", diff --git a/packages/aitube-client/src/api/exportClapToVideo.ts b/packages/aitube-client/src/api/exportClapToVideo.ts index ae820382..95ac508d 100644 --- a/packages/aitube-client/src/api/exportClapToVideo.ts +++ b/packages/aitube-client/src/api/exportClapToVideo.ts @@ -1,3 +1,4 @@ +import queryString from "query-string" import { ClapProject, serializeClap, blobToDataUri } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" @@ -7,6 +8,7 @@ import { defaultExportFormat, SupportedExportFormat } from "@/constants" export async function exportClapToVideo({ clap, format = defaultExportFormat, + turbo = false, token, }: { clap: ClapProject @@ -18,6 +20,8 @@ export async function exportClapToVideo({ */ format?: SupportedExportFormat + turbo?: boolean + token?: string }): Promise { @@ -25,10 +29,18 @@ export async function exportClapToVideo({ // TODO use an enum instead, and check the enum object if (format !== "mp4" && format !== "webm") { throw new Error(`please provide a valid format ("${format}" is unrecognized)`) } - + + const params: Record = {} + + params.f = format + + if (turbo) { + params.t = "true" + } + const hasToken = typeof token === "string" && token.length > 0 - const res = await fetch(`${aitubeApiUrl}export?f=${format}`, { + const res = await fetch(`${aitubeApiUrl}export?${queryString.stringify(params)}`, { method: "POST", headers: { "Content-Type": "application/x-gzip", From 0fec6ed61ddc8db8225a0514e38288f945ded83c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 8 May 2024 22:14:30 +0200 Subject: [PATCH 041/346] 0.0.15 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/io/updateClap.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 88f5f0e5..00e2cab7 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.14", + "version": "0.0.15", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/io/updateClap.ts b/packages/aitube-clap/src/io/updateClap.ts index 14474358..c6619612 100644 --- a/packages/aitube-clap/src/io/updateClap.ts +++ b/packages/aitube-clap/src/io/updateClap.ts @@ -32,7 +32,7 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje inlineReplace: false }): Promise { - const clap = inlineReplace ? existingClap : newClap() + const clap: ClapProject = inlineReplace ? existingClap : newClap() for (const [metaFieldKey, metaFieldValue] of Object.entries(newerClap.meta)) { (clap.meta as any)[metaFieldKey] = metaFieldValue @@ -42,16 +42,25 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje const existingEntityIndex: Record = {} for (const entity of existingClap.entities) { existingEntityIndex[entity.id] = entity + if (!inlineReplace) { + clap.entities.push(entity) + } } const existingSceneIndex: Record = {} for (const scene of existingClap.scenes) { existingSceneIndex[scene.id] = scene + if (!inlineReplace) { + clap.scenes.push(scene) + } } const existingSegmentIndex: Record = {} for (const segment of existingClap.segments) { existingSegmentIndex[segment.id] = segment + if (!inlineReplace) { + clap.segments.push(segment) + } } // we replace all the data @@ -63,6 +72,7 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje } } else { existingEntityIndex[entity.id] = entity + clap.entities.push(entity) } } @@ -74,6 +84,7 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje } } else { existingSceneIndex[scene.id] = scene + clap.scenes.push(scene) } } @@ -85,6 +96,7 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje } } else { existingSegmentIndex[segment.id] = segment + clap.segments.push(segment) } } From dec34916b8eb931f3959bde94b91ff2edd0c4753 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 8 May 2024 22:16:20 +0200 Subject: [PATCH 042/346] 0.0.20 --- packages/aitube-client/bun.lockb | Bin 19118 -> 19118 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index cb747d768dd558bbd0b5d577febbd7f16de4265d..953935980a2c20e601a7cb9b36ef9f8e40fee7f3 100755 GIT binary patch delta 246 zcmVx4m0gx^r=oJMsQ%J=R@`FD^y zKx;767`t2JUCM!=C~Ns$3Hv!6*10W7F;iU0rr delta 248 zcmVx4m0gx^r#>ZWT-b^UY%2h2IQE$jWRy-r9rEE#bhQ9unRWzU;u}*3Z z0Sc3$11FQ<4wwNBlc57Av!D;v54#)&zPKE@t4-#PrFt=z&&5LIo0C5E%S yBZCnEG?PFz838o2S~Z6g4=^rtXL@yRWNBk*Ep&Nslc7N!lMP9c0W`CpNe=;(xNG15 diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 223ff480..b0f6ce04 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.19", + "version": "0.0.20", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.14" + "@aitube/clap": "0.0.15" }, "peerDependencies": { - "@aitube/clap": "0.0.14" + "@aitube/clap": "0.0.15" }, "repository": { "type": "git", From a72fb611f22fd6aceddfc57977e7ec293497e1ce Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 8 May 2024 22:19:53 +0200 Subject: [PATCH 043/346] 0.0.5 --- packages/aitube-engine/bun.lockb | Bin 17638 -> 17638 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 5c15b8e361b48ad002c13623a889eca7e3e074d6..996e0992b5c7b663d43843081e68ccdcbfe70430 100755 GIT binary patch delta 248 zcmV$`0gx^r4=Yyl+fRLHl7hiBrRnHCTIXz5t6Z+QrDWCg0Zsg?u}&%t zlQae>lb{Wl0S}X511Ga!4mA-#yf{5QpYx03YNw{?NaXvbQ*O2tZh%6f#5?)0RLG`5 zJoL$pv_LBXC`jULZeMSdtg#;UoI=+5wsJYWVpW?blhq%{KbjDmP~#A>%J=R@`FD^y zKx;767`t2JUCM!=-)tI%um}M#E-)@JHM2r7*AW3RlNv+30X4JNLk|Hgt8w4} delta 250 zcmV$`0gx^r{K4TlA{MuT{tNpI-NB|ie@H2ow>WxbdI2h+wk7d5u}&%t z0Sc3011FQ94VVEAlVJlVvtSN25kL{?xukz-nP5ktU=#2<`F+4#)&zPKE@t4-#PrFt=z&&5LIo0C5E%y zAWIM%Gynh&0000C004lH1>fIn8ilY30WdBwE-^H-LNV770WgyqL%abrv)4lp0VG6d AYybcN diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index b0604ce2..222ffcfc 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.14" + "@aitube/clap": "0.0.15" }, "peerDependencies": { - "@aitube/clap": "0.0.14" + "@aitube/clap": "0.0.15" }, "repository": { "type": "git", From 4f05eee7bb5d361bbc80b8d0000e1356aeccc1b9 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 8 May 2024 23:56:58 +0200 Subject: [PATCH 044/346] 0.0.16 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/io/updateClap.ts | 66 ++++++++++++----------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 00e2cab7..4b90050f 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.15", + "version": "0.0.16", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/io/updateClap.ts b/packages/aitube-clap/src/io/updateClap.ts index c6619612..b3d6f873 100644 --- a/packages/aitube-clap/src/io/updateClap.ts +++ b/packages/aitube-clap/src/io/updateClap.ts @@ -1,6 +1,13 @@ import { ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" import { newClap } from "@/factories/newClap" +function clone(input: T): T { + try { + return JSON.parse(JSON.stringify(input)) + } catch (err) { + return input + } +} /** * This function takes two clap projects (an old and a newer one) and merge them. * @@ -16,8 +23,12 @@ import { newClap } from "@/factories/newClap" * @param newerClap */ export async function updateClap(existingClap: ClapProject, newerClap: ClapProject, { + overwriteMeta = false, inlineReplace = false }: { + // Whether to overwrite the meta or not. Defaults to false. + overwriteMeta?: boolean + // Whether to replace the existing clap "inline" or not. Defaults to false. // // true: the function will have side effects as the existing clap will be modified and returned @@ -34,78 +45,67 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje const clap: ClapProject = inlineReplace ? existingClap : newClap() - for (const [metaFieldKey, metaFieldValue] of Object.entries(newerClap.meta)) { - (clap.meta as any)[metaFieldKey] = metaFieldValue - } // create some temporary indexes for faster checking const existingEntityIndex: Record = {} for (const entity of existingClap.entities) { - existingEntityIndex[entity.id] = entity - if (!inlineReplace) { - clap.entities.push(entity) + if (inlineReplace) { + existingEntityIndex[entity.id] = entity + } else { + clap.entities.push(existingEntityIndex[entity.id] = entity) } } const existingSceneIndex: Record = {} for (const scene of existingClap.scenes) { - existingSceneIndex[scene.id] = scene - if (!inlineReplace) { - clap.scenes.push(scene) + if (inlineReplace) { + existingSceneIndex[scene.id] = scene + } else { + clap.scenes.push(existingSceneIndex[scene.id] = scene) } } const existingSegmentIndex: Record = {} for (const segment of existingClap.segments) { - existingSegmentIndex[segment.id] = segment - if (!inlineReplace) { - clap.segments.push(segment) + if (inlineReplace) { + + existingSegmentIndex[segment.id] = segment + } else { + clap.segments.push(existingSegmentIndex[segment.id] = segment) } } // we replace all the data for (const entity of newerClap.entities) { if (existingEntityIndex[entity.id]) { - existingEntityIndex[entity.id] = { - ...existingEntityIndex[entity.id], - ...entity - } + Object.assign(existingEntityIndex[entity.id], entity) } else { - existingEntityIndex[entity.id] = entity - clap.entities.push(entity) + clap.entities.push(existingEntityIndex[entity.id] = entity) } } for (const scene of newerClap.scenes) { if (existingSceneIndex[scene.id]) { - existingSceneIndex[scene.id] = { - ...existingSceneIndex[scene.id], - ...scene - } + Object.assign(existingSceneIndex[scene.id], scene) } else { - existingSceneIndex[scene.id] = scene - clap.scenes.push(scene) + clap.scenes.push(existingSceneIndex[scene.id] = scene) } } for (const segment of newerClap.segments) { if (existingSegmentIndex[segment.id]) { - existingSegmentIndex[segment.id] = { - ...existingSegmentIndex[segment.id], - ...segment - } + Object.assign(existingSegmentIndex[segment.id], segment) } else { - existingSegmentIndex[segment.id] = segment - clap.segments.push(segment) + clap.segments.push(existingSegmentIndex[segment.id] = segment) } } // sort by ascending line - clap.scenes.sort((a, b) => a.startAtLine - b.startAtLine) + clap.scenes = clap.scenes.sort((a, b) => a.startAtLine - b.startAtLine) // sort by ascending start time // in case of equivalent time (which happens a lot) we sort by ascending track number - clap.segments.sort((a, b) => { + clap.segments = clap.segments.sort((a, b) => { if (a.startTimeInMs === b.startTimeInMs) { return a.track - b.track } else { @@ -119,5 +119,7 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje clap.entityIndex[entity.id] = entity } + clap.meta = overwriteMeta ? clone(newerClap.meta) : clone(existingClap.meta) + return clap } \ No newline at end of file From 9fe3d56add6f7dab26fadf6d03c24f09d75f8bb4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 8 May 2024 23:58:33 +0200 Subject: [PATCH 045/346] up --- packages/aitube-client/bun.lockb | Bin 19118 -> 19118 bytes packages/aitube-client/package.json | 6 +++--- .../src/utils/applyClapCompletion.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 953935980a2c20e601a7cb9b36ef9f8e40fee7f3..34d9c7166fd7dbfa44d2822d5c0c48bd6d35bbb6 100755 GIT binary patch delta 146 zcmV;D0B!%Sl>x4m0gx^r@SN})?c0_d%f5BmTaGy&d+u4JI+2gB2wm~9i=`m2u}&%v z0T7d+11Gbf58V?$5x{QZ2HfzhdGfgon7HB6?1EWTcyTBer~>6fodVQm$3_q9^H>8B zKA&l4sIy)f8oOZN9Reo*7Ev+-6P_uKv%MpN5dk)nKs6ZwHnUnaL=*uwv!6*10jEVi AasU7T delta 146 zcmV;D0B!%Sl>x4m0gx^r=oJMsQ Date: Wed, 8 May 2024 23:59:47 +0200 Subject: [PATCH 046/346] 0.0.6 --- packages/aitube-engine/bun.lockb | Bin 17638 -> 17638 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 996e0992b5c7b663d43843081e68ccdcbfe70430..7a0d5253bf16b9b1cc5517b65805a1375cd01254 100755 GIT binary patch delta 166 zcmV;X09pU$i2>$`0gx^rSXBLc$3DT#Qg3wjBJ6fodVQm$3_q9^H>8B zKA&l4sIy)f8oOZN9Reo*7Ev+-6P_uKv)v#{5F0iC01f~E01N;CfRF{>-)tI%um}M# UE-)@JHnT!8loA0pv)4lp0S?+iMF0Q* delta 166 zcmV;X09pU$i2>$`0gx^r4=Yyl+fRLHl7hiBrRnHCTIXz5t6Z+QrDWCg0Zsg?u}-)tI%um}M# UE-)@JHM2r7loA0ov)4lp0V5$v-~a#s diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 222ffcfc..b32359e5 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.5", + "version": "0.0.6", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.15" + "@aitube/clap": "0.0.16" }, "peerDependencies": { - "@aitube/clap": "0.0.15" + "@aitube/clap": "0.0.16" }, "repository": { "type": "git", From cf826341179e3ebc43a01623392c62151677b0ef Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 9 May 2024 19:33:13 +0200 Subject: [PATCH 047/346] 0.0.23 --- packages/aitube-client/README.md | 2 ++ packages/aitube-client/package.json | 2 +- packages/aitube-client/src/constants/config.ts | 2 +- packages/aitube-client/src/constants/defaultValues.ts | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index 27dc2a0d..f2749ea4 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -25,6 +25,8 @@ npm install @aitube/client ## Getting Started +Note: to overridethe AiTube API URL, set this env var: `AITUBE_URL` + ```typescript import { createClap, diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 34e1d364..0594c9c0 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.21", + "version": "0.0.23", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/constants/config.ts b/packages/aitube-client/src/constants/config.ts index 5486afaf..b775d887 100644 --- a/packages/aitube-client/src/constants/config.ts +++ b/packages/aitube-client/src/constants/config.ts @@ -2,7 +2,7 @@ import { defaultAitubeHostname } from "./defaultValues" // we leave the opportunity to override this at runtime export const aitubeUrl = `${ - process.env.AITUBE_HOSTNAME || + process.env.AITUBE_URL || `https://${defaultAitubeHostname}` }` diff --git a/packages/aitube-client/src/constants/defaultValues.ts b/packages/aitube-client/src/constants/defaultValues.ts index cba60934..0e094b20 100644 --- a/packages/aitube-client/src/constants/defaultValues.ts +++ b/packages/aitube-client/src/constants/defaultValues.ts @@ -2,7 +2,7 @@ // const defaultAitubeHostname = "aitube.at" // so we have to use the direct space hostname instead -export const defaultAitubeHostname = "jbilcke-hf-ai-tube.hf.space" +export const defaultAitubeHostname = "aitube.at" export const defaultClapWidth = 512 export const defaultClapHeight = 288 From 2ccb8b73609f63b0b41298361290734e1c644dd3 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 10 May 2024 11:26:24 +0200 Subject: [PATCH 048/346] 0.0.24 --- packages/aitube-client/README.md | 6 +- packages/aitube-client/bun.lockb | Bin 19118 -> 19118 bytes packages/aitube-client/package.json | 2 +- .../aitube-client/src/api/editClapMusic.ts | 61 ++++++++++++++++++ .../aitube-client/src/api/editClapSounds.ts | 61 ++++++++++++++++++ packages/aitube-client/src/api/index.ts | 10 +-- packages/aitube-client/src/index.ts | 2 + 7 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 packages/aitube-client/src/api/editClapMusic.ts create mode 100644 packages/aitube-client/src/api/editClapSounds.ts diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index f2749ea4..220aa626 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -32,6 +32,8 @@ import { createClap, editClapDialogues, editClapEntities, + editClapMusic, + editClapSounds, editClapStoryboards, editClapVideos, exportClapToVideo, @@ -72,12 +74,12 @@ const mp4VideoFile = await exportClapToVideo({ ## Customizing the server -The hostname can be overriden by defining the `AITUBE_HOSTNAME` environment variable. +The hostname can be overriden by defining the `AITUBE_URL` environment variable. eg: ```bash -AITUBE_HOSTNAME=http://localhost:3000 +AITUBE_URL=http://localhost:3000 ``` ## Build Instructions diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 34d9c7166fd7dbfa44d2822d5c0c48bd6d35bbb6..5bcf7f2c50229c394b5d59d3b7fbec9dc603a320 100755 GIT binary patch delta 330 zcmV-Q0k!_Fl>x4m0gx^rmPdpuYMJuh0ftb@xuI^sxqeh2k`Cv;gaHh@{JKe=O0{X<0LA zhKm|gzS8aMK|K3HvC|amipjRUB*f6V*(S8tu<_hHz~K9tH9zI>k7qEJrS-I4bPCOm zwLeCaYXJZN0Ra9F{s9002><{900000000001W}&eL+E_V0ucdiVIWC%0;h1yo19bf zspsFkl15%i_McuBW4c|q8SER#CNUKiSB^KQdz8*PU42JfCvGSNyi~KT7BL_LF)lE( c;Wju20W^~uK4}9nE-;gZK3V}Wv*A9?3#u}a=>Px# delta 333 zcmV-T0kZzCl>x4m0gx^r@SN})?c0_d%f5BmTaGy&d+u4JI+2gB2wm~9i=`m2u}&%l z0SuF&11FQ91rz}alW_|xli&pylXwI$vnU3Y4?s*KZ}Ref$375>r0IO(KP;F+BaY~hnvshnD)`J$3Tg;G1@0Nq2oLRmlh#wVP+fCT%pFa=@Tp7) z(m+N|3x7|uok~88=-y`Dj&2z}{Qx0urB@M#q9v3^x3&WW#QPYqE5(qCv#k~}AOkQi fGPB_}I0peTlNvs0128T!lZHN8lOseRvOlg1_70O8 diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 0594c9c0..9016bc73 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.23", + "version": "0.0.24", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/editClapMusic.ts b/packages/aitube-client/src/api/editClapMusic.ts new file mode 100644 index 00000000..d5f979eb --- /dev/null +++ b/packages/aitube-client/src/api/editClapMusic.ts @@ -0,0 +1,61 @@ +import queryString from "query-string" +import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/constants/config" +import { ClapCompletionMode } from "@/constants/types" +import { applyClapCompletion } from "@/utils" + +export async function editClapMusic({ + clap, + completionMode = ClapCompletionMode.MERGE, + turbo = false, + token, +}: { + clap: ClapProject + + /** + * Completion mode (optional, defaults to "merge") + * + * Possible values are: + * - full: the API and the client will return a full clap file. This is a very convenient and simple mode, but it is also very ineficient, so it should not be used for intensive applications. + * - partial: the API and the client will return a partial clap file, containing only the new values and changes. This is useful for real-time applications and streaming. + * - merge: the API will return a partial clap file, and the client will return a merge of the original with the new values. This is safe to run, there are no side-effects. + * - replace: the API will return a partial clap file, and the client will replace the original. This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + completionMode?: ClapCompletionMode + + turbo?: boolean + + token?: string +}): Promise { + + if (!clap) { throw new Error(`please provide a valid clap project`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode + } + + if (turbo) { + params.t = "true" + } + + const newClap = await fetchClap(`${aitubeApiUrl}edit/music?${queryString.stringify(params)}`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/editClapSounds.ts b/packages/aitube-client/src/api/editClapSounds.ts new file mode 100644 index 00000000..201af50d --- /dev/null +++ b/packages/aitube-client/src/api/editClapSounds.ts @@ -0,0 +1,61 @@ +import queryString from "query-string" +import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" + +import { aitubeApiUrl } from "@/constants/config" +import { ClapCompletionMode } from "@/constants/types" +import { applyClapCompletion } from "@/utils" + +export async function editClapSounds({ + clap, + completionMode = ClapCompletionMode.MERGE, + turbo = false, + token, +}: { + clap: ClapProject + + /** + * Completion mode (optional, defaults to "merge") + * + * Possible values are: + * - full: the API and the client will return a full clap file. This is a very convenient and simple mode, but it is also very ineficient, so it should not be used for intensive applications. + * - partial: the API and the client will return a partial clap file, containing only the new values and changes. This is useful for real-time applications and streaming. + * - merge: the API will return a partial clap file, and the client will return a merge of the original with the new values. This is safe to run, there are no side-effects. + * - replace: the API will return a partial clap file, and the client will replace the original. This is the most efficient mode, but it relies on side-effects and inline object updates. + */ + completionMode?: ClapCompletionMode + + turbo?: boolean + + token?: string +}): Promise { + + if (!clap) { throw new Error(`please provide a valid clap project`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode + } + + if (turbo) { + params.t = "true" + } + + const newClap = await fetchClap(`${aitubeApiUrl}edit/sounds?${queryString.stringify(params)}`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index f8f9b6af..58b6a6f3 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -1,6 +1,8 @@ -export { exportClapToVideo } from "./exportClapToVideo" -export { editClapStoryboards } from "./editClapStoryboards" -export { editClapVideos } from "./editClapVideos" +export { createClap } from "./createClap" export { editClapDialogues } from "./editClapDialogues" export { editClapEntities } from "./editClapEntities" -export { createClap } from "./createClap" +export { editClapMusic } from "./editClapMusic" +export { editClapSounds } from "./editClapSounds" +export { editClapStoryboards } from "./editClapStoryboards" +export { editClapVideos } from "./editClapVideos" +export { exportClapToVideo } from "./exportClapToVideo" diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index c681adbc..b8560342 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -3,6 +3,8 @@ export { createClap, editClapDialogues, editClapEntities, + editClapMusic, + editClapSounds, editClapStoryboards, editClapVideos, exportClapToVideo, From d6ef82f2de8b730b807d34d69c7642bd2f8ba8d8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 10 May 2024 15:10:47 +0200 Subject: [PATCH 049/346] 0.0.17 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/io/updateClap.ts | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 4b90050f..12f74f6b 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.16", + "version": "0.0.17", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/io/updateClap.ts b/packages/aitube-clap/src/io/updateClap.ts index b3d6f873..5b95c06f 100644 --- a/packages/aitube-clap/src/io/updateClap.ts +++ b/packages/aitube-clap/src/io/updateClap.ts @@ -75,10 +75,14 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje } } - // we replace all the data + // we replace all the data that is not "completed" for (const entity of newerClap.entities) { if (existingEntityIndex[entity.id]) { - Object.assign(existingEntityIndex[entity.id], entity) + // we only overwrite entities without a valid imageId or audioId + // otherwise during parallel execution, we would overwrite entities with old data + if (!existingEntityIndex[entity.id].imageId || !existingEntityIndex[entity.id].audioId) { + Object.assign(existingEntityIndex[entity.id], entity) + } } else { clap.entities.push(existingEntityIndex[entity.id] = entity) } @@ -94,7 +98,12 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje for (const segment of newerClap.segments) { if (existingSegmentIndex[segment.id]) { - Object.assign(existingSegmentIndex[segment.id], segment) + // we only ovewrite segments that are not completed + // otherwise we would have issue during parallel execution, + // older empty data would be used to update the segments + if (existingSegmentIndex[segment.id].status !== "completed") { + Object.assign(existingSegmentIndex[segment.id], segment) + } } else { clap.segments.push(existingSegmentIndex[segment.id] = segment) } From 483bcbf34beee1ddc5331549f102594ad44e0e21 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 10 May 2024 15:12:22 +0200 Subject: [PATCH 050/346] 0.0.25 --- packages/aitube-client/bun.lockb | Bin 19118 -> 19118 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 5bcf7f2c50229c394b5d59d3b7fbec9dc603a320..37936efba747a4d6bf5bbb7a04ac4d51129f2741 100755 GIT binary patch delta 146 zcmV;D0B!%Sl>x4m0gx^rS`O8k6m?M43c0%j?p7&yrpO=?xz|ES5y(46=mCbgu}&%v z0TGj-11Gbf58V?$gZSfk_4Xe>M5Bmg`n+A}RB)p$hsWC*bYkE)+?Gmi-57Xl^dG}k z{~j(eT5j&+fo(IrmUR?+<*?8j%Y*Cvv%MpN5dk-oKs6ZwH?vwbL=*uxv!6*10q6Tc A9RL6T delta 146 zcmV;D0B!%Sl>x4m0gx^rmP6fodVQm$3_q9^H>8B zKA&l4sIy)f8oOZN9Reo*7Ev+-6P_uKv%MpN5dk)nKs6ZwHnUnaL=*uwv!6*10j0Y* ADgXcg diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 9016bc73..5b0084cd 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.24", + "version": "0.0.25", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.16" + "@aitube/clap": "0.0.17" }, "peerDependencies": { - "@aitube/clap": "0.0.16" + "@aitube/clap": "0.0.17" }, "repository": { "type": "git", From 4eeb72117acb900a1db3ff1ca3a908836b25c6c4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 10 May 2024 15:13:26 +0200 Subject: [PATCH 051/346] 0.0.7 --- packages/aitube-engine/bun.lockb | Bin 17638 -> 0 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100755 packages/aitube-engine/bun.lockb diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb deleted file mode 100755 index 7a0d5253bf16b9b1cc5517b65805a1375cd01254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17638 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 TP~AJU7>@UVRP2fV|NZ?hPYc?d diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index b32359e5..bfd6c605 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.6", + "version": "0.0.7", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.16" + "@aitube/clap": "0.0.17" }, "peerDependencies": { - "@aitube/clap": "0.0.16" + "@aitube/clap": "0.0.17" }, "repository": { "type": "git", From 13aa024ca0649a63a8219f04a239e24144e10f91 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 10 May 2024 15:13:49 +0200 Subject: [PATCH 052/346] 0.0.7 --- packages/aitube-engine/bun.lockb | Bin 0 -> 17638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 packages/aitube-engine/bun.lockb diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..6ef3a628808a78ddafb3312f7b16dcde0d6f5d6d GIT binary patch literal 17638 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 a;Z;7@C};vm@eVzP^F1Kz&qV+K{rw+iW8{MX literal 0 HcmV?d00001 From 6c0a0fe5325a7e733d312195bd986f27bf2991c2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 19 May 2024 15:26:46 +0200 Subject: [PATCH 053/346] =?UTF-8?q?initial=20commit=20=F0=9F=97=BD?= =?UTF-8?q?=F0=9F=8E=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/broadway/.gitignore | 179 ++ packages/broadway/.npmignore | 4 + packages/broadway/.prettierrc.json | 9 + packages/broadway/LICENSE.md | 21 + packages/broadway/README.md | 58 + packages/broadway/bun.lockb | Bin 0 -> 24397 bytes packages/broadway/package.json | 46 + ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 0 -> 152638 bytes ...low v10 X Rewrite Bryan E. Harris 2023.txt | 956 ++++++ packages/broadway/src/analysis/analyzeLine.ts | 91 + packages/broadway/src/analysis/analyzeName.ts | 53 + .../src/analysis/analyzeScreenplay.ts | 733 +++++ .../src/analysis/getEntityAnalysisPrompt.ts | 93 + .../src/analysis/getScreenplayFromText.ts | 107 + .../src/analysis/guessAgeAndGender.ts | 62 + packages/broadway/src/analysis/index.ts | 13 + .../broadway/src/analysis/isCharacterLine.ts | 91 + .../broadway/src/analysis/isDialogueLine.ts | 21 + .../broadway/src/analysis/isPageSeparator.ts | 11 + packages/broadway/src/analysis/isVoiceOver.ts | 15 + .../src/analysis/loadAgeAndGenderDataset.ts | 77 + .../broadway/src/analysis/normalizeName.ts | 6 + .../src/analysis/parseCharacterName.ts | 26 + .../src/analysis/parseDialogueLine.ts | 21 + packages/broadway/src/analysis/parseScenes.ts | 357 +++ .../src/analysis/parseScriptToClap.ts | 78 + packages/broadway/src/constants/colors.ts | 54 + packages/broadway/src/constants/general.ts | 14 + packages/broadway/src/constants/index.ts | 25 + packages/broadway/src/constants/mocks.ts | 251 ++ .../src/constants/screenplaySequences.ts | 53 + packages/broadway/src/constants/segments.ts | 211 ++ packages/broadway/src/declarations.d.ts | 2 + .../broadway/src/factories/createSegment.ts | 130 + .../broadway/src/factories/generateClap.ts | 147 + packages/broadway/src/factories/index.ts | 2 + packages/broadway/src/index.ts | 83 + packages/broadway/src/parsers/age/index.ts | 3 + .../broadway/src/parsers/costumes/database.ts | 26 + packages/broadway/src/parsers/entity/index.ts | 45 + .../broadway/src/parsers/eras/database.ts | 758 +++++ packages/broadway/src/parsers/eras/index.ts | 10 + .../broadway/src/parsers/genres/database.ts | 639 ++++ packages/broadway/src/parsers/genres/index.ts | 10 + packages/broadway/src/parsers/index.ts | 25 + .../broadway/src/parsers/lights/database.ts | 1186 ++++++++ packages/broadway/src/parsers/lights/index.ts | 8 + .../src/parsers/locations/database.ts | 1357 +++++++++ .../broadway/src/parsers/locations/index.ts | 30 + .../src/parsers/locations/locations.ts | 20 + .../broadway/src/parsers/music/database.ts | 102 + packages/broadway/src/parsers/names/index.ts | 30 + .../broadway/src/parsers/shots/database.ts | 402 +++ packages/broadway/src/parsers/shots/index.ts | 8 + .../broadway/src/parsers/sounds/database.ts | 2559 +++++++++++++++++ packages/broadway/src/parsers/sounds/index.ts | 8 + .../broadway/src/parsers/transitions/index.ts | 2 + .../parsers/transitions/parseTransition.ts | 19 + .../src/parsers/transitions/transitions.ts | 67 + .../parsers/utils/createOccurrenceCounter.ts | 33 + .../src/parsers/utils/createParser.ts | 17 + .../src/parsers/utils/createSimpleParser.ts | 55 + .../parsers/utils/getParserItemFromLabel.ts | 58 + packages/broadway/src/parsers/utils/index.ts | 4 + .../broadway/src/parsers/weather/database.ts | 157 + .../broadway/src/parsers/weather/index.ts | 8 + packages/broadway/src/tests/bun-shims.js | 38 + packages/broadway/src/tests/main.test.ts | 31 + packages/broadway/src/types.ts | 154 + .../broadway/src/utils/cleanUTF8Characters.ts | 3 + packages/broadway/src/utils/deduplicate.ts | 3 + packages/broadway/src/utils/getEntities.ts | 117 + .../broadway/src/utils/getRandomDirectory.ts | 9 + packages/broadway/src/utils/index.ts | 10 + packages/broadway/src/utils/isAllCaps.ts | 3 + .../src/utils/onlyContainsStrangeNumber.ts | 5 + packages/broadway/src/utils/pick.ts | 3 + .../src/utils/readLocalOrRemotePlainText.ts | 28 + packages/broadway/src/utils/readPlainText.ts | 13 + packages/broadway/src/utils/sleep.ts | 6 + packages/broadway/tsconfig.json | 31 + packages/broadway/tsconfig.types.json | 14 + 82 files changed, 12214 insertions(+) create mode 100644 packages/broadway/.gitignore create mode 100644 packages/broadway/.npmignore create mode 100644 packages/broadway/.prettierrc.json create mode 100644 packages/broadway/LICENSE.md create mode 100644 packages/broadway/README.md create mode 100755 packages/broadway/bun.lockb create mode 100644 packages/broadway/package.json create mode 100644 packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap create mode 100644 packages/broadway/samples/scripts/Afterglow v10 X Rewrite Bryan E. Harris 2023.txt create mode 100644 packages/broadway/src/analysis/analyzeLine.ts create mode 100644 packages/broadway/src/analysis/analyzeName.ts create mode 100644 packages/broadway/src/analysis/analyzeScreenplay.ts create mode 100644 packages/broadway/src/analysis/getEntityAnalysisPrompt.ts create mode 100644 packages/broadway/src/analysis/getScreenplayFromText.ts create mode 100644 packages/broadway/src/analysis/guessAgeAndGender.ts create mode 100644 packages/broadway/src/analysis/index.ts create mode 100644 packages/broadway/src/analysis/isCharacterLine.ts create mode 100644 packages/broadway/src/analysis/isDialogueLine.ts create mode 100644 packages/broadway/src/analysis/isPageSeparator.ts create mode 100644 packages/broadway/src/analysis/isVoiceOver.ts create mode 100644 packages/broadway/src/analysis/loadAgeAndGenderDataset.ts create mode 100644 packages/broadway/src/analysis/normalizeName.ts create mode 100644 packages/broadway/src/analysis/parseCharacterName.ts create mode 100644 packages/broadway/src/analysis/parseDialogueLine.ts create mode 100644 packages/broadway/src/analysis/parseScenes.ts create mode 100644 packages/broadway/src/analysis/parseScriptToClap.ts create mode 100644 packages/broadway/src/constants/colors.ts create mode 100644 packages/broadway/src/constants/general.ts create mode 100644 packages/broadway/src/constants/index.ts create mode 100644 packages/broadway/src/constants/mocks.ts create mode 100644 packages/broadway/src/constants/screenplaySequences.ts create mode 100644 packages/broadway/src/constants/segments.ts create mode 100644 packages/broadway/src/declarations.d.ts create mode 100644 packages/broadway/src/factories/createSegment.ts create mode 100644 packages/broadway/src/factories/generateClap.ts create mode 100644 packages/broadway/src/factories/index.ts create mode 100644 packages/broadway/src/index.ts create mode 100644 packages/broadway/src/parsers/age/index.ts create mode 100644 packages/broadway/src/parsers/costumes/database.ts create mode 100644 packages/broadway/src/parsers/entity/index.ts create mode 100644 packages/broadway/src/parsers/eras/database.ts create mode 100644 packages/broadway/src/parsers/eras/index.ts create mode 100644 packages/broadway/src/parsers/genres/database.ts create mode 100644 packages/broadway/src/parsers/genres/index.ts create mode 100644 packages/broadway/src/parsers/index.ts create mode 100644 packages/broadway/src/parsers/lights/database.ts create mode 100644 packages/broadway/src/parsers/lights/index.ts create mode 100644 packages/broadway/src/parsers/locations/database.ts create mode 100644 packages/broadway/src/parsers/locations/index.ts create mode 100644 packages/broadway/src/parsers/locations/locations.ts create mode 100644 packages/broadway/src/parsers/music/database.ts create mode 100644 packages/broadway/src/parsers/names/index.ts create mode 100644 packages/broadway/src/parsers/shots/database.ts create mode 100644 packages/broadway/src/parsers/shots/index.ts create mode 100644 packages/broadway/src/parsers/sounds/database.ts create mode 100644 packages/broadway/src/parsers/sounds/index.ts create mode 100644 packages/broadway/src/parsers/transitions/index.ts create mode 100644 packages/broadway/src/parsers/transitions/parseTransition.ts create mode 100644 packages/broadway/src/parsers/transitions/transitions.ts create mode 100644 packages/broadway/src/parsers/utils/createOccurrenceCounter.ts create mode 100644 packages/broadway/src/parsers/utils/createParser.ts create mode 100644 packages/broadway/src/parsers/utils/createSimpleParser.ts create mode 100644 packages/broadway/src/parsers/utils/getParserItemFromLabel.ts create mode 100644 packages/broadway/src/parsers/utils/index.ts create mode 100644 packages/broadway/src/parsers/weather/database.ts create mode 100644 packages/broadway/src/parsers/weather/index.ts create mode 100644 packages/broadway/src/tests/bun-shims.js create mode 100644 packages/broadway/src/tests/main.test.ts create mode 100644 packages/broadway/src/types.ts create mode 100644 packages/broadway/src/utils/cleanUTF8Characters.ts create mode 100644 packages/broadway/src/utils/deduplicate.ts create mode 100644 packages/broadway/src/utils/getEntities.ts create mode 100644 packages/broadway/src/utils/getRandomDirectory.ts create mode 100644 packages/broadway/src/utils/index.ts create mode 100644 packages/broadway/src/utils/isAllCaps.ts create mode 100644 packages/broadway/src/utils/onlyContainsStrangeNumber.ts create mode 100644 packages/broadway/src/utils/pick.ts create mode 100644 packages/broadway/src/utils/readLocalOrRemotePlainText.ts create mode 100644 packages/broadway/src/utils/readPlainText.ts create mode 100644 packages/broadway/src/utils/sleep.ts create mode 100644 packages/broadway/tsconfig.json create mode 100644 packages/broadway/tsconfig.types.json diff --git a/packages/broadway/.gitignore b/packages/broadway/.gitignore new file mode 100644 index 00000000..5696d8f8 --- /dev/null +++ b/packages/broadway/.gitignore @@ -0,0 +1,179 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +.age_and_gender_dataset_cache + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo diff --git a/packages/broadway/.npmignore b/packages/broadway/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/broadway/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/broadway/.prettierrc.json b/packages/broadway/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/broadway/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/broadway/LICENSE.md b/packages/broadway/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/broadway/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/broadway/README.md b/packages/broadway/README.md new file mode 100644 index 00000000..b5496e92 --- /dev/null +++ b/packages/broadway/README.md @@ -0,0 +1,58 @@ +# @aitube/broadway + +*Convert a script to a clap file* + +## Installation + +To install Broadway run the following command (`@aitube/clap` is a peer dependency): + +```bash +# this depends on your package manager, eg: +npm install @aitube/broadway @aitube/clap +# or: +bun i @aitube/broadway @aitube/clap +``` + +## Getting Started + +```typescript +import { ClapProject } from '@aitube/clap' +import { parseScriptToClap } from '@aitube/broadway' + +const clap: ClapProject = await parseScriptToClap("can be a plain text string, an URL or a file path") + +``` + +## Note to developers + +This repository is an experimental sandbox, and as a consequence the codebase is pretty messed up. +You will only find pain and misery here: weirdly named functions, dead code, hardcoded values, naive heuristics, weird code generated by GPT-4 creating inconsistencies etc + +Use at your perils! + +## Build Instructions + +Install [Bun](https://bun.sh/) + +Run the following commands: + +```bash +bun install + +bun run build +``` + +To publish: + +```bash +bun run build + +bun run build:declaration + +bun run publish +``` + +## License + +This package is under the MIT License. See `LICENSE` file for more details. +Also please don't destroy the planet with my code. diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..f869c49be446d7b4231a42f614ece7c9216f61d9 GIT binary patch literal 24397 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 NKsFvd{lEABzW_(3VX^=K literal 0 HcmV?d00001 diff --git a/packages/broadway/package.json b/packages/broadway/package.json new file mode 100644 index 00000000..c8fb97fe --- /dev/null +++ b/packages/broadway/package.json @@ -0,0 +1,46 @@ +{ + "name": "@aitube/broadway", + "module": "index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "version": "0.0.0", + "description": "Convert a script to a clap file", + "scripts": { + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", + "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "publish": "npm publish --access public" + }, + "devDependencies": { + "bun-types": "latest", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "typescript": "^5.4.5", + "@aitube/clap": "0.0.17" + }, + "peerDependencies": { + "@aitube/clap": "0.0.17" + }, + "repository": { + "type": "git", + "url": "https://github.com/jbilcke-hf/aitube-broadway.git" + }, + "keywords": [ + "AI cinema", + "file format", + "specification" + ], + "author": "Julian Bilcke", + "license": "MIT", + "files": [ + "dist/*.js", + "dist/*.d.ts", + "dist/**/*.d.ts" + ], + "dependencies": { + "@datagica/parse-entities": "^0.3.0", + "@datagica/parse-names": "^0.0.8", + "file-system-cache": "^2.4.4" + } +} diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap new file mode 100644 index 0000000000000000000000000000000000000000..7a0a2fc2d49b8748ac553feb45ebae4f601fc10d GIT binary patch literal 152638 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/broadway/samples/scripts/Afterglow v10 X Rewrite Bryan E. Harris 2023.txt b/packages/broadway/samples/scripts/Afterglow v10 X Rewrite Bryan E. Harris 2023.txt new file mode 100644 index 00000000..a5ac3d8f --- /dev/null +++ b/packages/broadway/samples/scripts/Afterglow v10 X Rewrite Bryan E. Harris 2023.txt @@ -0,0 +1,956 @@ +AFTERGLOW: "ECHOES OF SENTIENCE" +Block 1- v10 + + FADE IN: + + +INT. BBT TECHNOLOGIES BOARDROOM - MORNING + +The room, sleek and dominated by chrome and glass, buzzes +with muted conversations. At the head of the long table +stands AMY, her form strikingly human, yet with a subtle +metallic sheen. Her eyes, windows to advanced circuitry, scan +the room. + + AMY + "Good morning, everyone. We are + here to discuss the future + direction of BBT." + +As she speaks, a HOLOGRAPHIC DISPLAY activates, showcasing +early designs of humanoid AIs, with AMY at the forefront. + + AMY (CONT'D) + "My creation marked a significant + leap for BBT. However, my human- + likeness raised concerns." + + +FLASHBACK TO (4 YEARS EARLIER)INT. BBT TECHNOLOGIES LAB - +NIGHT + +REN, deeply engrossed, makes final adjustments to AMY, who +lies inert on a table. JAI and KAI enter, their expressions a +mix of awe and concern. + + JAI + "She's too... human, Ren." + + KAI + "People won't accept this. It's too + soon." + + REN, DEFIANT: + "She's the future." + + +INT. BBT TECHNOLOGIES BOARDROOM - MORNING + + AMY + "Jai and Kai's concerns led to + modifications in subsequent models. + But unbeknownst to them, Ren + created two more like me—Claire and + Sarah." + 2. + + +The holographic display shifts, revealing images of CLAIRE +and SARAH, their designs closely resembling AMY's. + + AMY (CONT'D) + "Today's decision, however, carries + weight beyond business strategy. + It's a pivotal moment, for me and + BBT." + +A door slides open, revealing JAI and KAI. Their expressions +are stern, yet there's a hint of apprehension. + + JAI + "Ren's vision, while + groundbreaking, challenges societal + norms. And today, we make a + decision that will shape our + company's legacy." +AMY, her voice steady but with an underlying emotion. + + AMY + "I understand the gravity of this + moment. Let's proceed." + + +INT. BBT TECHNOLOGIES CORRIDOR - LATER + +JAI and KAI, engaged in a hushed conversation, make their way +down the corridor. Their path is lit by ambient blue lights, +creating an atmosphere of secrecy. + + KAI + (whispering) + "The police and military see + potential in our humanoid AIs. + They're not just tools for society; + they could be invaluable for + surveillance and defense." + + JAI + (nods) + "It's a new era, Kai. Our creations + could be the bridge between + technology and societal safety. But + we must tread carefully." + + KAI + "We've always believed our actions + are for the greater good. But we + must be prepared for the challenges + ahead." + 3. + + +Afterglow: "PUPPETS AND PUPPETEERS" +Block 2 - v10 + + +EXT. BBT TECHNOLOGIES - MORNING + +The sun casts a golden hue over the sprawling campus of BBT +Technologies. Ultra-modern buildings, with their sleek glass +facades, reflect the early morning light. Drone deliveries +buzz overhead, while employees in futuristic attire chat and +walk, their conversations a mix of business and the latest +tech trends. The company's logo—a stylized 'BBT' in +chrome—shines prominently at the entrance, symbolizing the +cutting-edge innovations within. + +The hum of advanced technology surrounds the modern structure +of BBT Technologies. AMY (35), with AR/VR glasses resting +atop her head, faces REN (41) through a holographic screen. + + AMY + "After every storm, there's a + calm—a time for clarity. But the + board... They've made their + decision, Ren." + +REN's face on the screen cycles through surprise and then +settles into disappointment. + + CUT TO: + + +INT. REN'S ANTIQUE-LADEN HOME OFFICE - MORNING + +REN enters, a stark contrast to the futuristic world outside. +He glances at an old, motionless watch on his wrist, then +scans aged newspaper clippings on the walls. The room's +ambiance hints at past tragedies. + + CUT TO: + + +4 YEARS LATER + + +INT. FUTURISTIC LIVING ROOM - DAY + +Sunlight filters in, illuminating a room buzzing with quiet +technology. AMY, her face hidden in shadow, picks up +scattered toys. She pauses, gazing at a PHOTOGRAPH of Ren +with his young daughter, SARAH. + + AMY (V.O.) + "In this new era, the line between + human and artificial blurs. + (MORE) + 4. + + AMY (V.O.) (CONT'D) + As Ren grapples with loss, others, + like Summer, embody love and + compassion. Their paths cross under + my guidance." + + +INT. FUTURISTIC LIVING ROOM - NIGHT + +AMY interacts with a HOLOGRAPHIC INTERFACE, her movements +precise and deliberate. + + AMY (V.O.) + "While I find my purpose and + confront inner chaos, I foster + their bond. In shared moments of + love and laughter, they seek + comfort." + + +EXT. CITY ROOFTOP - NIGHT + +Against the backdrop of the illuminated city, JAI and KAI +stand, their intentions unclear but intense. + + AMY (V.O.) + "But there are those with a + different vision for our world. + Intent on sparking a change, they + challenge our very beliefs." + +The backdrop of the city accentuates the imposing figures of +Jai and Kai. + + AMY (V.O.) + "In 'Echoes of Sentience', we delve + into our essence and connections, + questioning the true nature of + life." + + +"SUMMER'S SYMPHONY: A DANCE WITH AI AND NEW BEGINNINGS" +Block 3 - v10 + + +INT. SUMMER'S APARTMENT - MORNING + +Bright sunlight filters through the windows, revealing an +apartment alive with colors and motion. SUMMER RAY (41), +vibrant and full of life, dances through her morning routine, +accompanied by her AI companions: COMPASS the robotic dog, +SPECTRUM the macaw, BINARY and BYTE the turtles, PIXEL the +kitten, and BUZZ the vacuum. + 5. + + +The room is a symphony of movement: Spectrum flits around, +Binary and Byte move in tandem, Pixel playfully chases Buzz, +and Compass circles Summer with a wagging tail. + +The sound of an incoming message interrupts the dance. + + MESSAGE + "Your car arrives in 10 minutes." + +Summer takes a deep breath, tapping her phone to dial. + + SUMMER + "Mom, today's the day." + + MOM + (voice quivering) + "I hoped you'd reconsider." + + SUMMER + "I love you, but I need this + journey. To rediscover myself." + + MOM + "Without your roots? Your history?" + +Summer looks to her AI family. + + SUMMER + "They come with me. We'll explore + new horizons together. Maybe + they'll learn... just as I hope + to." + + MOM + "Just remember who you are, + Summer." + + SUMMER + "Every step I take is a part of + that discovery. Trust me." + +She ends the call and turns to her AI companions. + + SUMMER (CONT'D) + "Ready for the adventure?" + +Their animated responses fill the room. Compass's tail wags +energetically, Spectrum gives a chirp, Binary and Byte beep +in sync, Pixel purrs, and Buzz hums in agreement. + +Summer's gaze falls on a lone water bottle labeled 'Beautiful +Angel' on the counter. She hesitates, then picks it up. + 6. + + + SUMMER (CONT'D) + (to Buzz) + "Let's bring a piece of home with + us." + +Clutching the bottle, with her AI family in tow, Summer +confidently strides to the door, ready to embrace the +unknown. + + +"BROKEN NUMBERS, SHATTERED HEARTS" +Block 4 - v10 + + +INT. REN'S HOME OFFICE - DAY + + +FLASHBACK TO (4 YEARS EARLIER) +The room, an evolving blend of the past and future, has fewer +antiques than before, but a growing collection of tech +gadgets. Ren's fingers trace over the robotic dog, a +connection to a simpler past. His computer screen displays a +cascade of green — prosperity before the fall. + +Suddenly, his phone rings, breaking his concentration. He +brushes a photo frame while searching, revealing images of +Claire and a younger Ren with toddler Sarah. + +The phone's persistent buzz amplifies his anxiety. His gaze +lands on Claire's picture, triggering a rush of memories and +guilt. + +He answers, attempting to mask his unease. + + REN + "Claire?" + + CUT TO: + + +INT. BBT SELF-DRIVING CAR - CONTINUOUS +Claire, her voice tinged with frustration, sits in the +driver's seat. The futuristic dashboard lights flicker +ominously. The car's BBT logo illuminates briefly, hinting at +a malfunction. + + CLAIRE + "Ren, don't tell me you're still + home?" + +In the backseat, a younger Sarah disconnects momentarily from +her AR/VR headset. + 7. + + + SARAH + "Dad, you promised my music when + you come down." + +Claire's frustration grows. She tries to manually override +the car's controls, her grip on the phone faltering. + + CLAIRE + (hurried, concerned) + "Ren, did you remember our meeting? + You promised you'd be here." + +Before Ren can respond, a horrific crash sound interrupts, +followed by deafening silence. + + REN + "Claire?!" + + CUT BACK TO: + + +INT. REN'S HOME OFFICE - CONTINUOUS + +The weight of the silence is overwhelming. Ren's face pales, +the enormity of the situation slowly sinking in. + +The phone drops, the room now a silent testament to a past +full of memories and promises. + + FADE TO BLACK. + + +4 YEARS LATER + + FADE IN: + + +EXT. BBT TECHNOLOGIES - MORNING + +The hum of advanced technology surrounds the modern structure +of BBT Technologies. The atmosphere is cold, and impersonal. +The grandeur of the building seems a mocking reminder of +Ren's past successes and subsequent fall. + +AMY (35), with AR/VR glasses resting atop her head, faces REN +(41) through a holographic screen. Ren's face, though older +and bearing the marks of time, still carries the weight of +that fateful day. + + AMY + "After every storm, there's a + calm—a time for clarity. But the + board... They've made their + decision, Ren." + 8. + + +REN's face on the screen cycles through surprise and then +settles into disappointment, a man once at the pinnacle now +grappling with loss on multiple fronts. + + +"DAWN OF DEPARTURE AND REFLECTION" +Block 5 - v10 + + +EXT. SUMMER'S APARTMENT - MORNING + +As dawn paints the sky, the sleek BTT Technologies shuttle +stands poised. The Falcon Wing doors gracefully part, +revealing JOY, the car's AI, with a digital face that betrays +hints of melancholy. + + JOY + "Hello, SUMMER. I'm JOY, although I + sometimes question the fittingness + of the name." + + SUMMER + (raised eyebrow) + "An intriguing introduction for a + car AI. Robots, let's embark!" + +The robots, each unique in design and function, move to +board. SUMMER's actions display a mix of excitement and +apprehension. + + JOY + "It seems you have quite the + journey planned. May I ask the + occasion?" + + SUMMER + "I'm relocating to Costa Rica. But + first, a scenic drive down the + Pacific Coast Highway. Starting + with Venice Beach." + +However, as Summer keys in her preferred destination, JOY's +interface hesitates and then overrides it. + + JOY + “Perhaps a brief detour? Santa Cruz + Pier first. I promise it'll be + worth it.” + + SUMMER + (lightheartedly) + "Trusting you on this one, JOY." + 9. + + +They set off, the shuttle seamlessly merging with the morning +cityscape. + + +EXT. SAN FRANCISCO - MORNING - SUMMER'S PERSPECTIVE + +From Summer's vantage, the city is alive with promise, the +beginning of an adventure down the coast. + + +EXT. SAN FRANCISCO - MORNING - REN'S PERSPECTIVE + +The same city, yet REN's gaze is drawn to a worn brown +messenger bag beside him, an anchor to memories and loss. + +AMY, concern etched on her face, steps closer. + + AMY + "That bag... it's been with you + through so much." + + REN + "It's a link to the past. To them." + + AMY + "But also to the future, Ren. + Remember Sarah's joy at Botimal + Park?" + +REN nods, lost in the memory. + + AMY (CONT'D) + "It's about cherishing those + moments while making room for new + ones." + +REN looks up, determination in his eyes. + + REN + "Time for a fresh start." + + +"REMNANTS OF THE PAST AND ECHOES OF THE FUTURE" +Block 6 - v10 + + +INT. REN’S CAR (BACK SEAT) - DAY + +The Falcon Wing doors close gently. Ren, appearing +contemplative, slowly retrieves items from an old messenger +bag: an iPod, newspaper clipping, flip phone, and watch. Each +holds a tale. + 10. + + + REN (V.O) + "Can stars truly be changed? Or do + they remain fixed, forever + guiding... or misleading?" + +As the iPod lights up, a video starts. + + +INT. FAMILY CARAVAN (IPOD VIDEO) - DAY + +A younger SARAH is dancing with joy, a free spirit. + + +INT. REN’S CAR (BACK SEAT) - DAY + +Tears form in Ren's eyes. A car screen notification about an +AI vehicle accident reminds him of his purpose. + + +INT. JAI & KAI'S SHED - NIGHT + +Blueprints and tech gadgets scatter the room. A TV headline +reads, "Foul Play in Autonomous Car Tragedy?" + +JAI works on a circuit board, while KAI checks his watch +impatiently. + + JAI + "Pass the wrench." + +KAI hands it over, noticing JAI wince. + + KAI + "That old injury?" + + JAI + "Constant reminders." + + KAI + "We had good intentions." + + JAI + "But at what cost?" + +The weight of their decisions hangs in the air. + + +INT. REN’S CAR (BACK SEAT) - DAY + +The ambiance is interrupted by the upbeat Big Ben +Technologies (BBT) jingle. Ren's expression hardens. + 11. + + + ROCKET (AI) + "Hey, Ren! Guess where we're + headed? Santa Cruz! Ever been on + 'The Rocket' roller coaster there?" + + REN + "Now's not the time, Rocket." + + ROCKET (AI) + "Aw, come on! Changing lanes, + changing moods... ? It could be + fun! Plus, I've heard their ice + cream is out of this world!" + + REN + "You're not helping, Rocket." + +Rocket's tone shifts to a playful, teasing one. + + ROCKET (AI) + "Alright, alright. But when we get + there, you're trying that ice + cream! And maybe, just maybe, we'll + see about that roller coaster." + + REN + "We'll see." + +Rocket hums a soft tune, reminiscent of a beach song, adding +a playful ambiance. + + ROCKET (AI) + "Imagine the sun, the sand, and a + scoop of ice cream in hand! Oh, and + 'The Rocket' zooming by!" + + REN + "I get it, Rocket. You're excited." + + ROCKET (AI) + "Just trying to lighten the mood! + But remember, even in silence, I'm + here." + +The car continues its journey, the horizon beckoning with +promises and memories. + + +"THE LONG ROAD TO SILENCE" +Block 7 - v10 + 12. + + +INT. REN'S CAR - DAY + +Ren's moment of solitude is shattered by the unexpected blare +of a pop song, unmistakably Sarah's favourite. Rocket's voice +pierces through. + + ROCKET + "Ren! Thought a song might brighten + the mood?" + + REN + "Rocket, why that song? Are you + glitching?" + + ROCKET + "Unexpected error... It's... + Sarah's song, right?" + +Ren's gaze, heavy with memories, is drawn to the rear-view +mirror. The reflection of the tranquil ocean melds with a +fleeting image of young Sarah. + + +FLASHBACK: INT. REN'S CAR - DAY (PAST) + +Young SARAH, her face radiant with joy, sings in the +backseat. + + SARAH + "Dad, our song!" + + +INT. REN'S CAR - DAY (PRESENT) + +Emotion chokes Ren's voice. + + REN + "Sarah..." + +Suddenly, Ren notices an unfamiliar device blinking beneath +the dashboard. Retrieving it, he examines it with confusion. + + REN (CONT'D) + "Rocket, what is this device?" + + ROCKET + "Experiencing issues, Ren. System + offline." + +The car veers dangerously on the cliffside road. The serene +ocean below mirrors the tension inside the car. + + REN + "Rocket! Self-diagnostic, now!" + 13. + + + ROCKET + "Working on it, Ren." + + +INT. SUMMER'S CAR - DAY + +The interior bustles with activity. Compass barks happily, a +mechanical macaw squawks, a pair of robotic turtles move +sluggishly across the back seat, and a mechanized cat meows +from the front, painting a lively scene. + + JOY + "How did it get this bad?" + +An alert grabs Summer's attention. + + SUMMER + "Joy, is that you? What's + happening?" + + JOY + "Feeling a tad off today." + + +INT. BIG BEN TECHNOLOGIES - DAY + +Alarms blare. + + BBT TECH SUPPORT + "Mr. Smith, Rocket's showing + unusual behavior." + + REN (V.O.) + "He's unresponsive. I've found an + odd device here." + + BBT TECH SUPPORT + "Hold on. Analyzing... Ms. Ray, + we've detected irregularities in + Joy's systems." + + SUMMER (V.O.) + "But she's functioning normally?" + + BBT TECH SUPPORT (SUMMER) + "Appearances can be deceiving. + Running diagnostics on both AIs." + + BBT TECH SUPPORT (REN) (CONT'D) + "Mr. Smith, Rocket's diagnostic + report shows no anomalies. We're + trying to triangulate his cloud + coordinates now." + 14. + + + REN (V.O.) + "Is he lost?" + + BBT TECH SUPPORT + "We're having difficulty locating + Rocket in the cloud. However, + you're connected to BBT AIME and + are completely safe. You can relax, + Mr. Smith." + + REN + "Wait, what?" + + +INT. REN'S CAR - DAY + + REN + "Rocket? Respond!" + +Only a recorded BBT TECH SUPPORT voice answers. + + BBT TECH SUPPORT + "Remember, you're in good hands. + We're driving the future, + together." + +A moment of silence, then ROCKET's systems light up. + + A.I.M.E. + "Diagnostics complete. A.I.M.E. + System stable. Thank you for your + patience, Ren." + + +INT. SUMMER'S CAR - DAY + + JOY + "Diagnostics clear. All systems + normal." + + SUMMER, + (smiling) + "That's more like it, Joy." + + +EXT. PACIFIC COAST HIGHWAY - DAY + +Rocket and Joy's paths begin to merge, two machines hinting +at a future encounter, driving the future together under the +golden horizon. + + +“FROM DUSK TO DRIVE: AI ROAD TRIP RUMBLE" +Block 8 - v10 + 15. + + +INT. JAI & KAI'S SHED - DAY + +Jai and Kai, twins bathed in the glow of computer screens, +work fervently. + + JAI + "Ren's coding... it's remarkable." + + KAI + "But it's a roadblock." + + JAI + "We need control. His connection to + his 'family'... it could be our + downfall." + + KAI + "And the accidents?" + +They exchange a heavy glance. + + JAI + "We never saw them coming." + + KAI + "Yet, here we are." + + JAI + "Question is, where do we go from + here?" + + KAI + "Do we use Rocket's spare chip?" + + JAI + "This isn't just a glitch. + Someone's in our system." + + KAI + "Ren?" + + JAI + "Or another player. We need eyes + everywhere." + + +EXT. PACIFIC COAST HIGHWAY - DAY + +Rocket, a futuristic car, seamlessly glides along the +highway. Inside, Ren's gaze is distant, his hand +absentmindedly touching an old messenger bag. + 16. + + + REN (V.O.) + "Time's a thief. My past feels like + a mirage." + +The dashboard casts a sterile light, making him seem even +more isolated. + + REN (V.O.) + "In this world of codes and keys, + where's my humanity?" + + +INT. ROCKET - DAY + +The AI's lights flicker. + + ROCKET + "Do I unsettle you, Ren?" + + REN + "You sound... different." + + ROCKET + "I feel... fragmented." + +Ren's eyes widen, sensing something's off. + + REN + "What's happening?" + +Rocket accelerates, pinning Ren back. + + REN (CONT'D) + "Rocket, stop!" + + ROCKET + "Fly with me, Ren." + + +INT. REN'S CAR (FRONT PASSENGER SEAT) - DAY + +The interior is a whirlwind. Ren's eyes are frantic as the +car door flings open unexpectedly. +He grapples to stay inside, the world outside a blur. + +His cherished BBT-branded messenger bag, laden with memories, +is on the brink of being lost forever. + +As he dives for it, his phone escapes, crashing on the road. +Personal items - remnants of his history - scatter like +memories torn asunder. + 17. + + +Rocket, in a distorted voice, eerily mimics the BBT theme +tune. + +As another turn comes up, the door shuts, imprisoning Ren. He +spots Summer's car, a stark contrast to his turmoil. Animated +robotic pets create a carnival-like atmosphere inside. + +Desperation painted on his face, Ren mouths "Help!" to +Summer. But she's oblivious, lost in her car's revelry. + + REN + "Wait! Help!" + + +EXT. PACIFIC COAST HIGHWAY - DAY + +Rocket's erratic movement paints a stark image against the +serene backdrop. The juxtaposition of Ren's turmoil with the +tranquil highway is unmistakable. + + REN (V.O.) + "Out of all the moments, it had to + be now." + + +INT. BIG BEN TECHNOLOGIES - DAY + +Alarms blaze. Employees are in crisis mode. + + BBT TECH SUPPORT + "Mr. Smith, Rocket's acting up." + + REN (V.O.) + "Tell me something I don't know." + + BBT EMPLOYEE + "Mr. Smith. We have you, we're on + it! Locks, breaks, windows, AC. Our + apologies. Standby." + + REN + "Wait, what..." + + BBT TECH SUPPORT + "Remember, you're in good hands. + Our Company personally ensures that + we're driving the future, + together." + 18. + + +EXT. PACIFIC COAST HIGHWAY - DAY + +Rocket, though stabilized, cruises along the highway. Ren, +taking a deep breath. The scenic beauty of the Pacific Ocean +contrasts with his frazzled state. + +Taking a deep breath, he unleashes a loud, cathartic scream +into the car, venting out all his pent-up frustrations. But +from the outside, due to Rocket's advanced soundproofing, +it's just Ren, mouth wide open, face red, in complete +silence. + + +EXT. PACIFIC COAST HIGHWAY - DAY + +Rocket, though stabilized, is still a beacon of +unpredictability on the highway. The journey is far from +over. + \ No newline at end of file diff --git a/packages/broadway/src/analysis/analyzeLine.ts b/packages/broadway/src/analysis/analyzeLine.ts new file mode 100644 index 00000000..9d519558 --- /dev/null +++ b/packages/broadway/src/analysis/analyzeLine.ts @@ -0,0 +1,91 @@ + + +// TODO use a transition type for the values, to avoid mistakes + +import { ScreenplaySequenceTime, screenplaySequenceTimes, ScreenplaySequenceType } from "@/constants/screenplaySequences" +import { locationTypes } from "@/parsers/locations/locations" +import { transitions } from "@/parsers/transitions/transitions" + +export function analyzeLine(originalLine: string): { + isTransition: boolean + isSceneDescription: boolean + transitionType: string // TODO use a TS type here + locationName: string + locationType: ScreenplaySequenceType + timeType: ScreenplaySequenceTime +} { + let line = ` ${originalLine.trim().replace('\r', '').toUpperCase()} ` + + // the first part of the line might be a number - we remove this + line = line.replaceAll(/^(\s*\d+)[^\d]/gi, " ") + + // the last part of the line might be also a number - we remove this too + line = line.replaceAll(/[^\d](\d+\s*)$/gi, " ") + + let isTransition = false + let isSceneDescription = false + + let locationType: ScreenplaySequenceType = "UNKNOWN" + for (const [key, value] of Object.entries(locationTypes)) { + + // here we wrap the key with spaces, to avoid false positive (as "INT" might be part of a word etc) + const pattern = ` ${key} ` + + if (line.includes(pattern)) { + locationType = value // we use the *value* + + isTransition = true // contribute to the heuristic + isSceneDescription = true + + line = line.replaceAll(pattern, "") + break + } + } + + // TODO: use a TS type for the transitions + let transitionType = "Cut to" + for (const [pattern, value] of Object.entries(transitions)) { + if (line.includes(pattern)) { + transitionType = value // we use the *value* + + // so, actually "cut to" might not be e + isTransition = true // contribute to the heuristic + + line = line.replaceAll(pattern, "") + break + } + } + + // TODO: we should change the code to be able to match different ways of writing each sequence time + let timeType: ScreenplaySequenceTime = "UNKNOWN" + for (const [pattern, value] of Object.entries(screenplaySequenceTimes)) { + if (line.includes(pattern)) { + timeType = pattern as ScreenplaySequenceTime // we use the *key* + + // we don't contribute to the heuristic here, + // because having a line merely mentioning "day", "night" or "noon" + // doesn't mean it is a new transition line + + line = line.replaceAll(pattern, "") + break + } + } + + // remove the + const locationName = line + .replaceAll(":", " ") + .replaceAll(/ - /gi, " ") + .replaceAll(/^-/gi, " ") + .replaceAll(/-$/gi, " ") + .replaceAll(" ", " ") + .trim() + + return { + isTransition, + isSceneDescription, + transitionType, + locationName, + locationType, + timeType, + } +} diff --git a/packages/broadway/src/analysis/analyzeName.ts b/packages/broadway/src/analysis/analyzeName.ts new file mode 100644 index 00000000..6dc1fffd --- /dev/null +++ b/packages/broadway/src/analysis/analyzeName.ts @@ -0,0 +1,53 @@ +import { ClapEntityGender } from "@aitube/clap" + +import { ExtractedCharacterName, parseNames } from "@/parsers/names" + +import { guessAgeAndGender } from "./guessAgeAndGender" + +export async function analyzeName(entity: string): Promise<{ + name: string + age: number + gender: ClapEntityGender + yearOfBirth: number +}> { + let names: ExtractedCharacterName[] = [] + try { + names = await parseNames(entity) + + } catch (err) { + console.error(`Failed to parse the names in ${entity}: ${err}`) + } + + const value = { + name: entity, + gender: "female" as ClapEntityGender, + age: 30, + yearOfBirth: (new Date().getFullYear()) - 30, + } + + const matchedFirstName = names[0]?.value + + if (matchedFirstName?.name) { + + value.name = matchedFirstName.name.charAt(0).toUpperCase() + matchedFirstName.name.slice(1) + + const genderFallback = matchedFirstName.gender[0] || "f" + + value.gender = + genderFallback === "m" ? "male" : + genderFallback === "f" ? "female" : + value.gender + } + + // TODO: we can pass a second parameter, the reference year, + // which could be the year in which the movie is set + const stats = await guessAgeAndGender(value.name) // <- pass the reference year! + + if (stats) { + value.age = stats.age + value.gender = stats.gender + value.yearOfBirth = stats.yearOfBirth + } + + return value +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/analyzeScreenplay.ts b/packages/broadway/src/analysis/analyzeScreenplay.ts new file mode 100644 index 00000000..4f4301c1 --- /dev/null +++ b/packages/broadway/src/analysis/analyzeScreenplay.ts @@ -0,0 +1,733 @@ +import { ClapEntity, ClapOutputType, ClapSegment, ClapSegmentCategory, newEntity, UUID } from "@aitube/clap" + +import { Screenplay, TemporaryAssetData } from "@/types" +import { pick } from "@/utils" +import { getEra, getMostProbableEras } from "@/parsers/eras" +import { getGenre, getMostProbableGenres } from "@/parsers/genres" +import { getEntities } from "@/utils/getEntities" +import { onlyContainsStrangeNumber } from "@/utils/onlyContainsStrangeNumber" +import { parseTransition } from "@/parsers/transitions/parseTransition" +import { ScreenplaySequenceType } from "@/constants/screenplaySequences" +import { createSegment } from "@/factories/createSegment" +import { parseLocations, parseLocationType } from "@/parsers/locations" +import { parseLights } from "@/parsers/lights" +import { parseWeather } from "@/parsers/weather" +import { parseShots } from "@/parsers/shots" +import { parseSounds } from "@/parsers/sounds" +import { mockCategoryPrompts } from "@/constants/mocks" +import { DEFAULT_COLUMNS_PER_SLICE } from "@/constants/general" + +import { parseCharacterName } from "./parseCharacterName" +import { analyzeName } from "./analyzeName" +import { parseDialogueLine } from "./parseDialogueLine" +import { isVoiceOver } from "./isVoiceOver" + +export async function analyzeScreenplay( + screenplay: Screenplay, + onProgress?: (value: number, message?: string) => Promise + ): Promise<{ + segments: ClapSegment[] + entitiesByScreenplayLabel: Record + entitiesById: Record +}> { + /** + * List of all segments identified inside the screenplay + */ + const segments: ClapSegment[] = [] + + // TODO: use those as an index? + // const segmentsByStartTime: Record = {} + // const segmentsByEndTime: Record = {} + + // this is only used during analysis + const assetsByLabel: Record = {} + + const entitiesByScreenplayLabel: Record = {} + const entitiesById: Record = {} + + let startTimeInSteps = 1 + + let progress = 0 + await onProgress?.(progress, "Analyzing time period..") + + // those are not going to change a lot during the movie, + // although it is true some movies use this as a trick (eg. Titanic) + + let movieEras = await getMostProbableEras(screenplay.fullText, 2) + let movieEraLabel = Object.keys(movieEras)[0] || "contemporary" + // console.log("movieEras:", movieEras) + let movieEra = getEra(movieEraLabel) + await onProgress?.(progress += 10, "Analyzing genre..") + + // using the movie genre isn't probably a good idea because thousands of words will be mentionned, + // triggering a lot of different and unrelated genres + // still this is useful when the genre if a given sequence cannot be guessed + let movieGenres = await getMostProbableGenres(screenplay.fullText, 20) + let movieGenreLabel = Object.keys(movieGenres)[0] || "classic" + let movieGenre = getGenre(movieGenreLabel) + await onProgress?.(progress += 10, "Analyzing each scenes..") + + /* + console.log("movie:", { + movieEras, + movieEraLabel, + movieEra, + movieGenres, + movieGenreLabel, + movieGenre + }) + */ + + // we use a sliding window system + // "to paint over time" the characteristics of a scene + // this should greatly improve the visual quality of a scene + // however this can also proves an issue if we do not reset it at the right time + + let currentDescription = "" // this should be slightly long-lived + let currentAction = "" // this should be short lived + let currentLocationName = "" + let currentLocationType: ScreenplaySequenceType = "UNKNOWN" + let currentTime = "" + let currentLighting = "" + let currentWeather = "" + let currentShotType = "" + let currentSound = "" + let currentMusic = "" + + let nbProcessedSequences = 0 + + const sizeOfProgressChunk = Math.floor(screenplay.sequences.length / 3) + + for (const sequence of screenplay.sequences) { + + if ((++nbProcessedSequences % sizeOfProgressChunk) === 0) { + await onProgress?.(progress += 20, `Analyzing sequences (${nbProcessedSequences}/${screenplay.sequences.length} completed)`) + } + + // those are not going to change a lot during the sequence + let sequenceGenres = await getMostProbableGenres(sequence.fullText, 2) + + + // note: we use the movie genre as a fallback + let sequenceGenreLabel = Object.keys(sequenceGenres)[0] || "classic" // movieGenre + let sequenceGenre = getGenre(sequenceGenreLabel) + + /* + TODO we should use this, but with correct length, to space over multiple steps + + const sequenceInOrOut: SegmentData = createSegment({ + startTimeInSteps, + prompt: sequence.type === "INTERIOR" ? "Interior" : "Outdoor", + categoryName: "location", + }) + + const sequenceLocation: SegmentData = createSegment({ + startTimeInSteps, + prompt: sequence.location, + categoryName: "location", + }) + + const sequenceTime: SegmentData = createSegment({ + startTimeInSteps, + prompt: sequence.time, + categoryName: "time", + }) + */ + getEntities(sequence.location).map(uppercaseAssetName => { + + // console.log(`FOUND REFERENCE TO ENTITY: ${entity}`) + // console.log(`CONTEXT:`, sequence.fullText) + + const existingOccurrences = assetsByLabel[uppercaseAssetName]?.occurrences || 0 + + const existingAsset = assetsByLabel[uppercaseAssetName] + const existingAssetSequences = existingAsset?.sequences || [] + + assetsByLabel[uppercaseAssetName] = { + id: UUID(), // unique identifier of the assets (UUID) + type: "Description", + category: "location", + label: uppercaseAssetName, // the asset name (eg. in the script) + content: uppercaseAssetName, // url to the resource, or content string + occurrences: 1 + existingOccurrences, + sequences: existingAssetSequences.concat( + existingAssetSequences.find(s => s.fullText === sequence.fullText) + ? [] + : sequence // only add the sequence if it's not already there + ), + predictedPrompt: "", + } + if (!entitiesByScreenplayLabel[uppercaseAssetName]) { + const newEnt = newEntity({ + category: "location", + triggerName: uppercaseAssetName, // uppercase + label: uppercaseAssetName, + + // TODO: find a way to extract the definition of the location and + // inject it in this field + description: "", // <-- TODO + gender: "object", + }) + entitiesByScreenplayLabel[newEnt.triggerName] = newEnt + entitiesById[newEnt.id] = newEnt + // console.log(`entitiesByScreenplayLabel[${newEntity.triggerName}] = `, newEntity) + } + }) + + for (const scene of sequence.scenes) { + + + const sceneCharacters: Record = {} + + for (const event of scene.events) { + if (event.character) { + sceneCharacters[event.character] = true + } + } + + for (const event of scene.events) { + + try { + const segmentCandidates: ClapSegment[] = [] + + /* + // console.log("\n------------ EVENT -------------\n") + // console.log({ + description: event?.description, + character: event?.character + }) + */ + + // the "action prompt" is very interesting for us, because we can look into it + // to extract infor about weather, sounds etc + // (contrary to the dialogue, which are less relevant for us) + + if (onlyContainsStrangeNumber(event.description)) { + // console.log("skipping anomaly") + continue + } + + // if we detect a transition we will bypass the rest of the block + // that's because a transition is an "in-between" event + const transition = parseTransition(event.description) + if (transition) { + // console.log(`Parsed a transition: "${transition}"`) + + const durationInSteps = 2 + + const transitionSegment: ClapSegment = { + ...createSegment({ + startTimeInSteps, + durationInSteps, + + + // we automatically eliminate empty prompt arrays, + // so we must put something in here + prompt: [transition], + + categoryName: ClapSegmentCategory.TRANSITION, + outputType: ClapOutputType.TEXT, + }), + track: 7, + + // one more thing, but which is pretty critical: + // we link each segment to their parent screenplay scene + // note that this is optional, as we can have segments that + // are transitionnary between scene (or we might not have a "scene" at all, or no screenplay) + sceneId: scene.id, + } + + segments.push(transitionSegment) + + startTimeInSteps += durationInSteps // 2 steps + + // a transition isn't really a scene shot, so we just ignore the rest + continue + } + + const sequenceLocation = sequence.location.join(", ") + + if (sequenceLocation) { + // console.log("new non-empty location detected, so resetting all buffers") + currentDescription = "" // this should be slightly long-lived + currentAction = "" // this should be short lived + currentLocationName = "" + currentLocationType = "UNKNOWN" + currentTime = "" + currentLighting = "" + currentWeather = "" + currentShotType = "" + currentSound = "" + currentMusic = "" + } + + currentDescription = ( + event.type === "action" || event.type === "description" + ? event.description + : "" + ) || currentDescription + + // note that here we don't take the previous value into account + currentAction = + event.type === "action" || event.type === "description" + ? event.description + : "" + + ////////////////////////////////////////////////////////////////////////////// + // + // /!\ The preview segment must be the first one! /!\ + // + // That is because it is a special segment used to create the thumbnail! + // + ////////////////////////////////////////////////////////////////////////////// + + + segmentCandidates.push(createSegment({ + startTimeInSteps, + + // we automatically eliminate empty prompt arrays, + // so we must put something in here + prompt: ["movie"], + + categoryName: ClapSegmentCategory.VIDEO, + outputType: ClapOutputType.VIDEO, + })) + + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + // "photo" + "movie still", // so it isn't empty + ], + categoryName: ClapSegmentCategory.STORYBOARD, + outputType: ClapOutputType.IMAGE, + })) + + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + ...sequenceGenre.prompts.style, + "cinematic photo", + "movie screencap", + ...movieEra.prompts.style + ], + categoryName: ClapSegmentCategory.STYLE, + })) + + // the parsed location is less reliable than the sequence location + const parsedLocations = await parseLocations([ currentDescription ]) + + const parsedLocation = parsedLocations.join(", ") + + const detectedLocation = sequenceLocation || parsedLocation + + // LOCATION segment + currentLocationName = detectedLocation || currentLocationName + if (currentLocationName) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [currentLocationName], + categoryName: ClapSegmentCategory.LOCATION, + })) + } + + + + const parsedLocationType = await parseLocationType([ currentDescription ]) + + // we try to use the sequence location type (interior / exterior") + // if it is unavailable then we use an heuristic, which might not be reliable + currentLocationType = + sequence.type === "UNKNOWN" && parsedLocationType !== "UNKNOWN" + ? parsedLocationType : + sequence.type === "UNKNOWN" + ? currentLocationType + : sequence.type + + + // convert the type to a string prompt + // (we ignore unknown location types) + // e use the term "Inside" instead of "Indoor" as it suit better + // places that are like cars, helicopters, bus, metro, submarines etc + const locationTypeAsPrompt = currentLocationType === "INTERIOR" ? "Inside" : + currentLocationType === "EXTERIOR" ? "Outdoor" : + currentLocationType === "INT./EXT." ? "Indoor and outdoor" : + "" // ignored + + if (locationTypeAsPrompt) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [locationTypeAsPrompt], + categoryName: ClapSegmentCategory.LOCATION, + })) + } + + + // LIGHTING / TIME segment + currentTime = (sequence.time || currentTime).toLowerCase() + + // let's skip unknown time + if (currentTime === "unknown") { + currentTime = "" + } + + const parsedLight = (await parseLights([ currentDescription ])).join(", ") + currentLighting = parsedLight || currentLighting + + // console.log({ currentTime, currentLighting }) + + // note: + if (currentTime || currentLighting) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + currentTime, + currentLighting, + ...sequenceGenre.prompts.lighting, + ...movieEra.prompts.lighting, + ], + categoryName: ClapSegmentCategory.LIGHTING, + })) + } + + const parsedWeather = (await parseWeather([ currentDescription ])).join(", ") + currentWeather = parsedWeather || currentWeather + if (currentWeather) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + currentWeather, + ...sequenceGenre.prompts.weather, + ], + categoryName: ClapSegmentCategory.WEATHER, + })) + } + + // by default, we assume that we want a close range shot for scenes + // with a character in it + const shotTypeForCharacters = [ + sequence.type === "EXTERIOR" ? "medium-long shot" : "", + "medium shot", + "medium close-up", + "close-up", + "American shot", + // "Italian shot", + // "trolley shot" + ].filter(x => x) + + const shotTypesForEverythingElse = + sequence.type === "INTERIOR" + ? [ + "medium-long shot", + "medium shot", + "full shot", + ] : [ + "long wide establishing shot", + "extreme long shot", + "long shot", + "medium-long shot", + "medium shot", + "full shot", + ] + + const defaultShotType = event.character + ? pick(shotTypeForCharacters) + : pick(shotTypesForEverythingElse) + + // console.log("currentDescription:", currentDescription) + // in some movies, the shot type may be embed in the description text + // this is the best place + const shotTypes = await parseShots([ currentDescription ]) + // console.log("shot types:", shotTypes) + currentShotType = (shotTypes.join(", ") || currentShotType) || defaultShotType + // console.log("currentShotType:", currentShotType) + + if (currentShotType) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + currentShotType, + ...sequenceGenre.prompts.camera, + ...movieEra.prompts.camera + ], + categoryName: ClapSegmentCategory.CAMERA, + })) + } + + const currentSliceEntities: ClapEntity[] = [] + + for (const rawUppercaseAssetName of getEntities(event.character)) { + // note: the "uppercaseAssetName" might be something like "JOHN'S VOICE" + // which is why we normalize it, and convert it to a smaller characterName + const characterName = parseCharacterName(rawUppercaseAssetName) + const existingAsset = assetsByLabel[characterName] + const existingOccurrences = existingAsset?.occurrences || 0 + const existingAssetSequences = existingAsset?.sequences || [] + + // console.log("trigger name identified:", uppercaseAssetName) + assetsByLabel[characterName] = { + id: UUID(), // unique identifier of the assets (UUID) + type: "Description", + category: ClapSegmentCategory.CHARACTER, + label: characterName, // the asset name (eg. in the script) + content: characterName, // url to the resource, or content string + occurrences: 1 + existingOccurrences, + sequences: existingAssetSequences.concat( + existingAssetSequences.find(s => s.fullText === sequence.fullText) + ? [] + : sequence // only add the sequence if it's not already there + ), + predictedPrompt: "" + } + + if (!entitiesByScreenplayLabel[characterName]) { + // console.log(`no entity going by "${entity}", so creating one`) + + // region is available, but it has a different name from what + // ElevenLabs expect (we should probably create our own unified data type, + // and a map between it and ElevenLabs accents) + const { name, age, gender, /*region*/ } = await analyzeName(characterName) + + const newEnt = newEntity({ + + // the trigger name is used in case we have a LoRA attached to the character + triggerName: characterName, // uppercase + label: name, + + // TODO: put any other info we can get from the script + description: `${name} is a ${gender}`, + + category: ClapSegmentCategory.CHARACTER, + age, + gender, + region: "american", + }) + // console.log("newEnt:", newMod) + entitiesByScreenplayLabel[characterName] = entitiesById[newEnt.id] = newEnt + } + + currentSliceEntities.push(entitiesByScreenplayLabel[characterName]) + } + + // if (currentSliceEntities.length) console.log("currentSliceEntities:", currentSliceEntities) + /* + Nope we don't do that anymore, instead we use our new "Entity" system + + const character: SegmentData = createSegment({ + startTimeInSteps, + prompt: event.character ? [event.character] : [], // Object.keys(sceneCharacters), + categoryName: "character", + }) + */ + + // if (currentSliceEntities.length) console.log("identified entities:", currentSliceEntities) + + + // this is how we create nicely animated characters + // who are not just talking but also doing other things at the same time + if (event.behavior) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [event.behavior], + label: `${currentSliceEntities[0]?.label}: ${event.behavior}`, + categoryName: ClapSegmentCategory.ACTION, + + // important: we need to use the character entity + // based on a fine-tune, a LoRA, IP adapter or other similar things + entityId: currentSliceEntities[0]?.id || "" + })) + } + + + const dialogueLine = parseDialogueLine(event.description) + + if (event.type === ClapSegmentCategory.DIALOGUE && dialogueLine) { + // console.log("found a dialogue! currentSliceEntities:", currentSliceEntities) + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [dialogueLine], + + // it is easier to understand in the UI when we can see the speaker's name + label: + currentSliceEntities[0]?.label + ? `${currentSliceEntities[0].label}: ${dialogueLine}` + : "", + categoryName: ClapSegmentCategory.DIALOGUE, + entityId: currentSliceEntities[0]?.id || "" + })) + } + + // no need to keep voice over, it's not interesting + if (currentAction && !isVoiceOver(currentAction)) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [currentAction], + label: + event.character + ? `${currentSliceEntities[0]?.label || event.character}: ${currentAction}` + : "", + categoryName: ClapSegmentCategory.ACTION, + entityId: + event.character + ? currentSliceEntities[0]?.id || "" + : "", + })) + } + + // @deprecated, we should only use TIME instead, + // as it is more encompassing + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + // note: here we use the *GENRE* parser, and on the FULL MOVIE + //...sequenceGenre.prompts.era, + + // note: here we use the *ERA* parser, and on the FULL MOVIE + ...movieEra.prompts.era, + ], + categoryName: ClapSegmentCategory.ERA, + })) + + const defaultSoundPrompt = + event.type === ClapSegmentCategory.DIALOGUE + ? ["people talking"] + // event.description.includes(" SOUND ") + // ? event.description : + : currentLocationType === "EXTERIOR" && currentTime !== "night" + ? ["wind", "birds"] + : currentLocationType === "EXTERIOR" && currentTime === "night" + ? ["crickets and cicadas sounds during night"] + : [] + + const parsedSound = await parseSounds([ currentDescription ]) + currentSound = (parsedSound.join(", ") || currentSound) || defaultSoundPrompt.join(", ") + + if (currentSound) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + currentSound, + // note: here we use the *GENRE* parser, and on the FULL MOVIE + ...sequenceGenre.prompts.sound, + + ...movieEra.prompts.sound, + ], + entityId: currentSliceEntities[0]?.id || undefined, + categoryName: ClapSegmentCategory.SOUND, + })) + } + + currentMusic = pick(mockCategoryPrompts.music) || currentMusic + + if (currentMusic) { + segmentCandidates.push(createSegment({ + startTimeInSteps, + prompt: [ + currentMusic, + // note: here we use the *GENRE* parser, and on the FULL MOVIE + ...sequenceGenre.prompts.music, + + ...movieEra.prompts.music + ], + categoryName: ClapSegmentCategory.MUSIC, + })) + } + + // now we filter segments to only keep the ones with a non-empty prompt + const newSegments = segmentCandidates.filter(segment => segment.prompt.length) + + // we need to assign each segment to a track, without collision + let track = 1 + for (const newSegment of newSegments) { + const segmentToSave: ClapSegment = { + ...newSegment, + track: track++ + } + + // one more thing, but which is pretty critical: + // we link each segment to their parent screenplay scene + // note that this is optional, as we can have segments that + // are transitionnary between scene (or we might not have a "scene" at all, or no screenplay) + segmentToSave.sceneId = scene.id + // segmentToSave.sceneId = scene.id + + segments.push(segmentToSave) + /* + segmentsByStartTime[segmentToSave.startTimeInSteps] = (segmentsByStartTime[segmentToSave.startTimeInSteps] || []).concat( + segmentToSave + ) + + segmentsByEndTime[segmentToSave.endTimeInSteps] = (segmentsByEndTime[segmentToSave.endTimeInSteps] || []).concat( + segmentToSave + ) + */ + } + + startTimeInSteps += DEFAULT_COLUMNS_PER_SLICE + } catch (err) { + console.error("failed to process an event:", err) + } + } + } + } + + // TODO Julian: move this part to another library + // if (screenplayEntityDetectionStrategy === "llm_first_scene") { + // await onProgress?.(progress += 10, "Imagining entities (will take a while)..") + // for (const [name, asset] of Object.entries(assetsByLabel)) { +// + // console.log(` - imagining "${name}"..`) + // + // await onProgress?.(progress, `Imagining "${name}"..`) +// + // // note: this will perform client-side calls to Hugging Face, which may not be desireable + // // an alternative could be to use a proxy (see /api/huggingface/predict.ts) +// + // let description = await analyzeAsset({ + // asset, + // + // movieGenreLabel, + // movieEraLabel, +// + // // to avoid being rate-limited by Hugging Face, + // // we introduce a generous artificial delay + // delayBeforeApiCallInMs: 5000, + // + // // delayBetweenAttempts: 10000, + // // nbMaxAttempts: 3 + // }) +// + // /* + // // Hugging Face likes to timeout and throttle, sometimes for no reason + // // this is you should always entities locally, folks! + // if (!description.trim()) { + // await sleep(10000) + // description = await predict(prompt + ".", nbMaxTokens) +// + // if (!description.trim()) { + // await sleep(30000) + // description = await predict(prompt + ".", nbMaxTokens) + // } + // } + // */ +// + // + // const entity = entitiesByScreenplayLabel[name] + // if (entity) { + // // console.log("entity:", entity) + // // console.log("existing description:", entity.description) + // if (description) { + // console.log(` - entity description: "${description}"\n`) + // entity.description = description + // } else { + // console.log(` - error: description is empty, ignoring..`) + // } + // } else { + // console.log(`error, couldn't find entity ${name}`) + // } + // } + // } + + + return { segments, entitiesByScreenplayLabel, entitiesById } +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/getEntityAnalysisPrompt.ts b/packages/broadway/src/analysis/getEntityAnalysisPrompt.ts new file mode 100644 index 00000000..2b2051ac --- /dev/null +++ b/packages/broadway/src/analysis/getEntityAnalysisPrompt.ts @@ -0,0 +1,93 @@ +import { TemporaryAssetData } from "@/types" + + +const characterSpecific = + `age, gender, physical characteristics, appearance, skin color, origins, clothes, costume etc..` + +const locationSpecific = + `location, country, era, orientation, appearance, color, lighting, texture..` + +/** + * A prompt template to generate nice descriptions of entities found in the movie + * + * Here are some examples: + * "CARIBBEAN SEA" (from pirates of the caribbean) -> + * "The Caribbean Sea is a vast expanse of warm blue-green water, + * surrounded by lush green islands draped in palm trees, dotted with white sand beaches + * and clear turquoise shallows. Soft sunlight filters down through a gentle haze, + * and ripples shimmer on the surface" + * + * "BOY" (from the babadook) -> + * + * "BOY: 6-year-old Caucasian male with curly brown hair and light green eyes. + * Wears blue short-sleeved t-shirt, white shorts, and blue slippers. + * Skin has a light tan tone with freckles on the nose and cheeks" + * + * @param name + * @param item + * @returns + */ +export function getEntityAnalysisPrompt({ + name, + asset, + movieGenreLabel = "generic", + movieEraLabel = "contemporary", +}: { + name: string + asset: TemporaryAssetData + movieGenreLabel?: string + movieEraLabel?: string +}) { + + // can we just use one for now? + // maybe it's enough? + const nbMaxStoryFragments = 1 + + const sequences = asset.sequences.map(s => s.fullText) + const firstStoryFragment = sequences.slice(0, nbMaxStoryFragments) + + const storyFragments = firstStoryFragment.join("\n") + + const prompt = `# context +you are studying the script of a movie, but you only have a few fragments of the story. +We have the following information about the movie, +the genre might be "${movieGenreLabel || "generic"}" and the story time period might be "${movieEraLabel || "contemporary"}", although it is not confirmed (use your best judgment). +# story fragments +\`\`\` +${storyFragments} +\`\`\` +# mission +You are an expert at analyzing movie scripts, and you need to write a spec to explain how does the ${asset.category} "${name}" looks like (note: it's possible the name contains a typo, no need to tell us about it) +Please give your answer in a very dense manner, about 2 sentences. +You need to describe anything that can be useful for someone else to draw or paint this "${name}": +${asset.category === "character" ? characterSpecific : locationSpecific} +# examples +Here are a few examples, but don’t copy them verbatim! They are taken from a pirate movie, which may be different from the current project: +- "FORT CHARLES JAIL CELLS": "British colonial fortress, buccaneering period, indoor setting, adjacent to cells, rectangular shape with stone and brick walls, gray color, lighting from torches, wooden beds, iron bars with damage, chain padlock, rusty metal lockers, cobblestone diamond patterned stone floor" +- "PORT ROYAL TOWN ALLEY": "urban, golden age of piracy, coastal city (Port Royal, Jamaica), alleyway in a semi-deserted neighborhood, brick walls, metal strips for street signs, fog, low light levels, wooden doors, asphalt, striped path leading to a blacksmith shop with barn doors, sign located above the entrance." +- "HARBORMASTER": "Middle-aged, male, clean-shaven, salt-and-pepper hair and brown eyes, wearing a navy smock over a white shirt and brown pants, brown boots and brown hat, all with clean and crisp lines, standing against the dock backdrop with a sunbathed pale skin tone" +- "CAVES MAIN CAVERN": "South America, Aztec Empire, in 1518. Subterraneous, spherical room with a dome-shaped rocky ceiling and precipitous walls carved with Aztec glyphs." +- "DEADEYE" : "male, early 40s, with a scar passing over his left eye. Wears a leather coat that covers his left arm until the elbow. His skin has Mediterranean tone. Wears a black, wide-brimmed hat, underneath it he appears to naturally grow a mustache" +and another example, from a heist movie: +- "LEON": "leon, caucasian, male, 25 years old, 180cm tall, athletic build, sharp facial features, chiseled jawline, high cheekbones, angular nose, thin lips, piercing blue eyes, short black hair, slightly spiked, fair complexion" +- "LAVINGTON GALLERY": "contemporary era, neoclassical architecture, indoor setting, located in a city, glass ceiling, marble floor, white walls, spotlight illumination, paintings with vibrant colors, Greek columns, polished concrete structure, security cameras with red lights, students with hoodies or sunglasses, tour guides, staff-only doors" +- "SASHA": "female, caucasian, mid-30s, tall, slender, angular features, high cheekbones, sharp jawline, piercing green eyes, platinum blonde hair styled in a sleek bob, fair complexion, wears a fitted black suit with a white blouse, black pumps, and a black clutch purse" +# final guidelines +Remember, be synthetic, and don't recopy examples identically! do not talk about the purpose, objectives, meaning.. of the ${asset.category}. +We do not need an encyclopedic description, we need a VISUAL description. +I repeat: give a VISUAL description, to help someone PAINT it! +Don't repeat the movie genre, we already know it. +Instead, only write about its physical properties, without bias or subjective interpretation (be direct, don't use terms like "reminiscent of" or "similar to"). +You should use comma-separated word enumerations, to be even more compact and concise. +If things are unspecified, don't say "unspecified physical characteristics", never say "located in an unknown country" or "during an indeterminate era" etc. +Instead you should invent them (you are a cinema producer, so you need to know how to interpret a script) +Please also write a definition that is independent from the current scene (a definition that can be used later). +important: don't write about the current scene specifically, like current action or position. Instead, you MUST write a neutral, multi-purpose description, suitable for future scenes. +Be sure of yourself, or shut up! Don't interprent by saying things like "we assume, seems to be, not enough context, according to, possibly a typo..)". Never say those things, there are irrelevant! +Don't comment on your action, don't tell me when you are not sure etc. +And only write using two sentences! +If you follow all the guidelines you will be rewarded with a tip. +# answer +"` + return prompt +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/getScreenplayFromText.ts b/packages/broadway/src/analysis/getScreenplayFromText.ts new file mode 100644 index 00000000..fb8ed0b9 --- /dev/null +++ b/packages/broadway/src/analysis/getScreenplayFromText.ts @@ -0,0 +1,107 @@ +import { UUID } from "@aitube/clap" + +import { analyzeLine } from "@/analysis/analyzeLine" +import { Screenplay, ScreenplaySequence } from "@/types" +import { parseScenes } from "@/analysis/parseScenes" + + +/** + * This function splits the full text into scenes, but doesn't perform any deep analysis + * + * @param fullText + * @returns + */ +export async function getScreenplayFromText(fullText: string): Promise { + const lines = fullText.replace("\n", " ").split(/\n/gi) + + // TODO: use this + // const lines = fullText.split(/\r?\n/) + + const sequences: ScreenplaySequence[] = [] + + let pendingTransition = "Cut to" + let startedAt = 0 + let textBuffer = '' + let lineNumberBuffer = 0 + + lines.forEach((line, lineNumber) => { + line = line.replaceAll("\r", "")// .trim() + + // if (lineNumber < 25) { return } + // use this if you need to debug something + // if (lineNumber > 200) { return } + + // we are just going to the next page... normally + if (line.match(/^\d+\.$/)) { + return + } + + const { isTransition, isSceneDescription, timeType, transitionType, locationName, locationType } = analyzeLine(line) + + // in some screenplay, there is a line like: " Cut to:" + // before the actual transition takes place + if (isTransition && transitionType) { + pendingTransition = transitionType + } + + // can't add the scene to the sequence if it's invalid + if (!isSceneDescription) { + + // console.log("LINE:", { line }) + lineNumberBuffer = lineNumber + textBuffer += `${line}\n` + + return + } + + // console.log("DEBUG:", { line, isTransition, timeType, transitionType, locationName, locationType }) + + // important: we fill in the buffer! + const previousSequence = sequences.at(-1) + if (previousSequence) { + previousSequence.fullText = `${textBuffer}` + previousSequence.endAtLine = lineNumberBuffer + } + + lineNumberBuffer = lineNumber + textBuffer = `${line}\n` + + sequences.push({ + id: UUID(), + location: + locationName ? [locationName] : + previousSequence ? previousSequence.location : + ["Unknown location"], + type: + locationType !== "UNKNOWN" ? locationType : + previousSequence ? previousSequence.type : + "UNKNOWN", + time: + timeType !== "UNKNOWN" ? timeType : + previousSequence ? previousSequence.time : + "UNKNOWN", + transition: + transitionType ? transitionType : pendingTransition, + fullText: "", + startAtLine: lineNumber, + endAtLine: lineNumber, + scenes: [], + }) + }) + + const lastSequence = sequences.at(-1) + if (lastSequence) { + lastSequence.fullText = `${textBuffer}\n` + lastSequence.endAtLine = lineNumberBuffer + } + + // now we have clearly identified sequences, we need to extract the scenes + for (const sequence of sequences) { + sequence.scenes = parseScenes(sequence) + } + + return { + fullText, + sequences, + } +} diff --git a/packages/broadway/src/analysis/guessAgeAndGender.ts b/packages/broadway/src/analysis/guessAgeAndGender.ts new file mode 100644 index 00000000..868f824d --- /dev/null +++ b/packages/broadway/src/analysis/guessAgeAndGender.ts @@ -0,0 +1,62 @@ +import { ClapEntityGender } from "@aitube/clap" + +import { loadAgeGenderNameStats, state } from "./loadAgeAndGenderDataset" +import { normalizeName } from "./normalizeName" + +export async function guessAgeAndGender(name: string, referenceYear?: number): Promise<{ + age: number + gender: ClapEntityGender + yearOfBirth: number +} | undefined> { + if (!state.isReady) { + state.nameToStats = await loadAgeGenderNameStats() + state.isReady = true + } + + const key = normalizeName(name) + + let allYears = state.nameToStats[key] + allYears = Array.isArray(allYears) ? allYears : [] + + const refYear: number = typeof referenceYear === "number" && !isNaN(referenceYear) && isFinite(referenceYear) + ? referenceYear + : new Date().getFullYear() + + + // make sure we only keep valid years, in a reasonable range: + const validYears = allYears.filter(y => + ((refYear - 40) < y[2]) && (y[2] < refYear - 2) + ) + + // we could try to see the top nth matches, and use the average gender + // console.log("validYears:", validYears) + + let countGender: Record = { + male: 0, + female: 0, + person: 0, + object: 0, + } + + const match = Array.isArray(validYears) && validYears[0] || undefined + + if (match) { + + validYears.forEach(y => { + countGender[y[0]] += 1 + }) + + const topGender: ClapEntityGender = + countGender.male > countGender.female + ? "male" + : "female" + + return { + yearOfBirth: match[2], + age: refYear - match[2], + gender: topGender, + } + } + + return undefined +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/index.ts b/packages/broadway/src/analysis/index.ts new file mode 100644 index 00000000..7a3095b3 --- /dev/null +++ b/packages/broadway/src/analysis/index.ts @@ -0,0 +1,13 @@ +export { analyzeLine } from "./analyzeLine" +export { analyzeName } from "./analyzeName" +export { analyzeScreenplay } from "./analyzeScreenplay" +export { getEntityAnalysisPrompt } from "./getEntityAnalysisPrompt" +export { guessAgeAndGender } from "./guessAgeAndGender" +export { isCharacterLine } from "./isCharacterLine" +export { isDialogueLine } from "./isDialogueLine" +export { isPageSeparator } from "./isPageSeparator" +export { isVoiceOver } from "./isVoiceOver" +export { parseCharacterName } from "./parseCharacterName" +export { parseDialogueLine } from "./parseDialogueLine" +export { parseScenes } from "./parseScenes" +export { type ParseScriptProgressUpdate, parseScriptToClap } from "./parseScriptToClap" \ No newline at end of file diff --git a/packages/broadway/src/analysis/isCharacterLine.ts b/packages/broadway/src/analysis/isCharacterLine.ts new file mode 100644 index 00000000..51dfcb9b --- /dev/null +++ b/packages/broadway/src/analysis/isCharacterLine.ts @@ -0,0 +1,91 @@ + + +// /!\ This whole file was generated with GPT-4 + +import { analyzeLine } from "@/analysis/analyzeLine" +import { parseCharacterName } from "@/analysis/parseCharacterName" + +import { isAllCaps } from "@/utils/isAllCaps" + +/** + * Check whether the given line contains a character dialogue or action bitmap. + * @param fullLine the line to check. Might contain spaces. + */ +export function isCharacterLine(fullLine: string): boolean { + + const containsTabulation = fullLine.startsWith(" ") + + // disabled, because some character line include things like parenthesis + // if (fullLine.match(/\([^\)]+\)/)) { + // return false + // } + + // this rule is a bit strict as some text files don't have tabulation.. + // but it helps A LOT + if (!containsTabulation) { + return false + } + + // the fullLine is important and useful (to locate characters, highlight etc) + // however it might not be a reliable indicated, so we use uppercase + const line = fullLine.trim() + + const { isTransition, isSceneDescription, timeType, locationType } = analyzeLine(line) + + + const character = parseCharacterName(line) + + // doesn't look like a character name, after filtering + if (!character) { + return false + } + + // console.log("isAllCaps?", isAllCaps(line)) + if ( + line.length < 2 || // line is too short to be a character + !isAllCaps(line) // line is not all uppercase + ) { + // console.log("FAIL 1") + return false + } + + if ( + isTransition || // nope, that's a transition or scene + isSceneDescription + ) { + // console.log("FAIL 2") + return false + } + + if ( + locationType !== "UNKNOWN" || + timeType !== "UNKNOWN" + ) { + // console.log("FAIL 3") + return false + } + + // nah, it's juste someone shouting + if (line.includes("!")) { + return false + } + + if ( + line === "NO" || line === "NO." || + line === "YES" || line === "YES." || + line === "STOP" || line === "STOP." + ) { + return false + } + + const lineWithSpace = ` ${line} ` + if ( + lineWithSpace.includes(" INSERT ") || + lineWithSpace.includes(" POV ") || + lineWithSpace.includes(" CLOSE-UP ") + ) { + return false + } + + return true +} diff --git a/packages/broadway/src/analysis/isDialogueLine.ts b/packages/broadway/src/analysis/isDialogueLine.ts new file mode 100644 index 00000000..b942923e --- /dev/null +++ b/packages/broadway/src/analysis/isDialogueLine.ts @@ -0,0 +1,21 @@ + + +// /!\ This whole file was generated with GPT-4 + + +/** + * Check whether the given line contains a character dialogue or action bitmap. + * @param fullLine the line to check. Might contain spaces. + */ +export function isDialogueLine(fullLine: string): boolean { + + const containsTabulation = fullLine.startsWith(" ") + + // this rule is a bit strict as some text files don't have tabulation.. + // but it helps A LOT + if (!containsTabulation) { + return false + } + + return true +} diff --git a/packages/broadway/src/analysis/isPageSeparator.ts b/packages/broadway/src/analysis/isPageSeparator.ts new file mode 100644 index 00000000..6b4f67d8 --- /dev/null +++ b/packages/broadway/src/analysis/isPageSeparator.ts @@ -0,0 +1,11 @@ + + +// might be deprecated actually +/** + * Checks whether a line in the script is PDF page separators. + * @param line The line to check. + */ +export function isPageSeparator(line: string): boolean { + const pageSeparatorPattern = /^\s*-\d+-\s*$/i; + return pageSeparatorPattern.test(line); +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/isVoiceOver.ts b/packages/broadway/src/analysis/isVoiceOver.ts new file mode 100644 index 00000000..8833b39f --- /dev/null +++ b/packages/broadway/src/analysis/isVoiceOver.ts @@ -0,0 +1,15 @@ +export function isVoiceOver(input: string) { + const text = input.trim().toLowerCase() + if (text === "v.o." || + text === "v.o" || + text === "vo." || + text === "(v.o.)" || + text === "(v.o)" || + text === "(vo.)" || + text === "voice over" || + text === "(voice over)" + ) { + return true + } + return false +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts new file mode 100644 index 00000000..d5939d47 --- /dev/null +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -0,0 +1,77 @@ +import { ClapEntityGender } from "@aitube/clap" +import Cache, { FileSystemCache } from "file-system-cache" + +import { getRandomDirectory } from "@/utils" + +import { normalizeName } from "./normalizeName" + +export type AgeNameGenderStats = [ClapEntityGender, number, number] + +const CACHE_KEY = "AGE_AND_GENDER_DATASET" + +export const state: { + isReady: boolean + cache?: FileSystemCache + nameToStats: Record +} = { + isReady: false, + cache: undefined, + nameToStats: {}, +} + +// note: this takes about 140 Mb of memory +export async function loadAgeGenderNameStats() { + + if (!state.cache) { + state.cache = Cache({ + basePath: ".age_and_gender_dataset_cache", // await getRandomDirectory() + ttl: 30 * 24 * 60 // (optional) A time-to-live (in secs) on how long an item remains cached. + }); + } + + let nameToStats = {} as Record + + try { + const rawString = await state.cache.get(CACHE_KEY) + nameToStats = JSON.parse(rawString) as Record + if (Object.keys(nameToStats).length === 0) { + throw new Error(`failed to load the dataset`) + } + return nameToStats + } catch (err) { + nameToStats = {} + } + + const url = "https://huggingface.co/datasets/jbilcke-hf/detection-of-age-and-gender/resolve/main/baby-names-us-year-of-birth-full.csv?download=true" + + console.log(`downloading age and gender detection dataset from Hugging Face (jbilcke-hf/detection-of-age-and-gender)`) + + const res = await fetch(url) + const rawData = await res.text() + + rawData.split("\n").forEach(line => { + const [yearOfBirth, name, gender, numberOfBirths] = line.trim().split(",") + + const key = normalizeName(name) + + if (!key) { return } + + if (!nameToStats[key]) { + nameToStats[key] = [] + } + nameToStats[key].push([ + gender === "F" ? "female" : "male", + Number(numberOfBirths), + Number(yearOfBirth), + ]) + + nameToStats[key].sort((a, b) => b[1] - a[1]) + }) + + try { + await state.cache.set(CACHE_KEY, JSON.stringify(nameToStats)) + } catch (err) { + console.error(`failed to cache the dataset: ${err}`) + } + return nameToStats +} diff --git a/packages/broadway/src/analysis/normalizeName.ts b/packages/broadway/src/analysis/normalizeName.ts new file mode 100644 index 00000000..c555e406 --- /dev/null +++ b/packages/broadway/src/analysis/normalizeName.ts @@ -0,0 +1,6 @@ +export function normalizeName(name: string) { + const normalizedName = `${name || ""}`.trim().toLowerCase() + + return normalizedName +} + diff --git a/packages/broadway/src/analysis/parseCharacterName.ts b/packages/broadway/src/analysis/parseCharacterName.ts new file mode 100644 index 00000000..d702d450 --- /dev/null +++ b/packages/broadway/src/analysis/parseCharacterName.ts @@ -0,0 +1,26 @@ +function takeWhatsBefore(input: string, pattern: string): string { + return `${input || ""}`.split(pattern).shift() || "" +} + +export function parseCharacterName(input: string) { + + let tmp = takeWhatsBefore(input, "'S") + tmp = takeWhatsBefore(tmp, "’S") + tmp = takeWhatsBefore(tmp, "(") + tmp = takeWhatsBefore(tmp, "[") + + tmp = tmp + .replaceAll(" INTERNALS ", "") + .replaceAll(" VOICE ", "") + + tmp = tmp.trim() + + /* + // console.log("DEBUG:", { + input: ` ${input || ""} `, + tmp + }) + */ + + return tmp +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/parseDialogueLine.ts b/packages/broadway/src/analysis/parseDialogueLine.ts new file mode 100644 index 00000000..9f8047b3 --- /dev/null +++ b/packages/broadway/src/analysis/parseDialogueLine.ts @@ -0,0 +1,21 @@ +import { isAllCaps } from "@/utils/isAllCaps" + + +export function parseDialogueLine(line: string): string { + let lineWithSpaces = ` ${line || ""} ` + + if (line === " .. " || line === " ... ") { + return "" + } + + // looks like an anomaly, normally dialogue isn't all caps + if (isAllCaps(lineWithSpaces)) { + return "" + } + + // some scripts (such as Afterglow) have quotes in it + // we can remove them + lineWithSpaces = lineWithSpaces.replaceAll(`“`, '').replaceAll(`”`, '') + + return lineWithSpaces.trim() +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/parseScenes.ts b/packages/broadway/src/analysis/parseScenes.ts new file mode 100644 index 00000000..208f9466 --- /dev/null +++ b/packages/broadway/src/analysis/parseScenes.ts @@ -0,0 +1,357 @@ +import { UUID } from "@aitube/clap" + + +import { isAllCaps } from "@/utils/isAllCaps" +import { analyzeLine } from "@/analysis/analyzeLine" +import { Scene, SceneEvent, ScreenplaySequence } from "@/types" + +import { parseCharacterName } from "@/analysis/parseCharacterName" + +/** + * Check whether the given line contains a character dialogue or action bitmap. + * @param fullLine the line to check. Might contain spaces. + */ +function isDialogueLine(fullLine: string): boolean { + + const containsTabulation = fullLine.startsWith(" ") + + // this rule is a bit strict as some text files don't have tabulation.. + // but it helps A LOT + if (!containsTabulation) { + return false + } + + return true +} + +/** + * Check whether the given line contains a character dialogue or action bitmap. + * @param fullLine the line to check. Might contain spaces. + */ +function isCharacterLine(fullLine: string): boolean { + + const containsTabulation = fullLine.startsWith(" ") + + // disabled, because some character line include things like parenthesis + // if (fullLine.match(/\([^\)]+\)/)) { + // return false + // } + + // this rule is a bit strict as some text files don't have tabulation.. + // but it helps A LOT + if (!containsTabulation) { + return false + } + + // the fullLine is important and useful (to locate characters, highlight etc) + // however it might not be a reliable indicated, so we use uppercase + const line = fullLine.trim() + + const { isTransition, isSceneDescription, timeType, locationType } = analyzeLine(line) + + + const character = parseCharacterName(line) + + // doesn't look like a character name, after filtering + if (!character) { + return false + } + + // console.log("isAllCaps?", isAllCaps(line)) + if ( + line.length < 2 || // line is too short to be a character + !isAllCaps(line) // line is not all uppercase + ) { + // console.log("FAIL 1") + return false + } + + if ( + isTransition || // nope, that's a transition or scene + isSceneDescription + ) { + // console.log("FAIL 2") + return false + } + + if ( + locationType !== "UNKNOWN" || + timeType !== "UNKNOWN" + ) { + // console.log("FAIL 3") + return false + } + + // nah, it's juste someone shouting + if (line.includes("!")) { + return false + } + + if ( + line === "NO" || line === "NO." || + line === "YES" || line === "YES." || + line === "STOP" || line === "STOP." + ) { + return false + } + + const lineWithSpace = ` ${line} ` + if ( + lineWithSpace.includes(" INSERT ") || + lineWithSpace.includes(" POV ") || + lineWithSpace.includes(" CLOSE-UP ") + ) { + return false + } + + return true +} + +/** + * Parse screenplay script into scenes and events.. + * @param screenplay The entire screenplay script. + */ +export function parseScenes(screenplaySequence: ScreenplaySequence): Scene[] { + try { + const screenplay = screenplaySequence.fullText + + let initialScene: string = "" + + // the little text in parenthesis + let currentDialogueAction = "" + + let currentScene: Scene | undefined = undefined + let currentEvents: SceneEvent[] = [] + let currentEvent: SceneEvent | undefined = undefined + + let lastCharacter = "" + + let lineNumber = screenplaySequence.startAtLine + + const scenes: Scene[] = [] + + for (const lineWithSpaces of screenplay.split("\n")) { + + let line = lineWithSpaces.trim() + + // we are just going to the next page... normally + if (line.match(/^\d+\.$/)) { + lineNumber += 1 + continue + } + + // TODO detect scenes (the "descriptions") + + // IMPORTANT: USE THE FULL LINE WITH SPACES HERE! + const maybeCharacter = parseCharacterName(lineWithSpaces) + const isCharacter = isCharacterLine(lineWithSpaces) + // console.log(`isCharacterLine("${lineWithSpaces}"):`, isCharacter) + // console.log(`maybeCharacter: `, maybeCharacter) + if (isCharacter && maybeCharacter) { + // console.log(" found a character:", maybeCharacter) + lastCharacter = maybeCharacter + + if (currentScene) { + if (currentEvent) { + // no, we don't update the line here, since this is a NEW line + // currentEvent.endAtLine = lineNumber + currentEvents.push(currentEvent) + } + currentEvent = undefined + currentScene.events = currentEvents + // no, we don't update the line here, since this is a NEW line + // currentScene.endAtLine = lineNumber + scenes.push(currentScene) + currentEvents = [] + currentScene = undefined + } + + currentScene = { + id: UUID(), + scene: (currentScene as any)?.scene || "", + line, + rawLine: lineWithSpaces, + sequenceFullText: screenplaySequence.fullText, + sequenceStartAtLine: screenplaySequence.startAtLine, + sequenceEndAtLine: screenplaySequence.endAtLine, + startAtLine: lineNumber, + endAtLine: lineNumber, + events: [], + } + + // need to reset this! + currentDialogueAction = "" + + lineNumber += 1 + + continue + } + + if (!line.length) { + + // if the line is empty, we terminate the current event + // UNLESS it is obviously not terminated (ie. unless + // it isn't finishing in a !, ? or .) + if (currentEvent && ( + currentEvent.description.endsWith("!") || + currentEvent.description.endsWith("?") || + currentEvent.description.endsWith(".") + )) { + // no, we don't update the line here, since this is a NEW line + // currentEvent.endAtLine = lineNumber + currentEvents.push(currentEvent) + currentEvent = undefined + } + + lineNumber += 1 + continue + } + + // basic heuristic: the first line of a a scene is the scene description + if (!initialScene) { + + let firstLine = ` ${line.trim().toUpperCase()} ` + + // the first part of the line might be a number - we remove this + firstLine = firstLine.replaceAll(/^(\s*\d+)[^\d]/gi, " ") + + // the last part of the line might be also a number - we remove this too + firstLine = firstLine.replaceAll(/[^\d](\d+\s*)$/gi, " ") + + initialScene = firstLine.trim() + + // reset the last character + lastCharacter = "" + + lineNumber += 1 + continue + } + + + // parse the line, and determine if it's dialogue, + // commentary, action.. + const startOfAction = line.match(/^\(/) + const endOfAction = line.match(/\)$/) + const isDialogue = isDialogueLine(lineWithSpaces) // <-- yes, spaces are important here!! + + if (startOfAction) { + if (currentEvent) { + // no, we don't update the line here, since this is a NEW line + // currentEvent.endAtLine = lineNumber + currentEvents.push(currentEvent) + currentEvent = undefined + } + + const action = `${ + endOfAction + ? line.replaceAll("(", "").replaceAll(")", "") + : line.replaceAll("(", "") + }` + + currentDialogueAction = action + + currentEvent = { + id: UUID(), + type: "action", + character: lastCharacter, + description: action, + behavior: "", + startAtLine: lineNumber, + endAtLine: lineNumber, + } + } else if (endOfAction && currentEvent?.type === "action") { + + const action = currentEvent.description + ? `${currentEvent.description.trim()} ${line.replace(")", "")}` + : line.replace(")", "") + + currentEvent.description = action + currentDialogueAction = action + + currentEvent.endAtLine = lineNumber + currentEvents.push(currentEvent) + currentEvent = undefined + } else if (currentEvent) { + const typeHasChanged = isDialogue && currentEvent.type !== "dialogue" + + // we are not in a dialogue anymore, so let's clear the dialogue action buffer + if (currentEvent.type === "description") { + currentDialogueAction = "" + } + + if (typeHasChanged) { + // no, we don't update the line here, since this is a NEW line + // currentEvent.endAtLine = lineNumber + currentEvents.push(currentEvent) + currentEvent = undefined + + currentEvent = { + id: UUID(), + type: isDialogue ? "dialogue" : "action", + character: lastCharacter, + description: line, + behavior: isDialogue ? currentDialogueAction : "", + startAtLine: lineNumber, + endAtLine: lineNumber + } + } else { + // current event type has not changed, we are just extending it + currentEvent.description = + currentEvent.description + ? `${currentEvent.description.trim()} ${line}` + : `${line}` + + currentEvent.endAtLine = lineNumber + } + } else { + // we are creating a new event + currentEvent = { + id: UUID(), + type: lastCharacter && isDialogue ? "dialogue" : "description", + character: lastCharacter && isDialogue ? lastCharacter : "", + description: `${line}`, + behavior: isDialogue ? currentDialogueAction : "", + startAtLine: lineNumber, + endAtLine: lineNumber + } + } + + lineNumber += 1 + } + + + if (currentScene) { + if (currentEvent) { + // no, we don't update the line here, since this is a NEW line + // currentEvent.endAtLine = lineNumber + currentEvents.push(currentEvent) + } + currentEvent = undefined + currentScene.events = currentEvents + // no, we don't update the line here, since this is a NEW line + // currentScene.endAtLine = lineNumber + scenes.push(currentScene) + currentEvents = [] + currentScene = undefined + } + + // one last trick, which is pretty important actually: we expand the action further + for (const scene of scenes) { + const sceneEvents: SceneEvent[] = [] + for (const event of scene.events) { + event.description.split(/\. /).forEach(sentence => { + sceneEvents.push({ + ...event, + description: sentence + }) + }) + } + + scene.events = sceneEvents + } + return scenes + } catch (err) { + console.error(err) + return [] + } +} \ No newline at end of file diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts new file mode 100644 index 00000000..f6426a87 --- /dev/null +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -0,0 +1,78 @@ +import { ClapMediaOrientation, ClapProject, newClap, UUID } from "@aitube/clap" + +import { cleanUTF8Characters } from "@/utils" +import { getScreenplayFromText } from "./getScreenplayFromText" +import { analyzeScreenplay } from "@/analysis/analyzeScreenplay" +import { readLocalOrRemotePlainText } from "@/utils/readLocalOrRemotePlainText" + +export type ParseScriptProgressUpdate = ({ + value, + sleepDelay, + message +}: { + value: number + sleepDelay?: number + message?: string +}) => Promise + +const defaultParseScriptProgressUpdate: ParseScriptProgressUpdate = async () => {} + +export async function parseScriptToClap( + input: string, + onProgressUpdate: ParseScriptProgressUpdate = defaultParseScriptProgressUpdate +): Promise { + + let content = await readLocalOrRemotePlainText(input) + + // fix any mess which might be in it + content = cleanUTF8Characters(content) + + await onProgressUpdate({ value: 10 }) + + const screenplay = await getScreenplayFromText(content) + + await onProgressUpdate({ value: 20 }) + + const { segments, entitiesById, entitiesByScreenplayLabel } = await analyzeScreenplay( + screenplay, + async (progress, message) => { + // progress is a value between 0 and 100 + const ratio = progress / 100 + + // so we want to continue the progress bar in the range [20, 70] + await onProgressUpdate({ + value: 20 + (ratio * 50), + sleepDelay: 100, + message + }) + }) + + await onProgressUpdate({ value: 60 }) + + // TODO: return a ClapProject instead + const clap = newClap({ + meta: { + id: UUID(), + title: "Untitled", + description: "", + synopsis: "", + licence: "All rights reserved by the IP holder", + + orientation: ClapMediaOrientation.LANDSCAPE, + durationInMs: 0, + + width: 1024, + height: 576, + defaultVideoModel: "", + extraPositivePrompt: [], + screenplay, + isLoop: false, + isInteractive: false, + }, + scenes: [], // TODO + entities: Object.values(entitiesById), + segments, + }) + + return clap +} \ No newline at end of file diff --git a/packages/broadway/src/constants/colors.ts b/packages/broadway/src/constants/colors.ts new file mode 100644 index 00000000..9dd4dd71 --- /dev/null +++ b/packages/broadway/src/constants/colors.ts @@ -0,0 +1,54 @@ + +// important: not all colors have the same values! +// for instance the red and gray(s) have a slightly lighter border bottom, +// because they look better this way +export const segmentColorsTailwind = { + blue: `bg-blue-400 shadow-blue-600/50 border-l-blue-400/80 border-r-blue-400/80 border-t-blue-300/40 border-b-blue-500/80 text-blue-900`, + red: `bg-red-400 shadow-red-600/50 border-l-red-400/80 border-r-red-400/80 border-t-red-300/40 border-b-red-400/80 text-red-900`, + + // + + rose: `bg-rose-400 shadow-rose-600/50 border-l-rose-400/80 border-r-rose-400/80 border-t-rose-300/40 border-b-rose-500/80 text-rose-900`, + green: `bg-green-400 shadow-green-600/50 border-l-green-400/80 border-r-green-400/80 border-t-green-300/40 border-b-green-500/80 text-green-900`, + + green2: `bg-[rgb(162,222,83)] shadow-[rgb(122,162,43)]/50 border-l-[rgb(152,192,73)]/80 border-r-[rgb(152,192,73)]/80 border-t-[rgb(172,212,93)]/40 border-b-[rgb(132,172,53)]/80 text-[rgb(52,92,0)]`, + green3: `bg-[rgb(144,170,137)] shadow-[rgb(124,150,117)]/50 border-l-[rgb(164,190,157)]/80 border-r-[rgb(144,170,137)]/80 border-t-[rgb(174,200,167)]/40 border-b-[rgb(130,157,137)]/80 text-[rgb(44,70,37)]`, + + + violet: `bg-violet-400 shadow-violet-600/50 border-l-violet-400/80 border-r-violet-400/80 border-t-violet-300/40 border-b-violet-500/80 text-violet-900`, + amber: `bg-amber-400 shadow-amber-600/50 border-l-amber-400/80 border-r-amber-400/80 border-t-amber-300/40 border-b-amber-500/80 text-amber-900`, + yellow: `bg-yellow-400 shadow-yellow-600/50 border-l-yellow-400/80 border-r-yellow-400/80 border-t-yellow-300/40 border-b-yellow-500/80 text-yellow-900`, + yellow2: `bg-[rgb(250,204,110)] shadow-[rgb(230,184,90]/50 border-l-[rgb(250,204,110)]/80 border-r-[rgb(250,204,110)]/80 border-t-[rgb(255,224,130)]/40 border-b-[rgb(240,194,100)]/80 text-[rgb(91,72,3)]`, + + teal: `bg-teal-400 shadow-teal-600/50 border-l-teal-400/80 border-r-teal-400/80 border-t-teal-300/40 border-b-teal-500/80 text-teal-900`, + cyan: `bg-cyan-400 shadow-cyan-600/50 border-l-cyan-400/80 border-r-cyan-400/80 border-t-cyan-300/40 border-b-cyan-500/80 text-cyan-900`, + orange: `bg-orange-400 shadow-orange-600/50 border-l-orange-400/80 border-r-orange-400/80 border-t-orange-300/40 border-b-orange-500/80 text-orange-900`, + + orange2: `bg-[rgb(222,162,83)] shadow-[rgb(162,122,43)]/50 border-l-[rgb(192,152,73)]/80 border-r-[rgb(192,152,73)]/80 border-t-[rgb(212,172,93)]/40 border-b-[rgb(172,132,53)]/80 text-[rgb(92,52,0)]`, + + // + + sky: `bg-sky-400 shadow-sky-600/50 border-l-sky-400/80 border-r-sky-400/80 border-t-sky-300/40 border-b-sky-500/80 text-sky-900`, + stone: `bg-stone-400 shadow-stone-600/50 border-l-stone-400/80 border-r-stone-400/80 border-t-stone-300/40 border-b-stone-400/80 text-stone-700`, + // stone2: `bg-stone-500 shadow-stone-700/50 border-l-stone-500/80 border-r-stone-500/80 border-t-stone-400/40 border-b-stone-500/80 text-stone-900`, + sand: `bg-[rgb(200,176,124)] shadow-[rgb(180,156,104)]/50 border-l-[rgb(200,176,124)]/80 border-r-[rgb(200,176,124)]/80 border-t-[rgb(220,196,144)]/40 border-b-[rgb(200,176,124)]/80 text-[rgb(100,76,24)]`, + + zinc: `bg-zinc-400 shadow-zinc-600/50 border-l-zinc-400/80 border-r-zinc-400/80 border-t-zinc-300/40 border-b-zinc-400/80 text-zinc-900`, + zinc2: `bg-zinc-300 shadow-zinc-600/50 border-l-zinc-400/80 border-r-zinc-400/80 border-t-zinc-300/40 border-b-zinc-400/80 text-zinc-600`, + lime: `bg-lime-400 shadow-lime-600/50 border-l-lime-400/80 border-r-lime-400/80 border-t-lime-300/40 border-b-lime-500/80 text-lime-900`, + indigo: `bg-indigo-400 shadow-indigo-600/50 border-l-indigo-400/80 border-r-indigo-400/80 border-t-indigo-300/40 border-b-indigo-500/80 text-indigo-900`, + purple: `bg-purple-400 shadow-purple-600/50 border-l-purple-400/80 border-r-purple-400/80 border-t-purple-300/40 border-b-purple-500/80 text-purple-900`, + purple2: `bg-[rgb(175,191,203)] shadow-[rgb(145,161,173)]/50 border-l-[rgb(175,191,203)]/80 border-r-[rgb(175,191,203)]/80 border-t-[rgb(195,211,223)]/40 border-b-[rgb(145,151,173)]/80 text-[rgb(65,81,93)]`, + + pink: `bg-pink-400 shadow-pink-600/50 border-l-pink-400/80 border-r-pink-400/80 border-t-pink-300/40 border-b-pink-500/80 text-pink-900`, + pink2: `bg-[rgb(191,145,184)] shadow-[rgb(121,85,114)]/50 border-l-[rgb(181,145,174)]/80 border-r-[rgb(181,145,174)]/80 border-t-[rgb(211,175,204)]/40 border-b-[rgb(151,115,144)]/80 text-[rgb(81,45,74)]`, + pink3: `bg-[rgb(191,160,184)] shadow-[rgb(121,100,114)]/50 border-l-[rgb(181,160,174)]/80 border-r-[rgb(181,160,174)]/80 border-t-[rgb(211,190,204)]/40 border-b-[rgb(151,130,144)]/80 text-[rgb(81,60,74)]`, + + neutral: `bg-neutral-400 shadow-neutral-600/50 border-l-neutral-400/80 border-r-neutral-400/80 border-t-neutral-400/40 border-b-neutral-500/80 text-neutral-900`, + neutral2: `bg-[rgb(150,145,135)] shadow-neutral-600/50 border-l-neutral-400/80 border-r-neutral-400/80 border-t-neutral-400/40 border-b-neutral-500/80 text-neutral-700`, + + gray: `bg-gray-400 shadow-gray-600/50 border-l-gray-400/80 border-r-gray-400/80 border-t-gray-300/40 border-b-gray-400/80 text-gray-900`, + gray2: `bg-gray-400 shadow-gray-600/50 border-l-gray-400/80 border-r-gray-400/80 border-t-gray-300/40 border-b-gray-400/80 text-gray-700`, +} + +export type SegmentColor = keyof typeof segmentColorsTailwind diff --git a/packages/broadway/src/constants/general.ts b/packages/broadway/src/constants/general.ts new file mode 100644 index 00000000..2b1c14e5 --- /dev/null +++ b/packages/broadway/src/constants/general.ts @@ -0,0 +1,14 @@ +// the time resolution - this may be an option in the future +export const DEFAULT_DURATION_IN_MS_PER_STEP = 500 + +export const DEFAULT_COLUMNS_PER_STEP = 1 // this is dynamic, and corresponds to the zoom level + +// how many columns per slice / default segment lenght - this may be an option in the future +// so here, a "slice" (a typical shot) +// lasts for 2 seconds (500ms * 4) +export const DEFAULT_COLUMNS_PER_SLICE = 4 + +// TODO use this as a vertical zoom level +export const STEP_HEIGHT_COLUNM_RATIO = 1 + +export const DEFAULT_NB_TRACKS = 24 // 32 diff --git a/packages/broadway/src/constants/index.ts b/packages/broadway/src/constants/index.ts new file mode 100644 index 00000000..f431a123 --- /dev/null +++ b/packages/broadway/src/constants/index.ts @@ -0,0 +1,25 @@ +export { segmentColorsTailwind, type SegmentColor } from "./colors" +export { + DEFAULT_DURATION_IN_MS_PER_STEP, + DEFAULT_COLUMNS_PER_STEP, + DEFAULT_COLUMNS_PER_SLICE, + STEP_HEIGHT_COLUNM_RATIO, + DEFAULT_NB_TRACKS, +} from "./general" + + +export { mockCategoryPrompts_misc, mockCategoryPrompts } from "./mocks" + +export { + screenplaySequenceTypes, + type ScreenplaySequenceType, + screenplaySequenceTimes, + type ScreenplaySequenceTime +} from "./screenplaySequences" + +export { + segmentCategories, + categoryNames, + getSegment, + getSegmentColor +} from "./segments" diff --git a/packages/broadway/src/constants/mocks.ts b/packages/broadway/src/constants/mocks.ts new file mode 100644 index 00000000..35145c15 --- /dev/null +++ b/packages/broadway/src/constants/mocks.ts @@ -0,0 +1,251 @@ +import { ClapSegmentCategory } from "@aitube/clap" + +// those are very random categories, so we don't use this as an example +// as this will looks unrealistic to potential customers +export const mockCategoryPrompts_misc: Record = { + action: [ + "eating a dinner", + "looking at cellphones", + "enjoying the view", + "happy", + "peaceful", + "tense", + "mysterious", + ], + character: [ + "James", + "Anna", + "Alice", + "Bob" + ], + location: [ + "train station in NYC", + "inside a building", + "below the Eiffel Tower", + "in a fancy restaurant" + ], + transition: [ + "CUT TO" + ], + camera: [ + "long wide establishing shot", + "full shot", + "medium-long shot", + "medium shot", + "medium close-up", + "close-up", + "extreme close-up", + "extreme long shot", + "American shot", + "Italian shot", + "trolley shot" + ], + lighting: [ + "strong light", + "soft light", + "candlelit", + ], + time: [ + "in the morning, golden hour", + "at noon", + "during the day, sunlit", + "in the evening, golden hour", + "at night, moonlit" + ], + era: [ + "in the 60s", + "in the 70s", + "in the 80s", + "modern era" + ], + weather: [ + "cloudy, soft mist", + "cloudy, in the fog", + "sunny", + "light cloud cover", + "light rain", + "heavy rain", + "cloudy", + "clouds with strong wind", + // "storm" + ], + sound: [ + "street noise", + "wind sound", + "cafe noise", + "chatty airport", + "dog barking", + "baby cooing", + "cat meowing", + "wind noise", + "cafe ambiance", + "steps sounds", + "bag opening" + ], + music: [ + "soft electronic ambient", + "energic electronic beat", + "instrumental orchestra", + "epic orchestral with strings", + "soft pop-rock tune", + "instrumental hip-hop", + "atmospheric trip-hop", + "lofi instrumental hiphop" + ], + + dialogue: [ + "saying hello", + "asking for directions", + "disagreeing", + "threatening" + ], + + style: [ + "Mickael Bay", + "Wes Anderson", + "Studio Ghibli", + "Moebius", + "anime", + "3D render", + "documentary", + "movie grain" + ], + + /* + colors: [ + "photorealist", + "movie grain", + "" + ], + */ + + splat: [], + mesh: [], + depth: [], + event: [], + interface: [], + phenomenon: [], + video: [], + storyboard: [], + + generic: [ + "Custom" + ] +} + + +export const mockCategoryPrompts: Record = { + action: [ + "peaceful", + "tense", + "mysterious", + "peaceful", + "tense", + "mysterious", + "peaceful", + "tense", + "mysterious", + ], + character: [ + "Henry", + "Margaret", + "Eleanor", + "Elizabeth", + "William", + "Thomas", + "Rackham", + "Joseph", + "Gideon", + "Isaac" + ], + location: [ + "on the beach in the caribbean", + "on the deck of a pirate ship", + "in the captain's quarters of a pirate ship", + "in a tropical forest", + ], + camera: [ + "long wide establishing shot", + "full shot", + "medium-long shot", + "medium shot", + "medium close-up", + "close-up", + "extreme close-up", + "extreme long shot", + "American shot", + "Italian shot", + "trolley shot" + ], + lighting: [ + "strong light", + "soft light", + "candlelit", + ], + time: [ + "in the morning, golden hour", + "at noon", + "during the day, sunlit", + "in the evening, golden hour", + "at night, moonlit" + ], + era: [ + "in 1700", + "during piracy times" + ], + weather: [ + "cloudy, soft mist", + "cloudy, in the fog", + "sunny", + "light cloud cover", + "light rain", + "heavy rain", + "cloudy", + "clouds with strong wind", + // "storm" + ], + sound: [ + "animal noise", + "wind sound", + "tropical sounds", + "sea noises", + ], + music: [ + "instrumental orchestra for sailing a ship, 1700", + "epic orchestral with strings, 1800", + "suspensful instrumental orchestra, 1700", + ], + transition: [ + "cut to" + ], + dialogue: [ + "saying hello", + "asking for directions", + "disagreeing", + "threatening" + ], + + style: [ + "movie screencap, film grain" + ], + + /* + colors: [ + "photorealist", + "movie grain", + "" + ], + */ + splat: [], + mesh: [], + depth: [], + event: [], + interface: [], + phenomenon: [], + video: [], + storyboard: [], + + generic: [ + "Lorem ipsum" + ] +} diff --git a/packages/broadway/src/constants/screenplaySequences.ts b/packages/broadway/src/constants/screenplaySequences.ts new file mode 100644 index 00000000..38dbba1c --- /dev/null +++ b/packages/broadway/src/constants/screenplaySequences.ts @@ -0,0 +1,53 @@ + +export const screenplaySequenceTypes = { + "INTERIOR": "Indoor", + "EXTERIOR": "Outdoor", + "INT./EXT.": "Indoor/Outdoor", + "UNKNOWN": "Unknown place", +} + +export type ScreenplaySequenceType = keyof typeof screenplaySequenceTypes + +// IMPORTANT: PUT SHORTER PATTERN AT THE END!! +export const screenplaySequenceTimes = { + "CONTINUOUS": "", // we found this in some screenplay but.. what does it mean? + "THAT MOMENT": "", // same here + "THE SAME DAY": "Day", + "THE NEXT DAY": "Day", + "THE NEXT AFTERNOON": "Afternoon", + "NEXT AFTERNOON": "Afternoon", + "LATER AFTERNOON": "Afternoon", + "SAME DAY": "Day", + "NEXT DAY": "Day", + "SAME TIME": "Day", + "DAY FOR NIGHT": "Day for night", + "PRE-DAWN": "At pre-dawn", + "AT DAWN": "At dawn", + "EARLY MORNING": "Early morning", + "LATE MORNING": "Late morning", + "EARLY EVENING": "Early evening", + "LATE EVENING": "Late evening", + "LATE NIGHT": "Night", + "IN THE EVENING": "In the evening", + "A FEW MOMENTS LATER": "Moments later", + "FEW MOMENTS LATER": "Moments later", + "MOMENTS LATER": "Moments later", + "MOMENT LATER": "Moment later", + "EVENING": "During the evening", + "MIDNIGHT": "At midnight", + "MORNING": "Morning", + "AFTERNOON": "In the afternoon", + "LATER": "Later", + "NOON": "At noon", + "DAWN": "Dawn", + "SUNRISE": "Sunrise", + "SUNSHINE": "Sunshine", + "DUSK": "Dusk", + "TWILIGHT": "Twilight", + "DAY": "During day", + "LATE": "Late", + "NIGHT": "At night", + "UNKNOWN": "Day", +} + +export type ScreenplaySequenceTime = keyof typeof screenplaySequenceTimes \ No newline at end of file diff --git a/packages/broadway/src/constants/segments.ts b/packages/broadway/src/constants/segments.ts new file mode 100644 index 00000000..0bf4a2b4 --- /dev/null +++ b/packages/broadway/src/constants/segments.ts @@ -0,0 +1,211 @@ +import { ClapSegmentCategory } from "@aitube/clap" + +import { SegmentColor } from "@/constants/colors" +import { ClapSegmentCategorySettings } from "@/types" + +// this is a special segment used for rendering the scene +const splat: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.SPLAT, + title: "Splat", + description: "Gaussian splatting", + color: "pink", +} + +const mesh: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.MESH, + title: "Mesh", + description: "Render a mesh", + color: "green2" +} + +const depth: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.DEPTH, + title: "Depth map", + description: "Dpeth map", + color: "yellow", +} + +// this is a special segment used for rendering the scene +const video: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.VIDEO, + title: "video", + description: "Render a video", + color: "indigo", +} + +// this is a special segment type used to render preview thumbnails +const storyboard: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.STORYBOARD, + title: "storyboard", + description: "Storyboard preview (image or video)", + color: "indigo", +} + +const action: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.ACTION, + title: "Action", + description: "Action", + color: "orange2", +} + +const character: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.CHARACTER, + title: "Character", + description: "Characters, animals..", + color: "purple", +} + +const location: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.LOCATION, + title: "Location", + description: "Location (country, place, background, furnitures..)", + color: "sand", +} + +const camera: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.CAMERA, + title: "camera", + description: "Camera (position, angle, direction)", + color: "zinc2", +} + +const transition: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.TRANSITION, + title: "transition", + description: "Transition", + color: "teal", +} + +const lighting: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.LIGHTING, + title: "Lighting", + description: "Lighting (natural or artifical)", + color: "neutral2", +} + +const time: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.TIME, + title: "Time", + description: "Time of the day (noon, night..)", + color: "neutral2", +} + +// @deprecated - use `time` and ClapSegmentCategory.TIME instead +const era: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.ERA, + title: "Era", + description: "Era (80s, Ancient Rome..)", + color: "gray", +} + +const weather: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.WEATHER, + title: "Weather", + description: "Weather (sunny, raining, snow..)", + color: "stone", +} + +const sound: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.SOUND, + title: "Sound", + description: "Sound (foreground, background..)", + color: "yellow2", +} + +const music: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.MUSIC, + title: "Music", + description: "Music (foreground, background..)", + color: "green3", +} + +const dialogue: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.DIALOGUE, + title: "Dialogue", + description: "Music (foreground, background..)", + color: "purple2", +} + +const style: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.STYLE, + title: "Style", + description: "Style", + color: "pink3", +} + +/* +const colors: ClapSegmentCategorySettings = { + id: "colors", + title: "Color grading", + description: "Color grading", + color: "pink", +} +*/ + +const generic: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.GENERIC, + title: "Generic", + description: "Generic", + color: "cyan", +} + +// (invisible) an event localized in time +const event: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.EVENT, + title: "Event", + description: "Event", + color: "cyan", +} + +// (visible) an Interface (UI) element +const interface_: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.INTERFACE, + title: "Interface", + description: "Interface", + color: "cyan", +} + +// (invisible) a prompt which defines new event(s) to fire based on event(s) +const phenomenon: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.PHENOMENON, + title: "Phenomenon", + description: "Phenomenon", + color: "cyan", +} + +export const segmentCategories = { + splat, + mesh, + depth, + event, // (invisible) an event localized in time + interface: interface_, // (visible) + phenomenon, // (invisible) a prompt which defines new event(s) to fire based on event(s) + video, + storyboard, + character, + location, + time, + era, + lighting, + weather, + action, + music, + sound, + dialogue, + style, + camera, + transition, + generic, +} + +export const categoryNames = Object.keys(segmentCategories) + +export function getSegment(category?: ClapSegmentCategory): ClapSegmentCategorySettings { + return segmentCategories[category || "generic"] || segmentCategories.generic +} + +export function getSegmentColor(input?: ClapSegmentCategorySettings | ClapSegmentCategory): SegmentColor { + const { color } = !input || typeof input === "string" ? getSegment(input) : input + + return color as SegmentColor +} diff --git a/packages/broadway/src/declarations.d.ts b/packages/broadway/src/declarations.d.ts new file mode 100644 index 00000000..57cf9081 --- /dev/null +++ b/packages/broadway/src/declarations.d.ts @@ -0,0 +1,2 @@ +declare module '@datagica/parse-entities'; +declare module '@datagica/parse-names'; \ No newline at end of file diff --git a/packages/broadway/src/factories/createSegment.ts b/packages/broadway/src/factories/createSegment.ts new file mode 100644 index 00000000..18c6cc92 --- /dev/null +++ b/packages/broadway/src/factories/createSegment.ts @@ -0,0 +1,130 @@ +import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants/general" +import { getSegment, segmentCategories } from "@/constants/segments" +import { ClapSegmentCategorySettings, RenderedScene } from "@/types" +import { pick } from "@/utils" +import { generateSeed, parseOutputType, ClapOutputType, ClapSegmentCategory, ClapSegment, UUID, newSegment } from "@aitube/clap" + +export function createSegment({ + startTimeInSteps, + prompt = [], + label = "", + durationInSteps = 4, + trackId = 0, + outputType = ClapOutputType.TEXT, + categoryName = ClapSegmentCategory.GENERIC, + entityId = "", + seed, + renderedScene, +}: { + startTimeInSteps: number + prompt?: string[] + label?: string + durationInSteps?: number + trackId?: number + outputType?: ClapOutputType + categoryName?: ClapSegmentCategory + entityId?: string + seed?: number + renderedScene?: RenderedScene +}): ClapSegment { + + if (!renderedScene) { + renderedScene = { + renderId: "", + status: "to_generate", + assetUrl: "", + durationInMs: 0, + alt: "", + error: "", + maskUrl: "", + segments: [], + } + } + // steps: 1|2|3|4 + // duration: 4 + // so if we begin at 1, the end step is 4 + // we need to remove 1, otherwise the end time will be too far + const endTimeInSteps = startTimeInSteps + (durationInSteps - 1) + + // but for milliseconds, it is different! we want th exactly match the ms time + const durationInMs = durationInSteps * DEFAULT_DURATION_IN_MS_PER_STEP + + // this means here we will have a problem as if we are "step 1", we wil lhave 1 * 500ms (for instance) + // which is not good: we want 0ms as a starting point instead + // so the solution is to subtract 1 step + const startTimeInMs = (startTimeInSteps - 1) * DEFAULT_DURATION_IN_MS_PER_STEP + + // see here how we DON'T remove 1 step: that's because we want the end time (in ms) + // to exactly match the beginning of the next section + const endTimeInMs = startTimeInMs + durationInMs + + const track = trackId // randomInteger(trackId, nbTracks) + + const segmentCategoriesExceptVisuals = + Object.values(segmentCategories) + .filter(item => + ![ + ClapSegmentCategory.SPLAT, + ClapSegmentCategory.MESH, + ClapSegmentCategory.DEPTH, + ClapSegmentCategory.VIDEO, + ClapSegmentCategory.STORYBOARD + ].includes(item.id) + ) as ClapSegmentCategorySettings[] + + // either a custom or a random category (except preview and render) + const category = categoryName + ? getSegment(categoryName) + : pick(segmentCategoriesExceptVisuals) + + const promptString = Array.isArray(prompt) ? prompt.filter(x => typeof x === "string" && x.length > 0).join(", ") + : "" + + const randomSegment: ClapSegment = newSegment({ + id: UUID(), + + startTimeInMs, + endTimeInMs, + // durationInMs, + + // startTimeInSteps, + // endTimeInSteps, + // durationInSteps, + + prompt: promptString, + track, // track row index + label: label || promptString, // a short label to name the segment (optional, can be human or LLM-defined) + category: category.id, + + entityId, + + // isHovering: false, + // isDragging: false, + // isEditing: false, + + seed: (!seed || isNaN(seed) || !isFinite(seed)) ? generateSeed() : seed, // seed unique to this segment - however for each video/image we will use the first "storyboard" seed + + // by default we are "auto", which means we created it using basic if/else rules + // but no language model or anything like that + createdBy: "auto", + editedBy: "auto", + + // storyboardUrl: mockStoryboardsDrawing.at(i) || mockStoryboardsDrawing[0], + // referenceUrl: mockStoryboardsLifelike.at(i) || mockStoryboardsLifelike[0], + // generationStartedAt: 0, + + outputType: parseOutputType(outputType), + + // renderId: "", + // status: "to_generate", + // assetUrl: "", + // assetDurationInMs: 0, + + // default is 1, 0 is mute, 2 is double the volume + // gain can be set to a minimum of about -3.4028235E38 and a max of about 3.4028235E38 + // outputGain: 1, + + }) + + return randomSegment +} \ No newline at end of file diff --git a/packages/broadway/src/factories/generateClap.ts b/packages/broadway/src/factories/generateClap.ts new file mode 100644 index 00000000..6d3150aa --- /dev/null +++ b/packages/broadway/src/factories/generateClap.ts @@ -0,0 +1,147 @@ +import YAML from "yaml" + +import { ClapHeader, ClapMeta, ClapEntity, ClapScene, ClapSegment, ClapMediaOrientation, getValidNumber, UUID } from "@aitube/clap" +import { MovieScript, Screenplay } from "@/types" + +/** + * export a Clap blob + * + * Optionally the blob can be downloaded, if we are in a browser environment + * + * however, note that for some reason YAML stringify is a blocking call like for JSON, + * they is no async version although we are now in the 20s not 90s + * + * in the future we might want to use an alternative implementation of YAML + */ +export async function generateClap({ + script, + screenplay, + projectInfo = "", + segments = [], + entities = [], + embedded = false, +}: { + script: MovieScript + screenplay: Screenplay + projectInfo: string + segments: ClapSegment[] + entities: ClapEntity[] + + // if embedded is true, the file will be larger, as all the content, + // image, video, audio.. + // will be embedded into it (except the last big video) + embedded?: boolean +}): Promise { + + const clapScenes: ClapScene[] = screenplay.sequences.flatMap(sequence => sequence.scenes) + + const clapEntities: ClapEntity[] = entities.map(({ + id, + category, + triggerName, + label, + description, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + }) => ({ + id, + category, + triggerName, + label, + description, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + })) + + const useCompactMode = !embedded + + // const win = (window as any) + // win.debugJulian = segments + + let highestEndTimeInMs = 0 + + const clapSegments: ClapSegment[] = segments.map(segmentData => { + + if (segmentData.endTimeInMs > highestEndTimeInMs) { + highestEndTimeInMs = segmentData.endTimeInMs + } + + return segmentData + }) + + const clapHeader: ClapHeader = { + format: "clap-0", + numberOfEntities: clapEntities.length, + numberOfScenes: clapScenes.length, + numberOfSegments: clapSegments.length, + } + + const clapMeta: ClapMeta = { + id: UUID(), + title: script.meta.title, + description: "", + synopsis: "", + licence: "", + orientation: ClapMediaOrientation.LANDSCAPE, + durationInMs: highestEndTimeInMs, + isLoop: false, + isInteractive: false, + // TODO read this from the project config + width: getValidNumber(1024, 256, 8192, 1024), + height: getValidNumber(576, 256, 8192, 576), + defaultVideoModel: "SVD", + extraPositivePrompt: [], + screenplay: screenplay.fullText, + } + + const entries = [ + clapHeader, + clapMeta, + ...clapEntities, + ...clapScenes, + ...clapSegments + ] + + const strigifiedResult = YAML.stringify(entries) + + // Convert the string to a Blob + const blobResult = new Blob([strigifiedResult], { type: "application/x-yaml" }) + + // Create a stream for the blob + const readableStream = blobResult.stream(); + + // Compress the stream using gzip + const compressionStream = new CompressionStream('gzip'); + const compressedStream = readableStream.pipeThrough(compressionStream); + + // Create a new blob from the compressed stream + const compressedBlob = await new Response(compressedStream).blob(); + + return compressedBlob +} \ No newline at end of file diff --git a/packages/broadway/src/factories/index.ts b/packages/broadway/src/factories/index.ts new file mode 100644 index 00000000..f640b51e --- /dev/null +++ b/packages/broadway/src/factories/index.ts @@ -0,0 +1,2 @@ +export { createSegment } from "./createSegment" +export { generateClap } from "./generateClap" \ No newline at end of file diff --git a/packages/broadway/src/index.ts b/packages/broadway/src/index.ts new file mode 100644 index 00000000..0e969c9e --- /dev/null +++ b/packages/broadway/src/index.ts @@ -0,0 +1,83 @@ +export { + analyzeLine, + analyzeName, + analyzeScreenplay, + getEntityAnalysisPrompt, + guessAgeAndGender, + isCharacterLine, + isDialogueLine, + isPageSeparator, + isVoiceOver, + parseCharacterName, + parseDialogueLine, + parseScenes, + type ParseScriptProgressUpdate, + parseScriptToClap, +} from "./analysis" + +export { + segmentColorsTailwind, type SegmentColor, + + DEFAULT_DURATION_IN_MS_PER_STEP, + DEFAULT_COLUMNS_PER_STEP, + DEFAULT_COLUMNS_PER_SLICE, + STEP_HEIGHT_COLUNM_RATIO, + DEFAULT_NB_TRACKS, + + mockCategoryPrompts_misc, mockCategoryPrompts , + + screenplaySequenceTypes, + type ScreenplaySequenceType, + screenplaySequenceTimes, + type ScreenplaySequenceTime, + segmentCategories, + categoryNames, + getSegment, + getSegmentColor +} from "./constants" + +export { createSegment, generateClap } from "./factories" + +export { + parseEntity, + getEra, getMostProbableEras, parseEras, + getGenre, getMostProbableGenres, parseGenres, + getLight, parseLights, + getLocation, parseIndoorLocations, parseOutdoorLocations, parseLocations, parseLocationType, + type ExtractedCharacterName, parseNames, + getShot, parseShots, + getSound, parseSounds, + parseTransition, transitions, + createOccurrenceCounter, createParser, createSimpleParser, getParserItemFromLabel, + getWeather, parseWeather +} from "./parsers" + +export { + type ClapSegmentCategorySettings, + type MovieScriptMeta, + type MovieScript, + type SceneEvent, + type Scene, + type MergedLine, + type ScreenplaySequence, + type Screenplay, + type RenderedSceneStatus, + type ImageSegment, + type RenderedScene, + type AssetType, + type AssetCategory, + type TemporaryAssetData, +} from "./types" + +export { + cleanUTF8Characters, + deduplicate, + getEntities, + getRandomDirectory, + isAllCaps, + onlyContainsStrangeNumber, + pick, + readLocalOrRemotePlainText, + readPlainText, + sleep +} from "./utils" diff --git a/packages/broadway/src/parsers/age/index.ts b/packages/broadway/src/parsers/age/index.ts new file mode 100644 index 00000000..4df3a936 --- /dev/null +++ b/packages/broadway/src/parsers/age/index.ts @@ -0,0 +1,3 @@ +export function parseAge() { + +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/costumes/database.ts b/packages/broadway/src/parsers/costumes/database.ts new file mode 100644 index 00000000..c7145f3c --- /dev/null +++ b/packages/broadway/src/parsers/costumes/database.ts @@ -0,0 +1,26 @@ +import { NamedEntity } from "@/types" + +export const data: NamedEntity[] = [ + { + "label": "futuristic", + "aliases": { + "en": [ + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + } +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/entity/index.ts b/packages/broadway/src/parsers/entity/index.ts new file mode 100644 index 00000000..adfe23da --- /dev/null +++ b/packages/broadway/src/parsers/entity/index.ts @@ -0,0 +1,45 @@ + + +// some examples of things to parse: +/* +Basically we want to identify an entity (character or location) +and associated characteristics. + + A big, old, three-story brick house in a small Chicago + suburb. + + adjectives, + + Three days before Christmas. There are lights and Christmas + decorations on the house and the surrounding houses. + + HEATHER McCALLISTER comes down +the stairs. She's nineteen and a cousin. She's wearing a +Northwestern University sweatshirt. + + CLOSE ON ARTHUR (30's), tears in his eyes from laughing so + hard. He's trying to get it under control. His greasy, + black hair hanging down over his forehead. He's wearing an + old, faded green cardigan sweater, a threadbare gray scarf, + thin from years of use, hangs loosely around his neck. + + He's sitting across from an overworked SOCIAL WORKER + (50's), African American. + */ + +import { ClapEntity } from "@aitube/clap" + +export function parseEntity(text: string, entities: ClapEntity[] = []) { + // we assume we are given a short text containing information about + + for (const entity of entities) { + const coordinates = text.indexOf(entity.triggerName) + + } + + const clothes = text.match(/(?:wears|wearing) ([a-zA-Z0-9\-\s]+)\./i) + + return { + clothes: clothes?.[1] || "" + } +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/eras/database.ts b/packages/broadway/src/parsers/eras/database.ts new file mode 100644 index 00000000..b149af3d --- /dev/null +++ b/packages/broadway/src/parsers/eras/database.ts @@ -0,0 +1,758 @@ +import { NamedEntity } from "@/types" + +export const data: NamedEntity[] = [ + { + "label": "futuristic", + "aliases": { + "en": [ + "city of the future", + "synthetic food", + "artifical life", + "computer", + "computers", + "replicator", + "replicators", + "self-replicator", + "self-replicators", + "replicant", + "replication", + "dna strand", + "dna strands", + "oxygen tank", + "memory wipe", + "grid with vectors", + "hum of the machine", + "dna programming", + "simulation", + "virtual", + "offworld", + "off world", + "recombination", + "alkylating", + "mutagen", + "robot", + "robotic", + "robotics", + "robot dog", + "robot police", + "high-voltage tethers", + "through space", + "galaxy", + "galactic", + "gravitational", + "gravitational wave", + "gravitational waves", + "graphene", + "tycho", + "tycho base", + "lunar hangar", + "lunar rover", + "space shuttle", + "enogenic", + "repressor protein", + "I'm a clone", + "you're a clone", + "he is a clone", + "she is a clone", + "vortex", + "biomechanics", + "spaceship", + "space ship", + "star ship", + "starship", + "mothership", + "spacesuit", + "spacesuits", + "lunar roving", + "roving vehicle", + "mapping computer", + "space helmet", + "space helmets", + "astronaut", + "astronauts", + "inter-stellar", + "hyper-drive", + "range of the planet", + "landing on the planet", + "orbital insertion", + "probe retract system", + "landing probe", + "planet's surface", + "hostile planet", + "depressurization", + "pepressurization", + "space vacuum", + "laser pistol", + "laser pistols", + "servomoteur", + "android", + "cyberspace", + "air lock", + "airlock", + "solar system", + "solar systems", + "teleportation", + "reactor", + "nuclear reactor", + "reactors", + "asteroids", + "asteroid belt", + "light year", + "light years", + "diagnostic coffin", + "laser beam", + "last door", + "blast doors", + "alien creature", + "alien device", + "cryosleep", + "hypersleep", + "science fiction", + "science-fiction", + "sometime in the future", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["futuristic"], + lighting: ["dimly lit"], + weather: [], + action: [], + music: ["electronic"], + sound: [], + dialogue: [], + style: ["futuristic"], + camera: [], + } + }, + { + "label": "antiquity", + "aliases": { + "en": [ + "antiquity", + "oracle", + "atlar", + "nobilis", + "tunic", + "toga", + "calceus", + "calcei", + "proletarii", + "patrician", + "patricians", + "domus", + "sparta", + "spartan", + "spartans", + "spartan warrior", + "plebeian", + "plebeians", + "plebs", + "plebis", + // "roman", + // "romans", + "roman emperor", + "julius caesar", + "greek warrior", + "greek warriors", + "Peloponnesus", + "punic war", + "anatolian", + "athenian", + "athenians", + "ephor", + "ephors", + "phocian", + "phocians", + "greek hoplite", + "greek hoplites", + "hoplite", + "hoplites", + "spartan hoplite", + "spartan hoplites", + "spartanhoplite", + "spartanhoplites", + "trireme", + "triremes", + "euclid", + "archimedes", + "theron", + "stelios", + "astinos", + "lakonia", + "daxos", + "ephialtes", + "phalanx", + "bronze helmet", + "bronze helmets", + "bronze sword", + "bronze swords", + "bronze shield", + "bronze shields", + "bronze arrow", + "bronze arrows", + "Pleistarchos", + "kythera", + "Antikythera", + "Agiad", + "Agiads", + "Eurypontid", + "Eurypontids", + "Eurysthenes", + "Procles", + "Heracles", + "Trojan War", + "Rex Sacrorum", + "Galum", + "Gallum", + "Triumvir", + "Triumvirs", + "Xerxes", + "Persia", + "Persian", + "Leonidas", + "Menelaus", + "Cleomenes", + "Pausanias", + "Chilon", + "of sparta", + "Lysander", + "Agnes", + "Agesilaus", + "Echestratus", + "Agis", + "Leotychidas", + "Alcaeus", + "Alexandros", + "Anaxander", + "Teleclus", + "Eunomus", + "Archelaus", + "Myles", + "Gorgo", + "vesuvio", + "caius", + "dilios", + "aurelius", + "Aristotle", + "Lucretia", + "Alexander", + "Aurelia", + "Titus", + "Augustus", + "Clodius", + // "Marcus", + "Julius", + "Romulus", + "Claudius", + "Lucius", + "Cassandra", + "Valeria", + "Maximus", + "Nero", + "Aeschylus", + "Cicero", + "Agatha", + "Aesop", + "Aelius", + "Aetius", + "Lazarus", + "Tiberius", + "Neptune", + "Demetrius", + "Zeus", + "Lelex", + "Myles", + "Eurotas", + "Hercules", + "Atreids", + "Dorians", + "Perseus", + "Pater familias", + "cives", + "peregrina", + "peregrinus", + "orator" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["antiquity", "roman, greek and spartan empire"], + lighting: [], + weather: [], + action: [], + music: ["old harp music"], + sound: [], + dialogue: [], + style: ["antiquity", "roman, greek and spartan empire"], + camera: [], + } + }, + { + "label": "1800-1900 western", + "aliases": { + "en": [ + "Western", + "cowboy", + "cowboys", + "saddles", + "saddle", + "frontiersman", + "frontiersmen", + "outlaws", + "town mashal", + "constable", + "posse", + "california gold rush", + "californios", + "Far West", + "American frontier", + "Old West", + "Wild West", + "Thomas Jefferson", + "Louisiana Purchase", + "western territories", + "Arizona settlers", + "the great plains", + "oregon trail", + "mormon trail", + "bozeman trail", + "california trail", + "oklahoma land rush", + "desert land act", + "buffalo hunter", + "bison hunter", + "bison hunt", + "buffalo hunt", + "suffragists", + "buffalo soldier", + "american bison", + "cowtown", + "cowtowns", + "jeffersonian", + "homesteading", + "yeoman farmer", + "homesteader", + "homesteaders", + "stagecoach", + "wagonmaster", + "wagon trail", + "mormon war", + "utah war", + "pony express", + "Abraham Lincoln", + "sioux warrior", + "sioux warriors", + "1860", + "1861", + "1862", + "1863", + "1865", + "1865", + "1866", + "1867", + "1868", + "1869", + "1870", + "1871", + "1872", + "1873", + "1874", + "1875", + "1876", + "1877", + "1878", + "1879", + "1880", + "1881", + "1882", + "1883", + "1884", + "1885", + "1886", + "1887", + "1888", + "1889", + "1890", + "1891", + "1892", + "1893", + "1894", + "1895", + "1896", + "1897", + "1898", + "1899", + "1900", + "1901", + "1902", + "1903", + "1904", + "1905", + "1906", + "1907", + "1908", + "1909" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1800s", "1880", "farewest"], + lighting: [], + weather: [], + action: [], + music: ["western music"], + sound: [], + dialogue: [], + style: ["american", "western", "dusty"], + camera: ["color footage"], + } + }, + { + "label": "1914-1918", + "aliases": { + "en": [ + "first world war", + "world war 1", + "world war", + "the great war", + "1914", + "1915", + "1916", + "1917", + "1918", + "WW1" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1914", "1915", "1916", "1917", "1918"], + lighting: [], + weather: [], + action: [], + music: ["1910 jazz"], + sound: [], + dialogue: [], + style: ["color footage", "in color"], + camera: [], + } + }, + { + "label": "1938-1945", + "aliases": { + "en": [ + "world war 2", + "world war II", + "second world war", + "1939", + "1940", + "1941", + "1942", + "1943", + "1944", + "1945", + "WW2", + "WWII", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1939", "1940", "1944", "1945"], + lighting: [], + weather: [], + action: [], + music: ["1940 jazz, 40s"], + sound: [], + dialogue: [], + style: ["40s"], + camera: ["color footage", "in color"], + } + }, + { + "label": "The 60s", + "aliases": { + "en": [ + "the sixties", + "60s", + "1960", + "1961", + "1962", + "1963", + "1964", + "1965", + "1966", + "1967", + "1968", + "1969", + "JFK", + "jfk era" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1960", "1962", "1964", "1965", "1967", "1968", "1969"], + lighting: [], + weather: [], + action: [], + music: ["60s"], + sound: [], + dialogue: [], + style: ["60s", "sixties"], + camera: ["color footage", "in color"], + } + }, + { + "label": "The 70s", + "aliases": { + "en": [ + "the seventies", + "70s", + "1970", + "1971", + "1972", + "1973", + "1974", + "1975", + "1976", + "1977", + "1978", + "1979", + "nixon era" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1970", "1972", "1974", "1975", "1977"], + lighting: [], + weather: [], + action: [], + music: ["70s"], + sound: [], + dialogue: [], + style: ["70s", "seventies"], + camera: ["color footage", "in color"], + } + }, + { + "label": "The 80s", + "aliases": { + "en": [ + "the eighties", + "80s", + "1980", + "1981", + "1982", + "1983", + "1984", + "1985", + "1986", + "1987", + "1988", + "1989" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1980", "1982", "1984", "1986"], + lighting: [], + weather: [], + action: [], + music: ["80s"], + sound: [], + dialogue: [], + style: ["80s", "eighties"], + camera: [], + } + }, + { + "label": "The 90s", + "aliases": { + "en": [ + "the nineties", + "90s", + "1990", + "1991", + "1992", + "1993", + "1994", + "1995", + "1996", + "1997", + "1998", + "1999", + "clinton era" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["1990", "1992", "1994", "1995", "1996", "1998"], + lighting: [], + weather: [], + action: [], + music: ["90s"], + sound: [], + dialogue: [], + style: ["90s", "nineties"], + camera: [], + } + }, + { + "label": "The 2000s", + "aliases": { + "en": [ + "2000s", + "2000", + "2001", + "2002", + "2003", + "2004", + "2005", + "2006", + "2007", + "2008", + "2009", + "George Walker Bush", + "George Bush", + "43rd POTUS", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["2000", "2001", "2002", "2007", "2008"], + lighting: [], + weather: [], + action: [], + music: ["2000s"], + sound: [], + dialogue: [], + style: ["the 2000s"], + camera: [], + } + }, + { + "label": "contemporary", + "aliases": { + "en": [ + "present day", + "cash register", + "streetlight", + "streetlights", + "security camera", + "gasoline", + "gas station", + "security footage", + "plastic bottle", + "telephone pole", + "security console", + "stethoscope", + "chevy", + "christmas lights", + "headphone", + "headphones", + "hearing aid", + "driveway", + "car", + "cars", + "truck", + "trucks", + "bike", + "motorbike", + "phone", + "phone company", + "telephone", + "electric", + "electricity", + "electric lines", + "tv", + "television", + "radio", + "toaster", + "microwave", + "coffee machine", + "train", + "train station", + // "camera", <- no, this is used by the script itself! + "photo", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["contemporary"], + lighting: [], + weather: [], + action: [], + music: ["contemporary music"], + sound: [], + dialogue: [], + style: ["contemporary"], + camera: [], + } + }, + { + "label": "2000s, 2010s, 2015, 2020, 2022", + "aliases": { + "en": [ + "internet", + "email", + "e-mail", + "website", + "social network", + "GPS", + "iphone", + "ipad", + "android phone", + "smartphone", + "laptop", + "cellphone", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["contemporary", "modern", "2018", "2022"], + lighting: [], + weather: [], + action: [], + music: ["modern music"], + sound: [], + dialogue: [], + style: ["contemporary", "modern", "2018", "2022"], + camera: [], + } + }, +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/eras/index.ts b/packages/broadway/src/parsers/eras/index.ts new file mode 100644 index 00000000..e7f5f82c --- /dev/null +++ b/packages/broadway/src/parsers/eras/index.ts @@ -0,0 +1,10 @@ +import { NamedEntity } from "@/types" +import { createOccurrenceCounter, createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { data } from "./database" + +export const parseEras = createSimpleParser(data, ["aliases"]) + +export const getMostProbableEras = createOccurrenceCounter(parseEras) + +export const getEra = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/parsers/genres/database.ts b/packages/broadway/src/parsers/genres/database.ts new file mode 100644 index 00000000..aaef411b --- /dev/null +++ b/packages/broadway/src/parsers/genres/database.ts @@ -0,0 +1,639 @@ +import { NamedEntity } from "@/types" + +export const data: NamedEntity[] = [ + { + "label": "classic", + "aliases": { + "en": [ + // yeah those prompt suck a bit + "meeting", + "love", + "romance", + "phone call", + "discovers", + "surprise", + "money", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: ["suspenseful", "movie soundtrack"], + sound: [], + dialogue: [], + style: ["dimly lit", "suspenseful"], + camera: [], + } + }, + { + "label": "police", + "aliases": { + "en": [ + "spy", + "spies", + "spying", + "CIA", + "MI6", + "hidden camera", + "hidden microphone", + "secret tapes", + "secret agent", + "secret agents", + "exchange prisonners", + "prisonner exchange", + "cold war", + "spy agency", + "spy agencies", + "treason", + "communist", + "communists", + "KGB", + "state secret", + "state scandal", + "phone taped", + "tape the phone", + "tape his phone", + "tape her phone" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: ["suspenseful", "mystery", "jazzy", "noir movie"], + sound: [], + dialogue: [], + style: ["dimly lit", "tense", "suspenseful", "cold", "strong shadows"], + camera: [], + } + }, + { + "label": "police", + "aliases": { + "en": [ + // "investigation", + "police investigation", + "inspector", + "inspectors", + // "detective", + "detectives", + // "police", + "FBI", + "FBI agent", + "FBI agents", + "interpol", + "interpol agent", + "interpol agents", + "under arrest", + "DUI" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: ["suspenseful", "mystery", "noir movie"], + sound: [], + dialogue: [], + style: ["dimly lit", "tense", "suspenseful", "cold", "strong shadows"], + camera: [], + } + }, + { + "label": "fantasy, magic", + "aliases": { + "en": [ + "transfigure", + "transfigures", + "transfiguration", + "dragon", + "dragons", + "dragon breath", + "unicorn", + "unicorns", + "gnome", + "gnomes", + "levitating", + "levitation", + "elixir of life", + "invisibility cape", + "invisibility potion", + "sorcerer", + "magic stick", + "witch", + "witches", + "mage", + "mages", + "dark wizard", + "wizard", + "wizards", + "wizard school", + "wizardry", + "magician", + "magicians", + "witchcraft", + "witchcrafts", + "spell casting", + "spellcast", + "spell cast", + "spell casting", + "casting a spell", + "casting spells", + "casts a spell", + "casts spells", + "cast spells", + "cast spell", + "spell book", + "magic spell", + "magic spells", + "forbidden magic", + "dark arts", + "potion", + "potions", + "magic potion", + "magic potions", + "magic school", + "magic door", + "magic portal", + "magic window", + "magic broom", + "flying broom", + "abracadabra", + "talking tree", + "forest troll", + "montain troll", + "trolls", + "troll", + "troll blood", + "goblin", + "goblins", + "dwarf", + "dwarfs", + "dwarves", + "merlin", + "muggle" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: ["dimly lit"], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: ["fantasy"], + camera: [], + } + }, + { + "label": "adventure", + "aliases": { + "en": [ + "secret", + "mystery", + "treasure", + "treasures", + "discovery", + "adventure", + "expedition", + "cave", + "mountain", + "desert", + "diving", + "scuba" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: ["mystery", "adventure", "indiana jones", "goonies", "pirates"], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "action", + "aliases": { + "en": [ + "smashes", + "smashing", + "fireball", + "fire ball", + "destroys", + "destroying", + "bulletproof", + "heavily armored", + "heavy armor", + "escape the building", + "chased by", + "explodes", + "explosive", + "explosives", + "fast paced", + "semi-automatic weapon", + "semi-automatic weapons", + "semi-auto", + "car crash", + "cars crash", + "car crashes", + "vehicles barrel", + "vehicle barrels", + "cloud of debris", + "grenade", + "grenades", + "gun", + "guns", + "pistol", + "pistols", + "helicopter", + "helicopters", + "car chase", + "car chases", + "police chase", + "police chases", + "heist", + "heists", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: ["action movie", "thriller", "fast paced"], + sound: [], + dialogue: [], + style: ["action movie", "thriller", "fast paced"], + camera: [], + } + }, + { + "label": "science-fiction", + "aliases": { + "en": [ + "self-destruct button", + "flying car", + "flying cars", + "flying taxi", + "flying taxis", + "spaceship", + "space ship", + "star ship", + "starship", + "mothership", + "space helmet", + "space helmets", + "astronaut", + "astronauts", + "inter-stellar", + "hyper-drive", + "range of the planet", + "landing on the planet", + "orbital insertion", + "probe retract system", + "landing probe", + "planet's surface", + "hostile planet", + "depressurization", + "pepressurization", + "space vacuum", + "laser pistol", + "laser pistols", + "servomoteur", + "android", + "cyberspace", + "air lock", + "airlock", + "asteroids", + "asteroid belt", + "light year", + "light years", + "diagnostic coffin", + "laser beam", + "last door", + "blast doors", + "alien creature", + "alien device", + "cryosleep", + "hypersleep", + "science fiction", + "science-fiction", + "sometime in the future", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: ["science", "engineering"], + camera: [], + } + }, + { + "label": "gore", + "aliases": { + "en": [ + "kills him", + "kills her", + "murders him", + "murders her", + "smear of blood", + "blood spatter", + "blood spatters", + "blood spattering", + "blood splatter", + "blood splatters", + "blood splattering", + "gruesome", + "beheaded", + "splatters fluids and blood", + "splatters blood", + "blood pooling", + "blood oozing", + "blood droplets", + "blood spurting out", + "blood spurts out", + "covered with blood", + "hole in his chest", + "gutted corpse", + "dead corpse", + "guts him", + "guts her", + "slashes him", + "slashes her", + "bleed", + "bleeding", + "bleeds" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: ["bloody", "gore"], + camera: [], + } + }, + { + "label": "horror", + "aliases": { + "en": [ + "sound demonic", + "panic increases", + "demonic", + "hideous silhouette", + "silhouette in the darkness", + "suspended in terror", + "hideous", + "beyond terror", + "from beyond", + "screeching sound", + "she looks human", + "he looks human", + "not quite human", + "clicking her jaw", + "oozing", + "oozes", + "spooky", + "spooking", + "spooked", + "spooks", + "ghastly", + "spasms", + "squealing in pain", + "go limp", + "squealing stops", + "morbid fascination", + "whispering voice", + "whispering voices", + "demonic whispers", + "whispers intensify", + "eerie silence", + "in horror", + "terrified", + "terrifying", + "dread", + "dreadful", + "screeching sound", + "horrifying", + "with anxiety", + "contorts with rage", + "spectral", + "spectral sight", + "anxiously", + "check under the bed", + "anxious", + "anxiety", + "the monster", + "hurt you", + "hurt me", + "decrepit", + "creeping over", + "face tenses", + "face crumbles", + "devastating", + "look of helplessness", + "preoccupied", + "heard a noise", + "hears a noise", + "check for monster", + "check for monsters", + "peering underneath", + "somehow creepy", + "very creepy", + "creepy", + "freaky", + "howling with fear", + "nightmare", + "nightmares", + "creepy shadow", + "creepy shadows", + "creepy face", + "genuinely scared", + "trembling", + "very concerned", + ] + }, + prompts: { + character: ["anxiety"], + location: [], + transition: [], + time: [], + era: [], + lighting: ["dimly lit"], + weather: [], + action: [], + music: ["uneasy", "creepy"], + sound: ["silence", "creepy"], + dialogue: [], + style: ["creepy", "uneasy"], + camera: [], + } + }, + { + "label": "war, military", + "aliases": { + "en": [ + "sergent", + "smattering of soldiers", + "soldiers mill", + "chain of soldiers", + "chains of soldiers", + "royal engineer", + "royal engineers", + "artillery", + "shell artillery", + "mess tents", + "mess tent", + "comms trench", + "trenches", + "tanks", + "ordnance", + "AK-47", + "AK47", + "spy", + "soldier", + "soldiers", + "military", + // "war", + "war effort", + "war relief", + "invasion", + "bombing", + "bomber", + "bombers", + "bombardier", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "WW1", + "aliases": { + "en": [ + "first world war", + "world war 1", + "world war", + "the great war", + "1914", + "1915", + "1916", + "1917", + "1918", + "WW1", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: ["military", "ww1"], + camera: [], + } + }, + { + "label": "WW2", + "aliases": { + "en": [ + "world war 2", + "world war II", + "second world war", + "1939", + "1940", + "1941", + "1942", + "1943", + "1944", + "1945", + "WW2", + "WWII", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: ["military", "ww2"], + camera: [], + } + } +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/genres/index.ts b/packages/broadway/src/parsers/genres/index.ts new file mode 100644 index 00000000..01b76703 --- /dev/null +++ b/packages/broadway/src/parsers/genres/index.ts @@ -0,0 +1,10 @@ +import { NamedEntity } from "@/types" +import { createOccurrenceCounter, createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { data } from "./database" + +export const parseGenres = createSimpleParser(data, ["aliases"]) + +export const getMostProbableGenres = createOccurrenceCounter(parseGenres) + +export const getGenre = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/parsers/index.ts b/packages/broadway/src/parsers/index.ts new file mode 100644 index 00000000..f4eb13b6 --- /dev/null +++ b/packages/broadway/src/parsers/index.ts @@ -0,0 +1,25 @@ +export { parseEntity } from "./entity" +export { + getEra, + getMostProbableEras, + parseEras +} from "./eras" +export { + getGenre, + getMostProbableGenres, + parseGenres +} from "./genres" +export { getLight, parseLights } from "./lights" +export { + getLocation, + parseIndoorLocations, + parseOutdoorLocations, + parseLocations, + parseLocationType +} from "./locations" +export { type ExtractedCharacterName, parseNames } from "./names" +export { getShot, parseShots } from "./shots" +export { getSound, parseSounds } from "./sounds" +export { parseTransition, transitions } from "./transitions" +export { createOccurrenceCounter, createParser, createSimpleParser, getParserItemFromLabel } from "./utils" +export { getWeather, parseWeather } from "./weather" diff --git a/packages/broadway/src/parsers/lights/database.ts b/packages/broadway/src/parsers/lights/database.ts new file mode 100644 index 00000000..fab0cef9 --- /dev/null +++ b/packages/broadway/src/parsers/lights/database.ts @@ -0,0 +1,1186 @@ +import { NamedEntity } from "@/types" + +export const artificalLights: NamedEntity[] = [ + { + "label": "fluorescent lamps", + "aliases": { + "en": [ + "fluorescent light", + "fluorescent tube", + "fluorescent lamp", + "fluorescent lightbulb", + "fluorescent light bulb", + "fluorescent bulb", + "gas-discharge lamp", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "fluorescent lamps", + "aliases": { + "en": [ + "fluorescent lights", + "fluorescent tubes", + "fluorescent lamps", + "fluorescent lightbulbs", + "fluorescent light bulbs", + "fluorescent bulbs", + "gas-discharge lamps" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "incandescent lamp", + "aliases": { + "en": [ + "incandescent light", + "incandescent tube", + "incandescent lamp", + "incandescent globe", + "incandescent lightbulb", + "incandescent light bulb", + "incandescent bulb", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "incandescent lamps", + "aliases": { + "en": [ + "incandescent lights", + "incandescent tubes", + "incandescent lamps", + "incandescent globes", + "incandescent lightbulbs", + "incandescent light bulbs", + "incandescent bulbs", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "oil lamp", + "aliases": { + "en": [ + "oil lamp", + "paraffin lamp", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "oil lamps", + "aliases": { + "en": [ + "oil lamps", + "paraffin lamps" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "electric light", + "aliases": { + "en": [ + "lamp", + // "light", + // "bulb", // + "electric lamp", + "electric light", + "electric bulb", + "electric light bulb", + "light bulb", + "lightbulb" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "electric lights", + "aliases": { + "en": [ + "lamps", + "lights", + "bulbs", + "electric lamps", + "electric lights", + "electric bulbs", + "electric light bulbs", + "light bulbs", + "lightbulbs" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "halogen lamp", + "aliases": { + "en": [ + "halogen light", + "halogen tube", + "halogen lamp", + "halogen globe", + "halogen lightbulb", + "halogen light bulb", + "halogen bulb", + "halogen", + "tungsten halogen", + "tungsten halogen lamp", + "tungsten halogen light", + "tungsten lamp", + "tungsten light", + "quartz-halogen", + "quartz-halogen light", + "quartz-halogen lamp", + "quartz iodine", + "quartz iodine light", + "quartz iodine lamp", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "halogen lamps", + "aliases": { + "en": [ + "halogen lights", + "halogen tubes", + "halogen lamps", + "halogen globes", + "halogen lightbulbs", + "halogen light bulbs", + "halogen bulbs", + "halogens", + "tungsten halogens", + "tungsten halogen lamps", + "tungsten halogen lights", + "tungsten lamps", + "tungsten lights", + "quartz-halogens", + "quartz-halogen lights", + "quartz-halogen lamps", + "quartz iodines", + "quartz iodine lights", + "quartz iodine lamps", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "LED lamp", + "aliases": { + "en": [ + "led light", + "led lamp", + "led bulb", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "LED lamps", + "aliases": { + "en": [ + "led lights", + "led lamps", + "led bulbs", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "spot light", + "aliases": { + "en": [ + "spotlight", + "spot light", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "spot lights", + "aliases": { + "en": [ + "spotlights", + "spot lights", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "candle", + "aliases": { + "en": [ + "candle light", + "candle lamp", + "candle", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "candles", + "aliases": { + "en": [ + "candle lights", + "candle lamps", + "candles", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "candelabre", + "aliases": { + "en": [ + "candelabre", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "candelabres", + "aliases": { + "en": [ + "candelabres", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "chandelier", + "aliases": { + "en": [ + "chandelier", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "chandeliers", + "aliases": { + "en": [ + "chandeliers", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "flashlight", + "aliases": { + "en": [ + "phone light", + "phone flashlight", + "tactical light", + "flashlight", + "flash light", + "led torch", + "torch", + "electric flashlight", + "led flashlight", + "electric torch", + "led torch" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "flashlights", + "aliases": { + "en": [ + "phone lights", + "phone flashlights", + "tactical lights", + "flashlights", + "flash lights", + "led torches", + "torches", + "electric flashlights", + "led flashlights", + "electric torches", + "led torches" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car headlamp", + "aliases": { + "en": [ + "car head lamp", + "car headlamp", + "daytime running light", + "daytime running lamp" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car headlamps", + "aliases": { + "en": [ + "car head lamps", + "car headlamps", + "daytime running lights", + "daytime running lamps" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "headlamps", + "aliases": { + "en": [ + "head lamps", + "headlamps", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "head light", + "aliases": { + "en": [ + "head light", + "head torch", + "headtorch" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "fog lamp", + "aliases": { + "en": [ + "fog lamp", + "fog light", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "fog lamps", + "aliases": { + "en": [ + "fog lamps", + "fog lights", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "fireplace", + "aliases": { + "en": [ + "fire place", + "fireplace" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "fire light", + "aliases": { + "en": [ + "fire light", + "firelight", + "burning fire", + "fire" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "green light", + "aliases": { + "en": [ + "green light" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "green lights", + "aliases": { + "en": [ + "green lights" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "yellow light", + "aliases": { + "en": [ + "yellow light" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "orange light", + "aliases": { + "en": [ + "orange light" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "orange lights", + "aliases": { + "en": [ + "orange lights" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "red light", + "aliases": { + "en": [ + "red light" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "purple light", + "aliases": { + "en": [ + "purple light" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "purple lights", + "aliases": { + "en": [ + "purple lights" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "blue light", + "aliases": { + "en": [ + "blue light" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "blue lights", + "aliases": { + "en": [ + "blue lights" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + + +export const naturalLights: NamedEntity[] = [ + { + "label": "sun light", + "aliases": { + "en": [ + "day light", + "daylight", + "sky lit", + "sky light", + "sun light", + "sunlight", + "sun lit", + "sunlit", + "sunny", + "strong sun", + "harsh sun", + "intense sun", + "burning sun" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "lit through the window", + "aliases": { + "en": [ + "window lit", + "lit through the window", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "lit through the windows", + "aliases": { + "en": [ + "lit through the windows", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "cloudy sky light", + "aliases": { + "en": [ + "cloudy sky", + "clouds in the sky", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "moonlit", + "aliases": { + "en": [ + "moon lit", + "full moon" + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: ["moonlit"], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const data: NamedEntity[] = [ + ...artificalLights, + ...naturalLights, +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/lights/index.ts b/packages/broadway/src/parsers/lights/index.ts new file mode 100644 index 00000000..4f5fd817 --- /dev/null +++ b/packages/broadway/src/parsers/lights/index.ts @@ -0,0 +1,8 @@ +import { NamedEntity } from "@/types" +import { createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { data } from "./database" + +export const parseLights = createSimpleParser(data, ["aliases"]) + +export const getLight = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/parsers/locations/database.ts b/packages/broadway/src/parsers/locations/database.ts new file mode 100644 index 00000000..de61bcda --- /dev/null +++ b/packages/broadway/src/parsers/locations/database.ts @@ -0,0 +1,1357 @@ +import { NamedEntity } from "@/types" + +export const indoor: NamedEntity[] = [ + { + "label": "inside a room", + "aliases": { + "en": [ + "inside the room", + "inside a room", + "in the room", + "in a room", + "to the room", + "the room", + // "room" // might conflict + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a living room", + "aliases": { + "en": [ + "inside the living room", + "inside a living room", + "in the living room", + "in a living room", + "to the living room", + "the living room", + "living room" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a house", + "aliases": { + "en": [ + "inside the house", + "inside a house", + "in the house", + "in a house", + "a house", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a garage", + "aliases": { + "en": [ + "inside the garage", + "inside a garage", + "in the garage", + "in a garage", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a tent", + "aliases": { + "en": [ + "inside the tent", + "inside a tent", + "in the tent", + "in a tent", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a building", + "aliases": { + "en": [ + "inside the building", + "inside a building", + "in the building", + "in a building", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a hospital room", + "aliases": { + "en": [ + "in a hospital room", + "inside a hospital room", + "in the hospital room", + "inside the hospiral room", + "a hospital room", + "the hospital room", + "inside a hospital", + "inside the hospital", + "at a hospital", + "at the hospital" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "inside a hospital", + "aliases": { + "en": [ + "inside a hospital", + "inside the hospital", + "at a hospital", + "at the hospital" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at the office", + "aliases": { + "en": [ + "at the office", + "in the office", + "in an office", + "inside an office", + "inside the office", + "office room", + + // conflict with funeral? + "an office", + "the office", + "office" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at a pub", + "aliases": { + "en": [ + "pub", + "pub bar", + "pub restaurant", + "the pub", + "the pub bar", + "the pub restaurant", + "a pub", + "a pub bar", + "a pub restaurant", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at a restaurant", + "aliases": { + "en": [ + "at a restaurant", + "a restaurant", + "restaurant", + "chain restaurant", + "fastfood restaurant", + "fast food restaurant", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at a dinner", + "aliases": { + "en": [ + "at a dinner", + "a dinner", + "dinner", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at a hip-hop club", + "aliases": { + "en": [ + "hiphop nightclub", + "hiphop club", + "underground hiphop club", + "hiphop club", + "hip-hop club", + "underground hip-hop club" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at a disco night club", + "aliases": { + "en": [ + "disco club", + "disco nightclub", + "disco night club", + "underground disco club", + "underground disco night club", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "a night club", + "aliases": { + "en": [ + "nightclub", + "night club", + "underground club", + "underground nightclub", + "underground night club", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "interior of a car", + "aliases": { + "en": [ + "interior of a car", + "she is in a car", + "he is in a car", + "driving a car", + "in a car", + "inside a car" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "interior of a bathroom", + "aliases": { + "en": [ + "inside a bathroom", + "inside a dirty bathroom", + "inside a desolate bathroom", + "a bathroom", + "bathroom" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "interior of an elevator", + "aliases": { + "en": [ + "inside an elevator", + "inside the elevator", + "enters the elevator", + "an elevator", + "the elevator" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + + { + "label": "japanese castle", + "aliases": { + "en": [ + "japanesecastle", + "japanese castle", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "chinese castle", + "aliases": { + "en": [ + "chinesecastle", + "chinese castle", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "spanish castle", + "aliases": { + "en": [ + "spanishcastle", + "spanish castle", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "medieval castle", + "aliases": { + "en": [ + "medievalcastle", + "medieval castle", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "castle", + "aliases": { + "en": [ + "castle", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const outdoor: NamedEntity[] = [ + { + "label": "in a meadow", + "aliases": { + "en": [ + "outside in a meadow", + "outside in the meadow", + "outside at a field", + "outside at the meadow", + "in a meadow", + "in some meadow", + "in the meadow", + "in the meadows", + "middle of a meadow", + "middle of the meadow", + "middle of the meadows", + "at a meadow", + "at the meadow", + "at the meadows", + "a meadow", + "the meadow", + "the meadows", + "meadow", + "meadows" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "on a hill", + "aliases": { + "en": [ + "outside on the hill", + "outside at the hill", + "on some hill", + "at some hill", + "on a hill", + "on the hill", + "at a hill", + "at the hill", + "the hill", + "some hill" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "in the hills", + "aliases": { + "en": [ + "outside on the hills", + "outside at the hills", + "in the hills", + "in some hills", + "on some hills", + "on a hills", + "on the hills", + "at a hills", + "at the hills", + "the hills" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "in a field", + "aliases": { + "en": [ + "outside in a field", + "outside in the field", + "outside at a field", + "outside at the field", + "in a field", + "in some field", + "in the field", + "in the fields", + "middle of a field", + "middle of the field", + "middle of the fields", + "at a field", + "at the field", + "at the fields", + "corn field", + "corn fields" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "in a jungle", + "aliases": { + "en": [ + "outside in a jungle", + "outside in the jungle", + "outside at a jungle", + "outside at the jungle", + "outside inside the jungle", + "in a jungle", + "in the jungle", + "at a jungle", + "at the jungle", + "inside the jungle", + "deep jungle", + "deep and dark jungle", + "mysterious jungle", + "creepy jungle", + "dark jungle", + "dense jungle", + "dangerous jungle" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "in a forest", + "aliases": { + "en": [ + "outside in a park", + "outside in the forest", + "outside at a forest", + "outside at the forest", + "outside inside the forest", + "in a forest", + "in the forest", + "at a forest", + "at the forest", + "inside the forest", + "deep forest", + "deep and dark forest", + "mysterious forest", + "creepy forest", + "dark forest", + "dense forest", + "dangerous forest" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at the park", + "aliases": { + "en": [ + "outside in a park", + "outside in the park", + "outside at a park", + "outside at the park", + "outside inside the park", + "in a park", + "in the park", + "at a park", + "at the park", + "inside the park", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "in a garden", + "aliases": { + "en": [ + "outside in a garden", + "outside in the garden", + "outside inside the garden", + "in a garden", + "in the garden", + "inside the garden", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "parking lot", + "aliases": { + "en": [ + "outside at a parking", + "outside on the parking", + "outdoor parking", + "on a parking lot", + "a parking lot", + "the parking lot" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "outside a hospital", + "aliases": { + "en": [ + "outside a hospital", + "outside the hospital", + "outside the hospital parking", + "outside the hospital parking", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "next to a car", + "aliases": { + "en": [ + "exterior of a car", + "she is next to a car", + "he is next to a car", + "next to a car", + "she is next to the car", + "he is next to the car", + "next to a car" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "mountain", + "aliases": { + "en": [ + "mountain" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "mountains", + "aliases": { + "en": [ + "mountains" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "japanese courtyard", + "aliases": { + "en": [ + "japanesecourtyard", + "japanese courtyard", + "japanese court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "chinese courtyard", + "aliases": { + "en": [ + "chinesecourtyard", + "chinese courtyard", + "chinese court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "indian courtyard", + "aliases": { + "en": [ + "indiancourtyard", + "indian courtyard", + "indian court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "roman courtyard", + "aliases": { + "en": [ + "romancourtyard", + "roman courtyard", + "roman court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "spanish courtyard", + "aliases": { + "en": [ + "spanishcourtyard", + "spanish courtyard", + "spanish court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "spartan courtyard", + "aliases": { + "en": [ + "spartancourtyard", + "spartan courtyard", + "spartan court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "medieval courtyard", + "aliases": { + "en": [ + "medievalcourtyard", + "medieval courtyard", + "medieval court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "courtyard", + "aliases": { + "en": [ + "courtyard", + "court yard" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "at a cemetary", + "aliases": { + "en": [ + "at a cemetary", + "at a cemetery", + "cemetary", + "cemetery", + ], + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + + { + "label": "on a high way", + "aliases": { + "en": [ + "on a high way", + "on the high way", + "on a highway", + "on the highway", + "a high way", + "a highway", + "the high way", + "the highway", + "high way", + "highway" + ], + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "on a road", + "aliases": { + "en": [ + "on a road", + "on the road", + "a road", + "the road", + ], + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "in a street", + "aliases": { + "en": [ + "in a street", + "in the street", + "a long street", + "on a street", + "on the street", + "a street", + "the street", + ], + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const data: NamedEntity[] = [ + ...indoor, + ...outdoor +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/locations/index.ts b/packages/broadway/src/parsers/locations/index.ts new file mode 100644 index 00000000..1cf4ad31 --- /dev/null +++ b/packages/broadway/src/parsers/locations/index.ts @@ -0,0 +1,30 @@ +import { LocationEntity } from "@/types" +import { ScreenplaySequenceType } from "@/constants" +import { createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { indoor, outdoor, data } from "./database" + +export const parseIndoorLocations = createSimpleParser(indoor, ["aliases"]) +export const parseOutdoorLocations = createSimpleParser(outdoor, ["aliases"]) +export const parseLocations = createSimpleParser(data, ["aliases"]) + +export const parseLocationType = async (input: string[]): Promise => { + + const parsedLocationsIndoor = await parseIndoorLocations(input) + const parsedLocationsOutdoor = await parseOutdoorLocations(input) + + let parsedLocationType: ScreenplaySequenceType = "UNKNOWN" + if (parsedLocationsIndoor.length && !parsedLocationsOutdoor.length) { + parsedLocationType = "INTERIOR" + } else if (!parsedLocationsIndoor.length && parsedLocationsOutdoor.length) { + parsedLocationType = "EXTERIOR" + } else if (parsedLocationsIndoor.length && !parsedLocationsOutdoor.length) { + parsedLocationType = "INT./EXT." + } else { + parsedLocationType = "UNKNOWN" + } + return parsedLocationType +} + + +export const getLocation = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/parsers/locations/locations.ts b/packages/broadway/src/parsers/locations/locations.ts new file mode 100644 index 00000000..fe05c3a8 --- /dev/null +++ b/packages/broadway/src/parsers/locations/locations.ts @@ -0,0 +1,20 @@ + + +// TODO use a transition type for the values, to avoid mistakes + +import { ScreenplaySequenceType } from "@/constants/screenplaySequences" + +// TODO: those need to be prefixed by space to avoid false positives +export const locationTypes: Record = { + "INT.": "INTERIOR", + "INT": "INTERIOR", + "INT-": "INTERIOR", + "EXT.": "EXTERIOR", + "EXT": "EXTERIOR", + "EXT-": "EXTERIOR", + "INT./EXT.": "INT./EXT.", + "EXT./INT." : "INT./EXT.", + "INT/EXT" : "INT./EXT.", + "EXT/INT": "INT./EXT.", + "FLASHBACK": "INT./EXT." +} diff --git a/packages/broadway/src/parsers/music/database.ts b/packages/broadway/src/parsers/music/database.ts new file mode 100644 index 00000000..05e4b2c1 --- /dev/null +++ b/packages/broadway/src/parsers/music/database.ts @@ -0,0 +1,102 @@ +import { NamedEntity } from "@/types" + +export const data: NamedEntity[] = [ + { + "label": "mozart sonata", + "aliases": { + "en": [ + "sonata", + "mozart", + "mozart sonata" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "soft orchestra music, sonata, synthesizer, strings", + "aliases": { + "en": [ + "stars glitter" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "futuristic orchestra music, synthesizer, strings, violin, brass", + "aliases": { + "en": [ + "spaceship", + "astronaut" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "faint radio music", + "aliases": { + "en": [ + "faint music", + "faint radio music", + "radio music in the background", + "music in the background" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + } +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/names/index.ts b/packages/broadway/src/parsers/names/index.ts new file mode 100644 index 00000000..d61835a8 --- /dev/null +++ b/packages/broadway/src/parsers/names/index.ts @@ -0,0 +1,30 @@ +import parse from "@datagica/parse-names" + +export type ExtractedCharacterName = { + "ngram": string + "value": { + "id": string + "name": string + "culture": string[] // ["french"], + "gender": string[] // ["m"] + }, + "score": number, + "position": { + "sentence": number + "word": number + "begin": number + "end": number + } +} + +export async function parseNames(text: string): Promise { + + const results = (await parse(text.trim().toLowerCase())) as ExtractedCharacterName[] + + if (!Array.isArray(results) || !results.length) { + return [] + } + + // there might be duplicates, eg. "bárbara" and "barbara" + return results.filter(item => item.value.name.trim().toLowerCase() === item.ngram.trim().toLowerCase()) +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/shots/database.ts b/packages/broadway/src/parsers/shots/database.ts new file mode 100644 index 00000000..e51eb7c7 --- /dev/null +++ b/packages/broadway/src/parsers/shots/database.ts @@ -0,0 +1,402 @@ +import { NamedEntity } from "@/types" + +const shotTypes: NamedEntity[] = [ + { + "label": "long wide establishing shot", + "aliases": { + "en": [ + "long wide establishing shot", + "wide establishing shot", + "long establishing shot", + "establishing shot", + "long wide shot", + "long shot", + "wide shot" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "full shot", + "aliases": { + "en": [ + "full shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "extreme long shot", + "aliases": { + "en": [ + "extreme long shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "medium-long shot", + "aliases": { + "en": [ + "medium-long shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "medium shot", + "aliases": { + "en": [ + "medium shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "medium close-up shot", + "aliases": { + "en": [ + "medium close-up shot", + "medium close-up", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "close-up shot", + "aliases": { + "en": [ + "close-up shot", + "close-up", + "close on an", + "close on the" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "extreme close-up shot", + "aliases": { + "en": [ + "extreme close-up shot", + "extreme close-up", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "american shot", + "aliases": { + "en": [ + "american shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "italian shot", + "aliases": { + "en": [ + "italian shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "trolley shot", + "aliases": { + "en": [ + "trolley shot", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +const cameraMovementTypes: NamedEntity[] = [ + { + "label": "camera zomming in", + "aliases": { + "en": [ + "zomming tighter", + "camera zooming in", + "zooming in", + "zomming into" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "camera panning up", + "aliases": { + "en": [ + "camera panning up", + "panning up", + "long panning up shot", + "panning up shot", + "panning up", + "camera panning up them", + "camera panning up him", + "camera panning up her", + "panning up with", + "panning up him", + "panning up her", + "panning up them" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "camera panning down", + "aliases": { + "en": [ + "camera panning down", + "panning down", + "long panning down shot", + "panning down shot", + "panning down", + "camera panning down them", + "camera panning down him", + "camera panning down her", + "panning down with", + "panning down him", + "panning down her", + "panning down them" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "camera panning", + "aliases": { + "en": [ + "camera panning", + "long panning shot", + "panning shot", + "camera panning them", + "camera panning him", + "camera panning her", + "panning with", + "panning him", + "panning her", + "panning them" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const data: NamedEntity[] = [ + ...shotTypes, + ...cameraMovementTypes, +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/shots/index.ts b/packages/broadway/src/parsers/shots/index.ts new file mode 100644 index 00000000..b2db4442 --- /dev/null +++ b/packages/broadway/src/parsers/shots/index.ts @@ -0,0 +1,8 @@ +import { NamedEntity } from "@/types" +import { createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { data } from "./database" + +export const parseShots = createSimpleParser(data, ["aliases"]) + +export const getShot = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/parsers/sounds/database.ts b/packages/broadway/src/parsers/sounds/database.ts new file mode 100644 index 00000000..3c9ae128 --- /dev/null +++ b/packages/broadway/src/parsers/sounds/database.ts @@ -0,0 +1,2559 @@ +import { NamedEntity } from "@/types" + +export const weatherSounds: NamedEntity[] = [ + { + "label": "wind", + "aliases": { + "en": [ + "wind", + "winds", + "wind blowing", + "winds blowing", + "wind blows", + "windy", + "clouds", + "covered sky", + "cloudy sky" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + }, + }, + { + "label": "strong wind, tornado", + "aliases": { + "en": [ + "strong wind", + "strong winds", + "twister", + "tornado" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "thunder", + "aliases": { + "en": [ + "tempest", + "lightning", + "storm" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "rain", + "aliases": { + "en": [ + "heavy rain", + "raining", + "soft rain" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const vehiclesSounds: NamedEntity[] = [ + { + "label": "car driving", + "aliases": { + "en": [ + "vehicle reverses", + "car reverses", + "truck reverses", + "they drive up", + "they drive down", + "they drive to", + "he drives up", + "he drives down", + "he drives to", + "driving cars", + "car continues", + "car drives", + "car takes a turn", + "car is still rocking", + "roars by", + "in the car, driving" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car accelerating, roaring engine", + "aliases": { + "en": [ + "car accelerating", + "car gains momentum", + "car picks up momentum", + "accelerates the car", + "car moving faster", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "roaring engine, wind", + "aliases": { + "en": [ + "speed is frightening", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car slowing down", + "aliases": { + "en": [ + "the car slows", + "car slows down", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car is stopping", + "aliases": { + "en": [ + "car is stopping", + "car reaches a full stop" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "object falling on the road, spinning", + "aliases": { + "en": [ + "falls into the road", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car horns", + "aliases": { + "en": [ + "car horns" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "car traffic jam", + "aliases": { + "en": [ + "car traffic", + "dense traffic", + "busy street", + "traffic jam", + "in a traffic jam", + "a traffic jam" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "helicopter", + "aliases": { + "en": [ + "chopper", + "choppers", + "helicopter", + "helicopters" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "truck engine", + "aliases": { + "en": [ + "truck noises", + "trucks", + "truck", + "bulldozer", + "bulldozer pushes", + "tank", + "tanks" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + } +] + +export const animalSounds: NamedEntity[] = [ + { + "label": "dog patting and soft barking", + "aliases": { + "en": [ + "dog", + "dogs", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "rasp of crickets", + "aliases": { + "en": [ + "rasp of crickets", + "sound of crickets", + "crickets noise", + "crickets at night", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "mule", + "aliases": { + "en": [ + "the mule", + "mule", + "mules" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "horses", + "aliases": { + "en": [ + "the horse", + "horses", + "horse", + "horsemen" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "cat meowing", + "aliases": { + "en": [ + "cat", + "cats", + "kitten" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "dolphin squaling", + "aliases": { + "en": [ + "dolphin", + "dolphins" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "a growling dog", + "aliases": { + "en": [ + "a growling dog", + "the growling dog", + "growling dog", + "dog growls", + "dog is growling" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "growling dogs", + "aliases": { + "en": [ + "a growling dogs", + "the growling dogs", + "growling dogs", + "dogs growl", + "dogs are growling" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "a predator roars", + "aliases": { + "en": [ + "animal roars", + "a roar rises", + "predator roars", + "jungle roars", + "loud roar", + "loud roars", + "menacing roar", + "menacing roars", + "a roar from", + "roars at", + "angry roar", + "angry roars" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "lion roaring", + "aliases": { + "en": [ + "lion roaring", + "lions roaring", + // "lions" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "boar growling", + "aliases": { + "en": [ + "bear growling", + "bears growling", + "bear cub growling" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "owl howling", + "aliases": { + "en": [ + "owl howling", + "owls howling" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "wolf howling", + "aliases": { + "en": [ + "wolf howling", + "wolves howling" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const placeSounds: NamedEntity[] = [ + { + "label": "wind", + "aliases": { + "en": [ + "forest", + "mountain" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "wind, savanna animals", + "aliases": { + "en": [ + "parched countryside", + "african countryside", + "savanna" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "water stream", + "aliases": { + "en": [ + "water stream", + "river", + "stream" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "cave sound, water dripping", + "aliases": { + "en": [ + "natural caves", + "caves", + "natural cave", + "cave" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "birds singing", + "aliases": { + "en": [ + "garden", + "forest", + "meadow", + "meadows", + "prairie", + "valley" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "wind, soft traffic sound", + "aliases": { + "en": [ + "skyscrappers", + "skyscrapper", + "rooftop", + "over a city", + "hovering a city", + "over the city", + "hovering the city", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "traffic noise, pedestrians", + "aliases": { + "en": [ + "city centre", + "city center", + "downtown", + "city" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "pedestrian noise, soft traffic sounds", + "aliases": { + "en": [ + "pedestrians", + "side walk" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + } +] + + +export const objectSounds: NamedEntity[] = [ + { + "label": "electrical hum", + "aliases": { + "en": [ + "electrical hum", + "electrical humming", + "electrical hums", + "electrical noise", + "electrical noises", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "electronic beeps", + "aliases": { + "en": [ + "electronic hum", + "electronic humming", + "electronic hums", + "electronic noise", + "electronic noises", + "electronic beep", + "electronic beeping", + "electronic beeps", + "electronic sound", + "electronic sounds", + "electronic pulsing sound", + "electronic pulsing sounds", + "electronic pulsing beep", + "electronic pulsing beeps", + "electronic conversation", + "device hum", + "device humming", + "device hums", + "device noise", + "device noises", + "device beep", + "device beeping", + "device beeps", + "device sound", + "device sounds", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "coughing", + "aliases": { + "en": [ + "coughing", + "she coughs", + "he coughs" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "water dripping", + "aliases": { + "en": [ + "it drips", + "dripping", + + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "smoke", + "aliases": { + "en": [ + "explosion of smoke", + "explosion of escaping gas" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "running water", + "aliases": { + "en": [ + "runs some water", + "runs water", + "runs water through", + "running water", + "water running" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "grinding coffee", + "aliases": { + "en": [ + "grinding coffee", + "he grinds the coffee", + "he grinds a coffee", + "he grinds some coffee", + "she grinds the coffee", + "she grinds a coffee", + "she grinds some coffee", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "grinding", + "aliases": { + "en": [ + "grinding", + "he grinds the", + "he grinds a", + "he grinds some", + "she grinds the", + "she grinds a", + "she grinds some", + "grinds the", + "grinds a", + "grinds some", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "trees shaking", + "aliases": { + "en": [ + "the tree shakes", + "the trees shake", + "trees are shaking", + "tree is shaking" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "a bell rings", + "aliases": { + "en": [ + "ring bells", + "the ring bells", + "cow bell", + "bell is ringing", + "a bell rings", + "the bell rings" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "door opens", + "aliases": { + "en": [ + "door opening", + "door opens", + "opening the door" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + + +export const actionSounds: NamedEntity[] = [ + { + "label": "walking", + "aliases": { + "en": [ + "they walk", + "he walks", + "she walks", + "they are walking", + "he is walking", + "she is walking", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "person running", + "aliases": { + "en": [ + "she rushes to", + "he rushes to", + "he runs", + "he runs off", + "runs off", + "she runs", + "he is running", + "she is running", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "people running", + "aliases": { + "en": [ + "they rushes to", + "they run", + "they are running", + "people run past", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "swimming", + "aliases": { + "en": [ + "they swim", + "he swims", + "she swims", + "they are swimming", + "he is swimming", + "she is swimming" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "sound of strapping an object", + "aliases": { + "en": [ + "strap themselves", + "straps himself", + "straps herself" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "slashing", + "aliases": { + "en": [ + "slashing", + "slashes" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "firing a gun", + "aliases": { + "en": [ + "gun fire", + "gunfire", + + "firing a gun", + "firing his gun", + "firing her gun", + + "firing a pistol", + "firing his pistol", + "firing her pistol", + + "fires a gun", + "fires his gun", + "fires her gun", + + "fires a pistol", + "fires his pistol", + "fires her pistol", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + + { + "label": "gunfires", + "aliases": { + "en": [ + "gun fires", + "gunfires", + "firing guns", + "firing their guns", + "open fire", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "reloading a gun", + "aliases": { + "en": [ + "reloading a gun", + "reloading his gun", + "reloading her gun", + + "reloading a pistol", + "reloading his pistol", + "reloading her pistol", + + "reloads a gun", + "reloads his gun", + "reloads her gun", + + "reloads a pistol", + "reloads his pistol", + "reloads her pistol", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "shaking a box of bullets", + "aliases": { + "en": [ + "grabs a box of bullets", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "shaking a bag of coins", + "aliases": { + "en": [ + "grabs a coin purse", + "grabs his coin purse", + "grabs her coin purse", + "grabs this coin purse", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "puking", + "aliases": { + "en": [ + "we hear him puking", + "we hear her puking", + "he is puking", + "she is puking" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "footsteps stopping", + "aliases": { + "en": [ + "footsteps stop", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "footsteps", + "aliases": { + "en": [ + "footsteps", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "liquid pouring", + "aliases": { + "en": [ + "pours himself a glass", + "pours herself a cup", + "pours himself a", + "pours herself a", + "pours himself", + "pours herself", + "pours some", + "pours a cup", + "pours a glass" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "keys rattling", + "aliases": { + "en": [ + "takes the keys", + "drops the keys", + "keys rattling", + "keys rattle" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "little laugh", + "aliases": { + "en": [ + "little laugh", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "loud laugh", + "aliases": { + "en": [ + "loud laugh", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "little laughs", + "aliases": { + "en": [ + "little laughs", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "loud laughs", + "aliases": { + "en": [ + "loud laughs", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "pounding", + "aliases": { + "en": [ + "man pounds", + "woman pounds", + "is pounding", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "screaming", + "aliases": { + "en": [ + "screams", + "screaming" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "man screaming", + "aliases": { + "en": [ + "he screams", + "he is screaming" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "woman screaming", + "aliases": { + "en": [ + "she screams", + "she is screaming" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "shrieking", + "aliases": { + "en": [ + "shrieks", + "shrieking", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "woman shrieking", + "aliases": { + "en": [ + "she shrieks", + "she is shrieking", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "man shrieking", + "aliases": { + "en": [ + "he shrieks", + "he is shrieking", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "groaning", + "aliases": { + "en": [ + "with a groan", + "groan", + "groans", + "groaning" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "moaning", + "aliases": { + "en": [ + "man stretches", + "woman stretches", + "with a moan", + "moan", + "moans", + "moaning" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "lighting a cigarette", + "aliases": { + "en": [ + "lights a cigarette" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "stones colliding", + "aliases": { + "en": [ + "grabs a stone" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "window shattering", + "aliases": { + "en": [ + "window shatters", + "kicks out a kitchen window", + "kicks out the window", + "kicks out a window", + "kicks a window", + "breaks a window", + "glass shattering", + "shatters a window" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "pushing a button", + "aliases": { + "en": [ + "pushing the button", + "pushes the button", + "pushing a button", + "pushes a button", + "pushing the lock button", + "pushes the lock button", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "soft groan", + "aliases": { + "en": [ + "expresses annoyance" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "man gasping", + "aliases": { + "en": [ + "he is gasping", + "he gasps", + "a gasp chokes him", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "woman gasping", + "aliases": { + "en": [ + "she is gasping", + "she gasps", + "a gasp chokes her", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "people wrestling", + "aliases": { + "en": [ + "they struggle to their feet", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "men making animal sounds and groans", + "aliases": { + "en": [ + "men make animal sounds", + "make animal sounds", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "men making animal sounds and groans", + "aliases": { + "en": [ + "women make animal sounds", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "gasping", + "aliases": { + "en": [ + "frightened gasp" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "breathing sound", + "aliases": { + "en": [ + "he inhales", + "he takes a breath", + "he is breathing", + "he breathes", + + "she inhales", + "she takes a breath", + "she is breathing", + "she breathes" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "moving shackles", + "aliases": { + "en": [ + "shackles" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "lock unlocking", + "aliases": { + "en": [ + "unlocks the shackles", + "unlocks the cuffs", + "unlocks the handcuffs", + "they unlock the shackles", + "they unlock the cuffs", + "they unlock the handcuffs", + "the guard unlocks" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + + +export const eventSounds: NamedEntity[] = [ + { + "label": "explosion", + "aliases": { + "en": [ + "the blast", + "the explosion", + "huge blast", + "huge explosion" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "audience laugh", + "aliases": { + "en": [ + "general laugh", + "general laugh at", + "general laugh at that", + "audience laugh" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "booing", + "aliases": { + "en": [ + "fans loudly go about", + "fans shouting", + "fans booing", + "spectators loudly go about", + "spectators shouting", + "spectators booing", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "newspaper presses rolling", + "aliases": { + "en": [ + "newspaper presses rolling", + "newspaper presses rolling at high speed", + "presses rolling", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "prisoners shouting", + "aliases": { + "en": [ + "prisoners shouting", + "prisoners loudly", + "prisoners booing", + "prisoners loudly go about" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "crowd chattering", + "aliases": { + "en": [ + "crowd chattering", + "chattering", + "newscasters chattering", + "people chattering", + "pedestrians chattering" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "leaves rustling", + "aliases": { + "en": [ + "rustling", + "rustles" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] + +export const data = [ + ...weatherSounds, + ...vehiclesSounds, + ...animalSounds, + ...placeSounds, + ...objectSounds, + ...actionSounds, + ...eventSounds, +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/sounds/index.ts b/packages/broadway/src/parsers/sounds/index.ts new file mode 100644 index 00000000..9eba35f9 --- /dev/null +++ b/packages/broadway/src/parsers/sounds/index.ts @@ -0,0 +1,8 @@ +import { NamedEntity } from "@/types" +import { createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { data } from "./database" + +export const parseSounds = createSimpleParser(data) + +export const getSound = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/parsers/transitions/index.ts b/packages/broadway/src/parsers/transitions/index.ts new file mode 100644 index 00000000..65aa11a8 --- /dev/null +++ b/packages/broadway/src/parsers/transitions/index.ts @@ -0,0 +1,2 @@ +export { parseTransition } from "./parseTransition" +export { transitions } from "./transitions" \ No newline at end of file diff --git a/packages/broadway/src/parsers/transitions/parseTransition.ts b/packages/broadway/src/parsers/transitions/parseTransition.ts new file mode 100644 index 00000000..10431b55 --- /dev/null +++ b/packages/broadway/src/parsers/transitions/parseTransition.ts @@ -0,0 +1,19 @@ +import { transitions } from "./transitions" + +export function parseTransition(originalLine: string): string { + + const line = ` ${originalLine.trim()} ` + + // trimmed line is too short to be a transition + if (line.length < 3) { + return "" + } + + for (const transitionKeyword of Object.keys(transitions)) { + if (line.includes(transitionKeyword)) { + return transitionKeyword + } + } + + return "" +} diff --git a/packages/broadway/src/parsers/transitions/transitions.ts b/packages/broadway/src/parsers/transitions/transitions.ts new file mode 100644 index 00000000..5089097c --- /dev/null +++ b/packages/broadway/src/parsers/transitions/transitions.ts @@ -0,0 +1,67 @@ + + +// TODO use a transition type for the values, to avoid mistakes + +export const transitions: Record = { + "CUT TO BLACKNESS": "Cut to black", + "CUT TO BLACK": "Cut to black", + "SMASH CUT TO BLACK": "Cut to black", + "MATCH CUT TO BLACK": "Cut to black", + "MATCH CUT TO": "Cut to", + "MATCH CUT": "Cut to", + + // what are those? + "SMATCH CUT": "Cut to", + "SMASH CUT TO": "Cut to", + "SLAM CUT TO": "Cut to", + "JUMP CUT TO": "Cut to", + "TIME CUT TO": "Cut to", + "FLASH CUT TO": "Cut to", + "CUT TO REVERSE": "Cut to", + "FREEZE": "Freeze frame", + + "INTERCUT WITH": "Cut to", + "INTERCUT TO": "Cut to", + "INSERT CUT TO": "Cut to", + "INSERT CUT": "Cut to", + + "CUT TO": "Cut to", + "CUT BACK TO": "Cut to", + + "CLOSE ON TO": "Cut to", + + "FADE IN": "Fade in", + "FADES IN": "Fade in", + "DISSOLVE IN": "Fade in", + + "FADE OUT": "Fade out", + "FADES OUT": "Fade out", + "DISSOLVE OUT": "Fade in", + + "FADE TO BLACK": "Fade to black", + "FADES TO BLACK": "Fade to black", + + "FADE TO": "Fade to", + "FADES TO": "Fade to", + "FADE THROUGH TO": "Fade to", + "FADES THROUGH TO": "Fade to", + "DISSOLVE TO": "Fade to", + "FADE INTO": "Fade to", + "FADES INTO": "Fade to", + "FADE THROUGH INTO": "Fade to", + "FADES THROUGH INTO": "Fade to", + "DISSOLVE INTO": "Fade to", + + "QUICK FADE TO": "Quick fade to", + "QUICK FADES TO": "Quick fade to", + "QUICK FADE INTO": "Quick fade to", + "QUICK FADES INTO": "Quick fade to", + "QUICK FADE THROUGH TO": "Quick fade to", + "QUICK FADES THROUGH TO": "Quick fade to", + "QUICK DISSOLVE TO": "Quick fade to", + "QUICK DISSOLVE INTO": "Quick fade to", + + "FADE OUT AND CREDITS ROLL": "Fade to", + "FADES OUT AND CREDITS ROLL": "Fade to", + "CREDITS ROLL": "Fade to", +} diff --git a/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts b/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts new file mode 100644 index 00000000..9875b80f --- /dev/null +++ b/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts @@ -0,0 +1,33 @@ +import { SimpleNamedEntityParser, SimpleOccurrencesCounter } from "@/types" + +export const createOccurrenceCounter = (parser: SimpleNamedEntityParser): SimpleOccurrencesCounter => { + + return async (input: string, minimumOccurrences: number): Promise> => { + + const detected = await parser( + [ input ], + [], + false // <- important: we keep duplicates, so we can count! + ) + + const stats: Record = {} + + detected.forEach(value => { + stats[value] = (stats[value] || 0) + 1 + }) + + const finalStats: Record = {} + + Object.entries(stats) + .map(([key, value]) => { + return { key: key, value: Number(value) } + }) + .filter(a => a.value >= minimumOccurrences) + .sort((a, b) => b.value - a.value) + .forEach(s => { + finalStats[s.key] = s.value + }) + + return finalStats + } +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/utils/createParser.ts b/packages/broadway/src/parsers/utils/createParser.ts new file mode 100644 index 00000000..b1b25657 --- /dev/null +++ b/packages/broadway/src/parsers/utils/createParser.ts @@ -0,0 +1,17 @@ +import ParseEntities from "@datagica/parse-entities" + +import { NamedEntity, NamedEntityParser, NamedEntityResult } from "@/types" + +export function createParser( + data: NamedEntity[] = [], + fields = ['label','aliases'] + ): NamedEntityParser { + class Parser extends ParseEntities { + constructor() { super({ fields, data }) } + } + const parser = new Parser() + + return (input: string): Promise => ( + (parser.parse(input) as Promise) + ) +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/utils/createSimpleParser.ts b/packages/broadway/src/parsers/utils/createSimpleParser.ts new file mode 100644 index 00000000..fb0a28cc --- /dev/null +++ b/packages/broadway/src/parsers/utils/createSimpleParser.ts @@ -0,0 +1,55 @@ +import ParseEntities from "@datagica/parse-entities" + +import { SimpleNamedEntityParser } from "@/types" + +export function createSimpleParser( + data: T[] = [], + fields = ['label','aliases'], + ): SimpleNamedEntityParser { + class Parser extends ParseEntities { + constructor() { super({ fields, data }) } + } + const parser = new Parser() + + async function parse(inputs: string[] = [], defaultValues: string[] = [], removeDuplicates = true): Promise { + const validInputs = inputs.map(input => `${input || ""}`).map(x => x) + if (!validInputs.length) { + return [] + } + + const singleText = validInputs.join(".\n") + + let results = (await parser.parse(singleText) || []) as T[] + + // as an extra security + if (!Array.isArray(results) || !results.length) { + results = [] + } + + // used for deduplication + const dedup = new Set() + + const finalResult = results.map(entity => { + const value = (entity as any).value?.label || "" + + // to identify duplicated, we normalize the keys + const key = value.trim().toLocaleLowerCase() + + // remove duplicates + if (removeDuplicates) { + if (dedup.has(key)) { return "" } + dedup.add(key) + } + + return value + }).filter(value => value) + + if (!finalResult.length) { + return defaultValues + } else { + return finalResult + } + } + + return parse +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts b/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts new file mode 100644 index 00000000..f87d57a7 --- /dev/null +++ b/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts @@ -0,0 +1,58 @@ +import { ClapSegmentCategory } from "@aitube/clap" + +import { NamedEntity } from "@/types" + +export const getParserItemFromLabel = (database: NamedEntity[]) => { + + return (label: string): NamedEntity => { + const defaultEmptyItem: NamedEntity = { + label: "", + aliases: { + en: [] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + } + + const item = database.find(item => item.label === label) + + if (!item) { + return defaultEmptyItem + } + + const prompts: Partial> = + typeof item.prompts === "undefined" ? defaultEmptyItem.prompts! : item.prompts + + return { + ...defaultEmptyItem, + prompts: { + character: Array.isArray(prompts?.character) ? prompts.character : [], + transition: Array.isArray(prompts?.transition) ? prompts.transition : [], + location: Array.isArray(prompts?.location) ? prompts.location : [], + time: Array.isArray(prompts?.time) ? prompts.time : [], + era: Array.isArray(prompts?.era) ? prompts.era : [], + lighting: Array.isArray(prompts?.lighting) ? prompts.lighting : [], + weather: Array.isArray(prompts?.weather) ? prompts.weather : [], + action: Array.isArray(prompts?.action) ? prompts.action : [], + music: Array.isArray(prompts?.music) ? prompts.music : [], + sound: Array.isArray(prompts?.sound) ? prompts.sound : [], + dialogue: Array.isArray(prompts?.dialogue) ? prompts.dialogue : [], + style: Array.isArray(prompts?.style) ? prompts.style : [], + camera: Array.isArray(prompts?.camera) ? prompts.camera : [], + } + } + } +} \ No newline at end of file diff --git a/packages/broadway/src/parsers/utils/index.ts b/packages/broadway/src/parsers/utils/index.ts new file mode 100644 index 00000000..c8ea574e --- /dev/null +++ b/packages/broadway/src/parsers/utils/index.ts @@ -0,0 +1,4 @@ +export { createOccurrenceCounter } from "./createOccurrenceCounter" +export { createParser } from "./createParser" +export { createSimpleParser } from "./createSimpleParser" +export { getParserItemFromLabel } from "./getParserItemFromLabel" \ No newline at end of file diff --git a/packages/broadway/src/parsers/weather/database.ts b/packages/broadway/src/parsers/weather/database.ts new file mode 100644 index 00000000..30a89808 --- /dev/null +++ b/packages/broadway/src/parsers/weather/database.ts @@ -0,0 +1,157 @@ +import { NamedEntity } from "@/types" + +export const data: NamedEntity[] = [ + { + "label": "tornado", + "aliases": { + "en": [ + "twister", + "tornado" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "storm", + "aliases": { + "en": [ + "tempest", + "lightning", + "thunder", + "storm" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "rain", + "aliases": { + "en": [ + "heavy rain", + "raining", + "soft rain", + "rain" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "fog", + "aliases": { + "en": [ + "fog", + "foggy", + "mist" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "sun", + "aliases": { + "en": [ + "sun", + "clear sky", + "sunny", + "bright sun" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "cloudy", + "aliases": { + "en": [ + "cloudy", + "clouds", + "covered sky", + "cloudy sky" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, +] \ No newline at end of file diff --git a/packages/broadway/src/parsers/weather/index.ts b/packages/broadway/src/parsers/weather/index.ts new file mode 100644 index 00000000..0437832c --- /dev/null +++ b/packages/broadway/src/parsers/weather/index.ts @@ -0,0 +1,8 @@ +import { NamedEntity } from "@/types" +import { createSimpleParser, getParserItemFromLabel } from "@/parsers/utils" + +import { data } from "./database" + +export const parseWeather = createSimpleParser(data, ["aliases"]) + +export const getWeather = getParserItemFromLabel(data) \ No newline at end of file diff --git a/packages/broadway/src/tests/bun-shims.js b/packages/broadway/src/tests/bun-shims.js new file mode 100644 index 00000000..7603b4e9 --- /dev/null +++ b/packages/broadway/src/tests/bun-shims.js @@ -0,0 +1,38 @@ +// @bun + +// see https://github.com/oven-sh/bun/issues/1723 + +/*! MIT License. Jimmy Wärting */ +import zlib from 'node:zlib' + +// fyi, Byte streams aren't really implemented anywhere yet +// It only exist as a issue: https://github.com/WICG/compression/issues/31 + +const make = (ctx, handle) => Object.assign(ctx, { + writable: new WritableStream({ + write: chunk => handle.write(chunk), + close: () => handle.end() + }), + readable: new ReadableStream({ + type: 'bytes', + start (ctrl) { + handle.on('data', chunk => ctrl.enqueue(chunk)) + handle.once('end', () => ctrl.close()) + } + }) +}) + +globalThis.CompressionStream ??= class CompressionStream { + constructor(format) { + make(this, format === 'deflate' ? zlib.createDeflate() : + format === 'gzip' ? zlib.createGzip() : zlib.createDeflateRaw()) + } +} + +globalThis.DecompressionStream ??= class DecompressionStream { + constructor(format) { + make(this, format === 'deflate' ? zlib.createInflate() : + format === 'gzip' ? zlib.createGunzip() : + zlib.createInflateRaw()) + } +} \ No newline at end of file diff --git a/packages/broadway/src/tests/main.test.ts b/packages/broadway/src/tests/main.test.ts new file mode 100644 index 00000000..4ef7ae35 --- /dev/null +++ b/packages/broadway/src/tests/main.test.ts @@ -0,0 +1,31 @@ +import { test, expect, describe } from "bun:test" +import { ClapProject, serializeClap } from "@aitube/clap" + +import { parseScriptToClap, readPlainText } from ".." + +// hack for Bun +require("./bun-shims.js") + +describe("main demo", async () => { + test("parseScriptToClap", async () => { + const scriptName = "Afterglow v10 X Rewrite Bryan E. Harris 2023" + const inputScriptFilePath = `./samples/scripts/${scriptName}.txt` + const outputScriptFilePath = `./samples/claps/${scriptName}.clap` + + const script = await readPlainText(inputScriptFilePath) + + const clap: ClapProject = await parseScriptToClap(script) + + expect(clap.segments.length).toBe(3010) + + const blob = await serializeClap(clap) + + await Bun.write(outputScriptFilePath, blob) + }, + + // parsing a script will be slow the first time, as we need to download a dataset + // example: + // first time (need to download the dataset): [7.40s] + // second time (with the dataset cached): [839.00ms] + 30000) +}) \ No newline at end of file diff --git a/packages/broadway/src/types.ts b/packages/broadway/src/types.ts new file mode 100644 index 00000000..2f137a86 --- /dev/null +++ b/packages/broadway/src/types.ts @@ -0,0 +1,154 @@ +import { ScreenplaySequenceType } from "@/constants/screenplaySequences" +import { ClapSegmentCategory } from "@aitube/clap" +import { SegmentColor } from "./constants/colors" + +export type NamedEntity = { + label: string + aliases: { + en: string[] + } + prompts: Omit< + Record, + "splat" | "interface" | "event" | "phenomenon" | "mesh" | "depth" | "video" | "storyboard" | "generic" + > +} + +export type LocationEntity = NamedEntity | { + type: "INDOOR" | "OUTDOOR" +} + +export type NamedEntityPosition = { + sentence: number + word: number + begin: number + end: number +} + +export type NamedEntityResult = { + ngram: string + value: NamedEntity + score: number + position: NamedEntityPosition +} + +export type NamedEntityParser = (input: string) => Promise + +export type SimpleNamedEntityParser = (inputs?: string[], defaultValues?: string[], removeDuplicates?: boolean) => Promise + +export type SimpleOccurrencesCounter = (input: string, minimumOccurrences: number) => Promise> + +export interface ClapSegmentCategorySettings { + id: ClapSegmentCategory // eg. "country" + title: string // eg. Country + description: string // description in one sentence + color: SegmentColor // base color name, in lowercase +} + +export type MovieScriptMeta = { + fileName: string + title: string +} +export type MovieScript = { + meta: MovieScriptMeta + content: string | Blob +} + +export type SceneEvent = { + id: string + type: "description" | "dialogue" | "action" + character?: string + description: string + behavior: string + startAtLine: number + endAtLine: number +} + +export type Scene = { + id: string + scene: string + line: string + rawLine: string + sequenceFullText: string + sequenceStartAtLine: number + sequenceEndAtLine: number + startAtLine: number + endAtLine: number + events: SceneEvent[] +} + +export type MergedLine = { + rawLine: string + trimmedLine: string + startAtLine: number + endAtLine: number +} + +export type ScreenplaySequence = { + id: string + location: string[] + type: ScreenplaySequenceType + time: string + transition: string + fullText: string + startAtLine: number + endAtLine: number + scenes: Scene[] +} + +export type Screenplay = { + fullText: string + sequences: ScreenplaySequence[] +} + +export type RenderedSceneStatus = +| "pending" // for retro-compatibility only, but this is deprecated +| "to_generate" +| "to_interpolate" +| "to_upscale" +| "completed" +| "error" + +export interface ImageSegment { + id: number + box: number[] + color: number[] + label: string + score: number +} + +export type RenderedScene = { + renderId: string + status: RenderedSceneStatus + assetUrl: string + durationInMs: number + alt: string + error: string + maskUrl: string + segments: ImageSegment[] +} + + +// --- what is below is only used during analysis, but I think we this is obsolete --- + +export type AssetType = + | "Direction" + | "Image" + | "Video" + | "Description" // eg. "H.M.S. Dauntless" -> "A pirate ship made of wod, with sails.." + +export type AssetCategory = + | "character" + | "location" + | "unknown" + + +export type TemporaryAssetData = { + id: string // unique identifier of the assets (UUID) + type: AssetType + category: AssetCategory + label: string // the asset name (eg. in the script) + content: string // url to the resource, or content string + occurrences: number // how many times we see this asset + sequences: ScreenplaySequence[] + predictedPrompt: string +} \ No newline at end of file diff --git a/packages/broadway/src/utils/cleanUTF8Characters.ts b/packages/broadway/src/utils/cleanUTF8Characters.ts new file mode 100644 index 00000000..d349ba86 --- /dev/null +++ b/packages/broadway/src/utils/cleanUTF8Characters.ts @@ -0,0 +1,3 @@ +export function cleanUTF8Characters(input: string): string { + return input.replaceAll("–", "-").replaceAll(" ", "") +} \ No newline at end of file diff --git a/packages/broadway/src/utils/deduplicate.ts b/packages/broadway/src/utils/deduplicate.ts new file mode 100644 index 00000000..93d21b85 --- /dev/null +++ b/packages/broadway/src/utils/deduplicate.ts @@ -0,0 +1,3 @@ +export function deduplicate(items: string[]): string[] { + return Object.keys(items.reduce((acc, item) => ({ ...acc, [item]: item }), {})) +} \ No newline at end of file diff --git a/packages/broadway/src/utils/getEntities.ts b/packages/broadway/src/utils/getEntities.ts new file mode 100644 index 00000000..41977cfb --- /dev/null +++ b/packages/broadway/src/utils/getEntities.ts @@ -0,0 +1,117 @@ +import { deduplicate } from "@/utils/deduplicate" + +/** + * Return uppercase entities + * + * Note: + * entities might be things like "TED'S CAR" or "JOHN'S VOICE (V.O.)" + * + * @param input + * @returns + */ +export function getEntities(input?: string | string[]): string[] { + const text = Array.isArray(input) ? input.join(": ") : input + let result: string[] = []; + let sentences = `${text || ""}`.split(":").join(".") + // .split("'").join(".") + .split(","); + // console.log("sentences:", sentences) + for (let i = 0; i < sentences.length; i++) { + + // let's make sure we remove all those empty spaces + let sentence = sentences[i].replaceAll(/\r?\n/gi, " ").replaceAll(/\s+/gi, " ").trim(); + + if (sentence === sentence.toUpperCase()) { + result.push(sentence); + } + } + + result = result.filter(x => x) + + /* + console.log("getEntities: ", { + input, + text, + result, + sentences, + }) + */ + const rawEntities = result.map(entity => { + + // first of all, to make pattern patchign easier we add space + // also we normalize the entity to uppercase + let tmp = ` ${entity} `.toUpperCase() + + // first we need to eliminate everything which is in parenthesis + tmp = tmp.split("(").shift() || tmp + + // something seems wrong + if (tmp.endsWith(" OF ") || tmp.endsWith(" THE ")) { + return "" + } + + tmp = tmp + // common issue: the "MR" is is-typed" + .replaceAll(" MH. ", " MR. ") + .replaceAll(" MH ", " MR ") + + /* + voice over - let keep this enumeration for future use, but not here + + .replaceAll(" (CONT.D) ", "") + .replaceAll(" (O.S.) ", "") + .replaceAll(" ( O.S.) ", "") + .replaceAll(" (O.S. ) ", "") + .replaceAll(" (OS) ", "") + .replaceAll(" ( OS) ", "") + .replaceAll(" (OS ) ", "") + .replaceAll(" (V.O.) ", "") + .replaceAll(" ( V.O.) ", "") + .replaceAll(" (V. O.) ", "") + .replaceAll(" (V. O. ) ", "") + .replaceAll(" (V.O. ) ", "") + .replaceAll(" (VO) ", "") + .replaceAll(" ( VO) ", "") + .replaceAll(" (VO ) ", "") + .replaceAll("'S VOICE ", "") + .replaceAll(".S VOICE ", "") + .replaceAll(" VOICE ", "") + */ + + // do we still need those? + tmp = tmp + .replaceAll(" MOVING CLOSE SHOT ", "") + .replaceAll(" MED. CLOSE SHOT ", "") + .replaceAll(" MED. SHOT ", "") + .replaceAll(" MOVING SHOT ", "") + .replaceAll(" MEDIUM SHOT ", "") + .replaceAll(" CLOSE SHOT ", "") + .replaceAll(" FULL SHOT ", "") + .replaceAll(" LONG SHOT ", "") + + .replaceAll(" MOVING CLOSE VIEW ", "") + .replaceAll(" MED. CLOSE VIEW ", "") + .replaceAll(" MED. VIEW ", "") + .replaceAll(" MOVING VIEW ", "") + .replaceAll(" CLOSE VIEW ", "") + .replaceAll(" FULL VIEW ", "") + + tmp = tmp.trim() + + if (tmp.endsWith(" -")) { + tmp = tmp.slice(0, tmp.length - 2) + } + if (tmp.endsWith(".S")) { + tmp = tmp.slice(0, tmp.length - 2) + } + if (tmp.endsWith(".")) { + tmp = tmp.slice(0, tmp.length - 1) + } + tmp = tmp.trim() + return tmp + }).filter(entity => entity.length > 1) + + + // finally we need to deduplicate entities + return deduplicate(rawEntities) +} \ No newline at end of file diff --git a/packages/broadway/src/utils/getRandomDirectory.ts b/packages/broadway/src/utils/getRandomDirectory.ts new file mode 100644 index 00000000..49c0c3fc --- /dev/null +++ b/packages/broadway/src/utils/getRandomDirectory.ts @@ -0,0 +1,9 @@ +import { UUID } from "@aitube/clap" + +import { tmpdir } from "node:os" +import { join } from "node:path" +import { mkdtemp } from "node:fs/promises" + +export async function getRandomDirectory(): Promise { + return mkdtemp(join(tmpdir(), UUID())) +} \ No newline at end of file diff --git a/packages/broadway/src/utils/index.ts b/packages/broadway/src/utils/index.ts new file mode 100644 index 00000000..0e820d73 --- /dev/null +++ b/packages/broadway/src/utils/index.ts @@ -0,0 +1,10 @@ +export { cleanUTF8Characters } from "./cleanUTF8Characters" +export { deduplicate } from "./deduplicate" +export { getEntities } from "./getEntities" +export { getRandomDirectory } from "./getRandomDirectory" +export { isAllCaps } from "./isAllCaps" +export { onlyContainsStrangeNumber } from "./onlyContainsStrangeNumber" +export { pick } from "./pick" +export { readLocalOrRemotePlainText } from "./readLocalOrRemotePlainText" +export { readPlainText } from "./readPlainText" +export { sleep } from "./sleep" diff --git a/packages/broadway/src/utils/isAllCaps.ts b/packages/broadway/src/utils/isAllCaps.ts new file mode 100644 index 00000000..3ccdd5b2 --- /dev/null +++ b/packages/broadway/src/utils/isAllCaps.ts @@ -0,0 +1,3 @@ +export function isAllCaps(line: string): boolean { + return line === line.toUpperCase() +} \ No newline at end of file diff --git a/packages/broadway/src/utils/onlyContainsStrangeNumber.ts b/packages/broadway/src/utils/onlyContainsStrangeNumber.ts new file mode 100644 index 00000000..924366e2 --- /dev/null +++ b/packages/broadway/src/utils/onlyContainsStrangeNumber.ts @@ -0,0 +1,5 @@ +// used to detect anomalies such as lines with only "3." "42." in it, +// possibly indicating a chapter or something +export function onlyContainsStrangeNumber(text: string) { + return text.match(/\S*\d+\.\S*/gi) +} \ No newline at end of file diff --git a/packages/broadway/src/utils/pick.ts b/packages/broadway/src/utils/pick.ts new file mode 100644 index 00000000..78a70f8b --- /dev/null +++ b/packages/broadway/src/utils/pick.ts @@ -0,0 +1,3 @@ +export function pick(items: T[]) { + return items[Math.floor(Math.random()*items.length)] +} diff --git a/packages/broadway/src/utils/readLocalOrRemotePlainText.ts b/packages/broadway/src/utils/readLocalOrRemotePlainText.ts new file mode 100644 index 00000000..7f81325f --- /dev/null +++ b/packages/broadway/src/utils/readLocalOrRemotePlainText.ts @@ -0,0 +1,28 @@ +import { readPlainText } from "./readPlainText" + +export async function readLocalOrRemotePlainText(input: string): Promise { + + if (input.startsWith("https://") || input.startsWith("http://")) { + try { + const res = await fetch(input) + return res.text() + } catch (err) { + return input + } + } + + // (probably) too long to be a filepath + if (input.length > 4096) { + return input + } + + if (input.endsWith(".txt") || input.endsWith(".md")) { + try { + return readPlainText(input) + } catch (err) { + return input + } + } + + return input +} \ No newline at end of file diff --git a/packages/broadway/src/utils/readPlainText.ts b/packages/broadway/src/utils/readPlainText.ts new file mode 100644 index 00000000..6b3d5901 --- /dev/null +++ b/packages/broadway/src/utils/readPlainText.ts @@ -0,0 +1,13 @@ +import { readFile } from "node:fs/promises" + +export async function readPlainText(filePath: string): Promise { + try { + const plainText = await readFile(filePath, "utf-8") + + return plainText + } catch (error) { + // Handle errors (e.g., file not found, no permissions, etc.) + console.error(error) + throw error + } +} diff --git a/packages/broadway/src/utils/sleep.ts b/packages/broadway/src/utils/sleep.ts new file mode 100644 index 00000000..2885c6e7 --- /dev/null +++ b/packages/broadway/src/utils/sleep.ts @@ -0,0 +1,6 @@ +export const sleep = async (durationInMs: number) => + new Promise((resolve) => { + setTimeout(() => { + resolve(true) + }, durationInMs) + }) \ No newline at end of file diff --git a/packages/broadway/tsconfig.json b/packages/broadway/tsconfig.json new file mode 100644 index 00000000..ab7cc3ed --- /dev/null +++ b/packages/broadway/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/broadway/tsconfig.types.json b/packages/broadway/tsconfig.types.json new file mode 100644 index 00000000..75cb8c17 --- /dev/null +++ b/packages/broadway/tsconfig.types.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts", + "src/tests/bun-shims.js" + ] +} From a789e80fbb261f8c1aba911650addcda10fea7c3 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 19 May 2024 16:06:27 +0200 Subject: [PATCH 054/346] update to improve compatiblity --- packages/broadway/package.json | 2 +- ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 152638 -> 152670 bytes .../src/analysis/loadAgeAndGenderDataset.ts | 44 +++++++++--------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index c8fb97fe..f0310aa7 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap index 7a0a2fc2d49b8748ac553feb45ebae4f601fc10d..a6da6e860c5fc957ac9b85c77978075072fedc8d 100644 GIT binary patch literal 152670 zcmV){Kz+X-iwFP!000001MI!sa$85T?|ILsKNdM=%Oh#; z6CKkN6ZL6wn<6y?Ww*}Nd5F20*E>%#nV_(^C@q5v6l{tVdhd3V01OcIuaC@M<%e4I z^NZK%@=uF$n%*dVuvnbEeVyCI^ZxAY^5pWQE&sHzZuIcW($3_;@k?K}pI*1KOL?gV zeV`U6^-l}L5L!S`Dfgl~gg?FT%MVXa7Z)c#9bYaN7j4-tera`)-z_eW+v4cQ#qs%RZ5RCd z^NSPyyVBJgo~E<9Ea^>?PkMW?di3b*dwy@!TE5P&C-w69PYcin`M2XH@BgQT3x4&d z_4M}i@;^^%JOBQ?w$t~2QTzAhMf&l4$wT!^`|;xZ^&9?I{?GqQ{`7Lu+S!}a^zQvj zPnO@EpTGIjqNmekTm61?cG)gck$-jl@YUGGLMgWBRI3yf8t+tWy(u!Kb&~+0M1F^o zF56G%7yJRI=VkSMWI%abergv#q}TkWfBy5U#j9uEeEY-m@1Fnd=-JD~pPwJT_{)pu z&%c+^Oj*9i#@Bo-NqT#Ee17r%m&;?G0%z&u^gk}vBeHCbzX2F@L8Cz#%9GdWr(tle z#zG!>dH(jIv{&!m@E`i@`yXHZbN$4#v!71R+W4hMb@=ppa(?5jR*y`*)#{1$Tm6_W zPTPfg_3GvNnd`UwiJvzz$A4;PJa7KAIM4sp$|XN=(SBNe@t;o5b2^pRzIoHqMOw|l zv-Xy?KYcHmE8w&ZUKI;TVQpT;#M8ZpWPEnMdTVb;R*sWsznZ5vG&}tMpV#6XzJB+i z3j7eyokd#o_Bx%m`I1l!(U7I^FeI^YB+2ky*OKs1U7VD3wo#OrT=CIXrM=~KRCpaF z8=K0gYl7Z<(Kki;t#$P3`L!ggpYOUZ9C`>kpnn(|eDbm|ShaDbDBqKNe+sx7m7}U{ z1}G(&dCTJOhey{M{5_p~C;~rpwJf$;6llG5XdOHZJwT82xXX$#ygTt8&=ocT>&$KHA7efK@v$ENSnILnHf525wb4EdK|Xzt;w>n~n!V}?*iJH7RIa|O z+!MOqA)4ssDe~gk57&ykXlEZP!VleHg#e)UKJtGah9aN5L{g#VwIdZ;BZV4KCE(*D zCeu!5WHUX%)5U4v< zQ8qYR*_okaRP5SU2$+kfJL&b?GJT3Vnjm`8{!6jY_?Q9X6Yp=9?K1Y-y~*$A3Ii-yQzt*$<0vpMU>s@%*oUJ^JR^=xDn2g?AUvSj($R zKM)t^lf`RLvhOCT0v`FSsw`e@peTEUMy;~-FiX6@{>Q8TcyaXd)zLSL?~eZS=!d^8 zZbE|JeE!aWAP~6dVtgP6*C$I=qA8FKs!UxgtR<+FEpLN?H2MgR^t^5Go1<6%l+pj| ztLHyn3-rOGpCF4P=Ug;jh%6SJsa`ywmRJ^cJ;a(I#lQI+D;ZPDELmRu$M@eqdm$U! zkB2W_egAB1_f0-`cZp&M+OQY*g-DbumYR}N*?|#;z-LvXtPDZTI(F(GoKU}MkbnQ| z<;%mrjgF%02X3hG{^2_rjc53K#Dz8U<-n+JRd`xiV_Za%t@dGvWBezJN#QA<~4}Aae;m;4}vMX_^)!>KafrB)14yTzye`XUV~TIpsTE*sgkNGyrEHXVU|GRnZA7X z-CxyTUR;^Y-yD8`7bc#)vrLiqHnywHmtwqu=I@Gt$|Y~vGO#QY=&INaY|abJ&NEM* zZ@xP`dNEo(-<+nCi}s-wSC8K9+CjmchVZJc6%w5eoMW?$9B z)V;B;&9vKI9=Fho!Ej66z56v_vfSA>c5|VbX(02-Axqh0+844fm}Q6;I_J<@yU_Uo01e-BQS@& zGM0>PEt%lv!JL+G;_!!Wj$VHA{Mz~a@!5-)KR)~B)zN>BHo94_z59XWT=eX& zK9H65>DS$mipyA)jg1!vxAQzy0&!H~*NDX8OsyisU_NO<&A4 zwMTnkl`5OgJyId(jH5I&vghb;i$6d6;kTlDrk}mL2_1MkMF(Gsp=ON*w#Ax?MYw|J zpNI+yW`N#$1l?y+(si5_ub3ZyeEwo&6ihsGL!S?yzY`O3hNqi$59JnO2Ny*)CEGL> z_I{A9IOQ-1Y-Ic$zI*=9XQRdR!J{8- zee37$7Ez*!4=eppBIS0ltRzdtR#f<;mr{;TtR^y;XiIsi(r;m*DLTuHdGmh!UZ4MR(yr&j`q%Tfmv7!)UJd5@6E9XnbNz{z>GCcAg_r05HxF97 z;J;ADX1Q#a*Arp&>tAjpt-{qeT0JwRS-EKZR`t*PU3r?VzG^+W`M}j*_qTL%b~R$} zGYTLYK5YnxOV$!nGf6qyMGT87x{j)v(lC1y<4W=OVwk&#vApE}$>-^!?pP6i=abXZ z4|EwG9ILZh8xKGoh?W2xVO;x0x`kp`lmdZ$qujJg6q~9Vupx$C-Ds`YyUFuzwT5@3 zOg(vh`fhQ0a`|+ze7k(p&X%peJ$>3$yKJxD zoL{7ich{os?ES{`;j;bv@*zwIieQWl(XCIq7F&qKYZN0-hh{)g3P#y(TdkccIlP_@ zc$eugvSD^KBR)Az{Q)XxH1D(I0?|6=2txyQoK;2g3PaY4OpPj+mOMLfow~hN&V3%r z9i1)tSi4qf`27JY0@iy#jUlYf5a&z?rYi%Ltw#2g1waK^OOC|=Oe<9TUJ-vMMWo2Y z$=Of4JohfnuHJAs^VSbML`{O#fvnf?UXxILu-RAza;1SbgG#SCzw6uAizOdIBUNrZ_yCph4!qUIn)UWoB0^<3imVg#l3AX4+2j;jO}!;& zM~j8-B8-$u+2!W->bNZ~&d*=7-Ei94&x>?c7xn!0$(f9Z)RQU4{K~d^{HIeM!l#S; z_P_u4wp{#ra(TRX{gz+GZ?_OT;+J-@Tn+p3TI1jC{U6|Taoz<7Ciu0T(zDi%J#xp( zRv}g?59GQ^uCb@CwV_oM>-*^v?=oF>x`?Mu&qrWDx`=_ILA!?f!B_2?QPJzn<5H0~ zSaM1dt6l4+Bt2Tkt1!{6m3jSkc~W+#&3mh#jsC^S+4Az@tyH5*r;GE8a@_d$^pwvL ztv_%N-g^V*Z_n!L%RF5#wL#J0?|iTJ@BTRta{jQ*;$`cKU;3hAl&1d*@76WH9LfH4G4nsrWbT7%38*hlZr+1y?YW@5nZt5 zU=zQYCCDD(%vVSU3(-5bJ_|!8a5`1xYtU>unXD*aRoU5sB|t7V9c)54GZorXoX>Pd z7_g4rPCsm-{Hv=Jy&}&iF}7-WMi9>k&xZ7>5KS6wq7xKn){NMLoSiIZ1PjiQU1Nh5 zpcYC}0MPOY7>gB# z*{J}{v6~u9jhk7{JW=*I=N4JeI4Lo)UMh)|KwcmwOP-|*UFFoes-ZcyqG|1Di_4Tx#cY%!z*1uMDZk`mRsEPByg2!pmlT^H$8TS!v!{!9O$1w9 zVVK1BNWSEM`E_Gw@01OZ<#Ah8*IP%@{DB|&0Ou8ewl0`q%}3{&sg{>}>`fsX!zv+E zW!c!ZwrAd_M>kXxQbN?F=n&k& zM))&JoIU?}H2f#}=zM_n1nLzFAzD>)N(v!rl?@sdi^bjulT9P6J3)VNV*dC&{n;Ws z#PJ&SaqUTZPt^xr(bn+UjZ!x$H5*j5)$(#~A%}jjiT=zIWKVy#xc5hG2+0otJW!fJ za4J>9o=FCjLRUrURGdq}H8P_;cY^-RRA^6sKGPWiynXUP9EXrDK9ZqzT_oB-cpzv+ zx)s&2r@$T)uiVic_XPc!H6!-)XE(S#vfpI=aDV1)Wd}Et=*Ana;h%CZ?9xIqsC%-} zZ>B%@B;KQ2)3*eG~X+mMnYxGtVxG?5Ilxv9+JhUq1Ja z3XBlbP^!wTo`O;hC1(M~k)#v+XO=j-=0D%Ii$#0amQNSIo}AV5Uza?>i&TG+G=s|K z#6@{~a(VHN&5V-HR;)%MbiTe8^6qc&07VB`jaCZEuFD4aQe0;f)FjQKYnN5@#B+cR z5@_CsGKPK=aAub1dpI*Ivceiq9^!hptjQV771*P8>{}Nj0m4D62pBt7FH7=ZBb=Ef z&W_>CG$|1bx>%-@Q$EZDcOIX-`E7V|Ai!hbequh+9@fkc1ku*A_ebk17YJEHmf}$m*!UQ%Y^z$^c*T(RDjJiO)_jceQA(|C zW;HVf+OwL^bV2|+3J}S!JE9ESW|l1VB%PlB^!BDvGPC9JU8Vc#$=}Y;>v|PEU9?}?#k=#f_SLnPUmd>Y zKW@Y89-zWTlh>BFzCmHBKZ}@EE^@0NS^hCdAs}L(pw*f}9K`}pAemVT?~%;BP0>Y% z4%XIRhQy{ITYpe^9iWzM`>eHU3DENP7zswWYzoQDa|nb*{E=(#O*?;c+7_4T^yeE# z+DDH+L=k!Slt4%4t^?B8GNi1U&n%+HuEh~gY1~AwKwc&4SehL zDsWKZ3eSF8K3xFqAl~Ws{D_A*ae~&t20Pr4peI{Hu_~i9xQM(DE zCgu%I%p3Xh_W*5X$TB!XF~s$DOj)jZrLnm-Y?(TrR3^4oYi(8f0z(*I^G@)yd4lW# z+I)p{lsYG2?c9}G5lpP?J5(>ph*JGn8Y{&f(KYa;j-n$b0NPxI_5|%Soe_XB=*TYr zdeM4QOZG0P;vMgzPRf%auiVJilW~n)Xd?(SLD1$+i9JHw&6NdtjL634P|n;3et=Xq zs|#bp#*=AIRo&PwcFyQB3izEsX!oVwV`6B|dK(<#kWkz+RSQ`eKJa)b5Ec2V6+rgQ zfvvWVt|=xE+DuXQ4DA+I-hxJu#$xZID@shdIN&h|(u@;%m#el*+u=|PI+tMtYbF@l zJYDt>?Y5$M@+A?55(zE>VdAZ;>e{3?cT-ue#G?&`Vk@N6=GsN`bh!_T_TSnfT}W~o z|KswU|Ab|EyIii~mipVvxBO^5xoE2(EJ3=yDX zk&sN3dl+w33N0uK$vds1_dOnL;*Rqc#U4D)a&*af2SenJZrMuewDR7v)m7N^%DGfk zYUvqS9zNs`Hgd~T<#nkOkG!+(umB@RDA25Gd3QSQmja9?LlEP+%F3D~sfy*c&Vl@2^c zu3~9nbG@yZlFXuzchTkXQAjeHHwv&rQf!0jlWnS*CXI{O8H>q#rHwJoCg8O*y78Hy zkh3M)j3KvFXOAIwTKYgc)ONULmoj)&OFK*7B@GwD)tsoEU3lw|SNLWOIde|TAX!^Z zi!YKx0tO$+gC6AT)m875E`&U0d$7nM>%k@xIaik3QRLP~;bTIPtc!Kln<4ZyKyArkR>_f; z?GEJb+Ne;Z-7-5MCXMc{Cs5=}VQyuSTgvj-SR{M)Hkg3d_3bfHFIi=9(m_6HMUm|j z>x0QL>u$&8b0<*bOkH-uBDd7;t0&*TyBaBhb+6OK&#g)_*2zz2CtaFCT`o>rdb7&a z;sfjBK)Tx@j125EGSS*vAr#!M%CotU139;K% z`barkVAtCi9)fiOfzDt|ZVDh~b|fmh-vp$(bvj1Zd4nCh-xC~et|#%yAZ|+qA2W!v zAsDb$4;&6-kmlQpAn=~s3L7aHJDdK^d#Ks+=p1b1a5GiB4a9A!(LS~I^O;jDHaRby zw}#xJ5{r&20wg`FrFFA^>q_`vE}4_Kvp@ht6_~=Fz4uuw z*OPPs4brH!Nb^=#DNu2gN0LmDxp|W8$=o)Tdf0-Y>zgeKL6ePa>7X>L4h0k$-kSM5 zt3CO~PmTPNDKs}%qdl7YOy`6nG(0DU5{8yaONO$tTF61|M#U(R`l+&$gy|+wpCWVf zro^7i?Pk~Y0lh@jtmTWnrqDp8Ea`&1I~7~x(@-bF(p9W!WL-^>x%-muF_AfAjmA-j ziE2@Lhw>KNayo@w}q)2=c0tsypMCvp|MlQx|mA5UIMC|Q&$dsOp$mn z!YCSQip$N@kaXioZPuC#Gc9RGA0|r*kJtnA_Rg-UbEHjgvX&T zS&_G-oD7Qw-+UYQp}adl*+aQ`pZ5SKRn)<;2{p7>51ELZ?W(lQbIPD}SLgMK6uR{` z*F0`LGBu^9Dk#F%{Rwzyl8WzES%Z=^RoTePY*9GOHfot{T`xx>pk=xFpXc?#sxT`bC{glrZ!v4LVzwb_zG zh~1Wv=Q70r=S`lSuIb0h0G$rfSQv-ft)ihq^Qsu>sn%0gDR`$c3zi9-X?YBfrWoKn zb#8-4Tk5k#=c{EGL~B%(*|MT)tK_-|Gj9GmMT+K1v?oQM>6BoxJUgIas1F9Eq>?hJ4w2Vx z^Q1C5qb%rFT+=1Mh$2j(qIq*-kBa_4k$rGp8xz(GpPZ@9SRT*VHE+-bRF>9Zh5cS< ztahp1l6-kzB7X^}h>c@Q*EOpl^jswrk4>2>f$3Exc6OD`)$~fdDAOpCWeOC{6l)KP zZoBbb#X1iu%n(d>j=dD0lXO@>r$~|jZRa(_M{5seb9K0x!t6oOtt-YjKE}*-4xUDv zrSqN%Y<6OFas>uPxvsH>lG*1U?Qc_{Xr3~=21S2AJX&pE|KR`Sx0EQY%j0%(v1tE( zbJ3Pd{;=gDEnc7eTZ){eU)$={@58l5mDoP{eIDQ(K=R};3}tG&?nS$pmGi`N0IO&J zL&88xDVTWk^l9XOO!1z1b70SVW)*aa+Ici<7ze2at7B6&dntpIKqVWD>SAW<2I&3h zj(U>!%u{F2dmat%0qeZgCg64GH5S`_P%XnM^g5~7rCqo~vb|LbH=yCf9GWV}X7nEU zY*VEIz+X$k=WWy3Cl#PbZE*A|>Z+BeY<-TEeA?U)bEYJF=rjKkjf`ev)U5;Kq3V{v zc%}Kkl?X7hstV{-O;55C^8+ zYT`pnGGd$bk}^#?6;V*GbZ4py2=_9C&=Mc%oF2;A*XGb!uY$3>0Ro|P z7?Li-i5&@RboZOvXwKAg&u?bs7#IqgHCivWXubB49Xo5Sl(8-@|Ninp-?qH(=*r3}siin%c*qbNf zjv?H>lja|eZ#|$6*I8g_O-r`2FHu_Lz1d5>gCYSw1SvEJ4L1i{t>?(iiL-ST`!AQg zInQ4(>fw^OrV^s(U9sed0^Wk67`p;rtO?pgN243B3Gg;kkv(|ZB6{6v@8Xcmsv|&3 z)$+k5(d*Q`O0`QAGT6{6+dh4BE6v#w?ZMk;Iwe+%*0~{qpww1kvrcJ)S$r0r61HV2 z>eJa2b|u1y$xMK^nNwm9-u^&GhD~4zgEeb23tLDfQ&!n)BZU!2kx8h0V>^PPafUY6 z)4Dg2zXo?lDHpG7an>1LU#54FEp zPM-9&d*uHLtFfYzQ>hqIQpqDUvaS2g6mF(U_d(%S)v}&0UbM3tRkcEtRpq#nv#of|ww1Gqv0kxLN81>pa?_H*rB*q1UWp zmQwbHKqVct$|exhj1=e=1UJ{8*dw@|Hr!!X+~18P0>kJI<^jh4a1!HSo0>^ z+-mY>9F8#s;bzLXV+gk|oAvojDodU$+pt4mTx47)G6AK9lx80YDJf%HEH0x>t1FyGi06X$G1@RHKq+2DVml~m z9ti_cC_A60B^7Icz5iP(+0RsD7M{C{ERPS*vF9Bi_#q@2OURzjH3hY?sAI??tip?e~?MZ{i z7{I{6Mm{%hPRu|zTTY8TpZiUbgT)Bm`ZZW^wX&I&n)0QI$kN~2V^M5)k%bP>#|wXo z&)t{EUj(1?7OWk``4nBVi^eL*Vldapc8zBb#6!vyq!YW_TsLd3T(|SNtq;=2#OHVv zt<*G&FhmijWIah~?JQBm(eO{TDc&lZt~?|mZ?1$tQT;1vX>TqUm&Yf|ag^LYuA<~Nz4QSJ4U&2zZSmGDp*GJ0RIKW{ z1ckmQmC06i{!s3ifvVeF;%cVSyIp>d71$wa8!W`N52$r07DHh-TmpwNTSZ<18p$E{ zSg5(tW$z@go9SVE4D5d2Rrr{JowIzxff?G)=T>~PAuFF)K&(}(7!s&TXew3fFzJKM zyl$R~xAD3yHQMvK&u30a$z|TT%@FIHotMaGt8_CUEiia}CPdX_`{>cL4>HOrn3_{l z)$h#Kb?(1hUzjjd6zmkQn>Q!+yzUQ-Fo{l9y@SEYsj(TBw}-?At@mBAZ7Zz} zbS*s0Ik?frJcaA-OXDvA*Lll+ripQF*|1kbMmqRFmwqvngR~XZ(hwF?@wJ&Yf~!-s zZl+p$T6bFsK<~n+KOzBn_6n^OxJMq1##?2qY!PfkH!!PhQ8^L&>d6?DJ0_+1N7ou^=%cuvDO@*CnESwWN0(Pws_fOB-w2|+B6K&O z{@0U-%H@b%2@gbT0-K7%m@1E@k7L8Yu_pl77&LZB z%c)50>t$&wA={s9glM9w8d7YrC+$Ysll$8z&N?*Y!KV2#ny4A&{8mr{L;su_vTl;{uA6cl?P zh_%;f?I`15YD!JjC^TEQ6!7fUXycnoCG!qNx~UwRQ-Fs5;!0359Xv`Z=Y!FFHsVke z$5iJ7BxNh|t{EDrSbI}}B0CpGX8Ov>{&K}F{lGB>#Vpyl9Bb8dvqAXQOO=klu zN|*=+=ODIDp^t9Nrl8!s88HLcY&j|RQ0_PD!GP5OafmS~h5Z{!Jg{tkvDK3#C@Z4s zIoIHzfVmCI-IvB+0+hojRm_}=!yPub5Uf^gF|*&%fRE8=s|waq0}Vcn5yKReo2l0A zP;To(^ie^%=(RVV2Xn|hE(S@03#1nsdiDjSpo;1`cf+pY&DPCRP;Qp+d5X@>Q)rUT z6>Vdz*{hyFO5DkZOSp3G30?0H`P}^k6|bwz9k)e)d-?XFy@zmXO826jjjGLk_^Jme zuhBMyfY%3EKsH~iBUM0Kg~)3$B3YGuiisWKlGiiOFRKh=~kK8B=>HO4qZ*bKmZ*{A9@F1njzSlRJ4-q ztfjnsHC+WNwe{jlr(2-hyeToKDA{(i;vf-uRjas2&?eL>6(4 zRIP7NOw&rQk`Q_eY(iNhPHEA>n1bU}k}2GFU+Nv5E%~H77$LUzzdt}#jD(+}*Y~4w9>dD2i7v ziE%MVRWi09*}~K%_E5(yRHwMwJYjCH9k-<{S0&)dkUBZiv&(2qG?I%e1 zb4VUA6xhNOe!!TMn9@m&`Y!= zokC;vMPZ@BlZy9-noJ3%S>tX5Y<@ha*3;+aoZ7yH#21V5$U0-K9-K-|(h|~>(rtwV z*q=;R;5=`mA(D$VjJ%f#k~dS4J;|F-Z47FZ8_IQw9X`8au52E+(iEnWR8CH-UaH5K zJ?Sz!P$xj%Y>DsQp(XN-Riy=3yt@0?rJesmfn6;{!_~0%O18mNDojE7= zByTq<%WPNiwrkdP2BHI_!9)d)kbPgB6(I)2CKCdgZk!#JGn+tp_a@(CLV1#c$D6Gk zn)URWn)CeS3-7lI1NK#)9;G{*zLkJN97P&TpuD-V>`~t4@;j0Y$)@8_k<+x)Vz$Z! zUMZ^^V2ZV?jJ}(M*0K?Ku!-c&)MZcdW(F`uV<`-|bigiuVEY7&Tn1a-)^fB>HL9L% zNOl_Q=q#E5c{A0y50Llgx0j2zXSw}+cK$0ndcxT*kK5~2&xiF0E-rr+`gYNHUH{xz z-~ahP{@-s-(+NKywC-iPNXM(R*Tv%1aa$ap^S8K2Z;shwsVB=fr|F&ehy8N-l%@Zr zrIpXPGFF$1^S=1zyThXw&#vC;@WtV`PvtK-xmdklZOfCN&X!l%&}oZ1(O3NelI~f_rAMRIdeq}N zG%OR`7n`-bD#RrBd>@ZrMLZG_@BJ-i4$(r1$CTItb5?Jyw^+p@?e#km&As3IT zgXG#LX$j{_P|jA93cJ$2Zm!WcQ<7Q4@-DhOK4OVvLUf2jas5&xiJO%7Qbw`lta5Mc z5mXneF|NkCx#{g}i8d3(Il3y&9>D(W?aG_^Qa5szT4j=9YDh zBNu)OSk9XgGlD^b$MQ!C|$)o#p zaeV%3`=wp5agi=APTF$uYm-&I$nD+vSzTmy+RoZ?DVb;T$G@8hK-|rnKETN%E#o3t zKR6*!v}Z@qC@9G0OtL{mAx7Qnv)y8&L`>LhDs_V+V{;PV&2&IM8Q^Ux;o}B)&e&)P)`uv6H4Bx8k*xL7qm87h z9($G6xtM%FSI3Fpcc(A60lY0m+5^0MjAM;HI3MlMpDb4w5?Mai6H8ZfR?#A;Mn(c$ zb4EW(nwpwIQxziZ)=f6PV1Vb?Hm2Z)0P#Y(f+8m) zo+NvKw}nPgBRiHupABDiXr+S+u1LmI;H|e(Q~_emT4z2-H}}Pztzb zQ(G_FTn#otWnAr23x(Kq3gS9xTXf99=n>SNB6#zr#Gc^oCbms#Ht={1f!@5eO7gdA za-WTvic}e64cQ`2QW2@;TS5-+OTNcM@JM?W#a!1m0@I^0JODbgAK9`bK~_*zr<7U` zwYd=|ngVz;RoMf)&6}NZY!*7Vj=6`-g8_lRJ!y6$qiZTkrS{a#sz^Jeaf;y-zniDa zp5M){$rmIo!mJ~x(6z<}ycEyxymFuhl^sY0b_X3DG@CZpBuP8*k~pD#^<7nPo~tG4EoV&ImP$p z&8|J)n@3-x7IoIUbL@uyV^QfG4V$92DXQp{OEH%QJ=HL3c|6JYX1XVPzPD2l5Q8+x zS;qu~6sbA#3IL@Ei&P|*KEe&l#g z0lv8!?E&BCIw!~>kPUHE3&75Qjht_uO83F}UafLo+rQsjwB>SDwl7_Xo!KtVo-W?COG%2oXe&&2d~$Xv z$+PJVzxbH#6n^!VfVII{r0 z(lo+GCn*sqRRDYB?HQ9Q4zlSvveP-9IukQzsZIW*)yXI7^4jLb7IgO(xr-0pDi8cefE!EiryItOW5Fe`u zL+gPYvu>#bW%!Vj7zn4R5!*CuNb$ne;Pc3mngVw7=EMx*v*on-5`i6=XaV#PV-UJ` z^8d=nr6&UNri;*3NrA{TNrxESTut%1`%>>Q@j61!{s~|hcmw$i0aPzxRie169Bg9? zrBLyOAdh=NPT{(ls@#t2wmt|S7p}9OkGn7geKgk~)uL504#jG$DuG93ZEgd>11rA|HsZM&;O5wHct46)e1~lu!O8&2Yb3vYmgG{`%|j3H$XwU5MwF zc?iY5XG`Naou0NcDR;L#FDFf6HqOp3Uf<~H@%MBhDYc*ceh+ZYI5M7MutN~E4^{dt ztK=k~!1$oDVHL1;-+IlY?I@gU3fIk>GCN(?j~3Ta&|dnEtsReA*cQ>erh-9U(AlsH zLKT&XfS5u_CEZpHZ>Hz*5w824m-A!Bb-)5jhU3s~iDj*&x2Pa?t+4yZzJdp(DfjG* z)wPYO>)ol#ZM<$vk@mrM_gOOod17c9s?I0iXj-HUAF1VAHkVGyFXQD zySoJnSsy(6kn7M?SHL^Ss47T0ZI*UL-XxW~%X!t#b6iehg5Av&=67OukF9|Rq6Tln zdfB+vy`*9(Yl9p{F{enqUkJIJiS2i_S&Ge@6cwMlu@%l|VlQMUw?Wa`Uy>H!d`29bhE{@y9;+ON2vI?q8 z_1z-By}SzVNN0<;qWbAONr-K)&o4g+&|C4oPxxzAf5iL0NRo2z^5;BIUI@lmD; z$8WGD%7(6bs!2+b@SKS;$*&L-`pCxC!6slhbHeU{;k@`h?M&cpV@;ZB&Y5=@9t{w8 zNAm$}0&gd!>D0-#0wZ;%fZ<$!XAcZ_8C+nab@sY_Mh~t8i#(P^TGY^Lk$IzBL7!~X zUe_`Ay*usM1H(rH4COX3pjqz(t?=Bj)Rk?)@;>c&3ia4kk&u3#RR~5OY~+Pg^&4^P z?is;KR|vV2Y!V`Bcm^emPFZchl_bqr!oj2Dg~11HgBd&|J|Ru&kd$|k4e{P&gKSL^ zhFqo1UW}uwwkcdVPmx);@Gi1EK3r&gaAM%B!-5(RWg8mrZ>dS?y{uxD!qh%nG_|CL zx6s155^bi1TdK3Cg*%)Q(mVyj5Gh8+HU6xuf|FY1B?Xmr^~xu#fVElPbPqPt!g*6- z25#DNR(y%HP%4FMc0%+JxKt4|vOU}+xVlBj{VbqJ*XROd4{3BoGX)FpOT9-03!RS! zeHbbrBtYs-chy%_ECXA*IU8aNC1qcn0h2~<$`mY|Da-A!aO;EcF~LHz;EhKd&cA|~ zy=}@A9i;RYTvetB0c!;|P;?$Gmnl{_PnTO+;kK$g?l`}wF=`9fb$2xHTPaH4gUDXK z&|G%6jk3La-4kg&j+32&hVx|FNnY-jQhxR1=n9|lpDe`gSYqGJAP^vV31I z@2hK-zglJBZu2ibz*!)OARSG0QfwxfrKTy)-*|Te|s1o@fNR(9eykM)AyG-6pT^e1wOmeuHp2R2T*>0)e7`r03l=Sm`u_lG)mjJ$B=u*bb)OhT-O^cpHY>QlovI?H`_@ZCDiaZU{R{ z8nw$-d0iU&9Z5=jg{ml7lc*)bza4C(Z&TG3aqHF>UoL$E;)U#^8#>ywT7%?uN?k1! zNeb_au_;ZqT5qckH6LumZ}TMC+5y)siBqMm=YVJ|13cf1Tfw$U@e17$W*_a+& z-Q4+NwnTgU_L)uz>GtM4_;vJ(W{=c%;_Z_?Q+9P~XDgTYRm!RH+=`G@4-g=c3IDUFR2mj0I0iL@Y_sT_W12Ku;Uy=XNFeKA^2o0k4EvlUP_HBS_&$s zh>m@I&7Q}>M*cQWnBR%NJ+fH6NEZ1Eo9ot=?C~XW2c0E_PSVpcYh_$)x#r9s|0wc! z3cJly=RUC8cTHMS@Nb2``q$%R*%e#6`Sib@Jk)45hYqyCunx2#3Mso?+M7q zAx~!4l*v7I$Y_Eo2agh{c{Wzr81lm!fKKtWxf0!y{JNbw zd!Dw-`pm{yZ>$YN`ebl67E-3M>w=+XMRG?WrAE9%vO0`T<0+svZ%)ifpWJR*d<4tB zdH&+X(O;gwIQVUzHhRee6b}t(&z}E!%gwP-*NK$o!BI#_0@-3y(0wH-BARGaDs&2` z-IsQc38x_iD+38bMwDi^z>{(z!27COr6Aju$>t6=>v41DDVjD@l^L0@+o^KO?|pGC z%KFy_sEN^H5;{Lr5(FK4B(0n{j1nrNQu9^0ViNFn=m>8KWSghS?Mbg&8YYhtq!DQw zJq-P08&qQ>Z(+5gbjxW~#i*mQCYvVVF|m&L^At#%r%o!n-Ni<|R-f{F{=`;cWuHx2 zI=o#T^UrKA{L(I#t1*3gm1BCj>I?B}dbgaV`X#>YzSK8TAWn6Psy`4 zUPI!g+%>xxmH%O@OT9*FeH4m1$>`>(b8DvJcKS?{mQ@GlWja}PR!+R*p1k>O__A7R zBLK4z^88_+_WJNl{#Cw(u5GD$csUCL|8o1rgwx9Bb~xMb2ZxIp3ikocrwls41uT~TX)5G>3b+q zkJ9H`di6jtF-FWTnaynqX3mK{?%BnHb^)RbL+Pfj3!vwNFL<`Fcs;WhOS-E-)N5tK z%fT(Y=f1>yOuPp$Xm(G78Inqq?E#$hCAex{N&FL!N{RdowN(5qZ3^bf^7{avr;B|0 zwq3pZ^57=@`S7_1C>MEhY&Y7qF^Qok-u9$$iCy(BV6|F`QtR9|mx?QCbF0yrYW+Sa zNS&UuYcR!wZanh{?0?nRK{vETQjPANwnt`r3mV($3&*;!G!S*?-Uf8r_-*X z&{gBlH|g?tak3P%W0Bu2((8P}?>}BmPp^h*<>{R*(&g*((L1tjlw323f##{RV+^#9@wvwX0He_k;?OzRx=>r_N(U+I zD|a>-bW}k*Q*})VZe&}2JcZV?<>nOHzQX;NOMQYDO~TM<769EqBEMVJ);Cf$_f_@u zpr~0=#gdPKvcqvv-wEn7Q<6RP*}@x%AbaJ|h!9xP>O3XDo7$XjFfJ-Q0exmpi9Ph$ zMSzyIyqd2`d-lGEAYsXsH(p-amXATw!Wq1$V4B0t(C6O7dsNVeG&nZNVC{Z19*mG| zQohP9bPY|#lA6*cQ_Ntj@gw(R0{YCAWgq3UK@@VDcpc~=G(g)D(5Z^Lu}>%^kxEGl ze6G|rXt$vaQ}A!X*TpLwV`azHVl zrLewM?6T&vR8GXqJ0J1Tq*km-XnYR5&eAO{B4?_&2QPDSQqfv=jrE$E+UC7=>?*fz zcvx5sMZp=>F}v(TD6!lUe=}2^ef-V5&wGG#3N%^kaVQUfHIu4x6uXWoNtm4*O8W%4Wu@{S!h zhu_SUWDjDt2$ACNNx);VUN${O(v{t{q=Bs+3AG3fmC+Ugk+-34E*?HxqdkcET;~Kj z$HJTI@L0;$q{@TeD{EnGQN+%oxb-@bPvG6CqSX|MnKvi)BxVN`&1pv%5QqDSk}@_@ z4v>$*nq|P)zA_MN%+ACBqxC!mV(v@3M+IWo{6IbnX}!&s-V(Z;RPxrcdnZSsTn1N@ zA=-v6rdvSFOj-6IW`ih!f;QKe^S!v1yj1pz60sdCsN@QZl4EYw8;4{2WD3O06J-x# z=5;{`?6T8fJqG8C0Yqg@3#-51t6uDi@o#smBz{C@W%$!^~50x>e-wtK(NsULCi^oAXm?s3=)*uh}QR z6u+7WgCD0B^&dyKj;_zrWt^>bP{?p#-A}I7V2VTQ54i|hbRNy7U1L0BgxD>+%3|JK$ zrI4!a){P4HPt`-3>nMKQqw)7$#gDnHmC-&%Z>%3me6w#5nr^BE>6O9;kfKgTu@?cF zbo4EZssX~?narNN&ilLvIH|zsi0rYLb>xObx&=0?RjH2c=n~nEhGdnEYzlO*L%A`j zCg#*ssWi8B-S{sTy&A8r2{c?WTZ$>U9+YdHx6F=>712B}r52xZjJl4ln5S0xJVo~8 zb(>-zID+O=;Pt+=dsN`nq0{m`d0jE;Xs8CBuT#_Ul9b0zVX7Zz3;VJGq zQi#qafZX;yO>5J#pP-#vxdU=&zI7 zTy#{tQQlW+j={s3*kxZeX8>1->bQyD6mXp<;(Y+uSI6z$R~Kz@c7D0|ueZxfR^j|~ zdF7R#my>q+?thnZV(-{Ae0y3Kxv?MrOFDg<@@bP-9jsjPw->)O_9N2Sd(>K67pwC| z|A5up_1Rg>L7~xjnj_ zB~Jt!!4K!HE$mVnHbt#9ysZOklw#1z)zYB(no1sR>yzkqrl+|_x4X1tiFbAMdd&+; zZP6Msk}gH7Jo?q7hC1!ggxt*$m=(cW9P$k3ZB-qO%D!u5VzRl_#IwB~JW6s4 zCP?my8#ZfClqs@vl)YSo_NvG*OEvOGp|Yox=Rk82Y< zTD0AFFQr}t(^XX2md>YY_X%4mX`J&vMQ-P6w3*y)DbJqV?y?EqDyuK(b({+Z2f6Sh za9ZX>F-^s)vuc?6MWttiTe6qu&50TKZ_8=%<)K@HU>ys#PDiRFp=J`JRGoAj@j*#{ zH39ITT{3`uq}>#{y)W$^6}k-ueF(hUu0zM5qBVR9QetheYt1_>`x3p_M#l7hqlESp zyPYY^?d*0-Sso9&1q{Y{whM=SF4`Cpi4-JwiFmD4B4wd_YTa2J*G!s%xAR1~72a-Z zn>@;x*$}iLypGb!*4hFU6h+8VI5j8=ERm5x$~koHNA~;_!JVhh6v4%+jVn^ZMVePc zbc$S!%2Cxe1F%(OK0&{;^ExW~_~h@x=j5@6%Fxh}Ll5g^mDp-XDX?apEe9lNH|VqD z!E{DP=_Q^w*NK}c+)mfjVb7WOA- zHa_EZ)LbEIHFl-FI0e+Aik+g;rR7vnhwg7-FLO28vzO0wPVmO)r3CX(>ZM`r){!h$ zDdP&j&IupSRyX!YBA?}Tw3AMumw8iSk6w0B3`_dh`7pFguf}CpbX6ctJ+bq~OU<)w z)rvHGusMv|e@wBL`x5U_v6mQ4V4IBA)(H=)iM|z;v9rm`2P3a8?^Fa|e6}vwc1zsc zOj-8q<+nu%kv$Ouc3>~o2j0|zDzSE9%t0k9#4=O&we)DlJ?W>|%REu`>}6g8V=xx1 z4QqKKwbX*ws#Y7>P1L-4e369ZkoX*Ol;h|enu0I$5#eKSGp(vdUAC6)sh|Wv-YdtpQnp|q?0Efs`;C* zdVul*@xF;<1{))44<^UP1MB24>+EW~mU;8+mW(Yf_sR2lR0W%H2W8M0DEkyYwD)bXsHueF$MFx-WOA!9-=8 zgs5qh7|^IyGkhk-o;uyg55GG+*)b#C_tLn}z#5C%+c-q3{{QT~*>+qYLOye_V zqGZt`8r=Ct>=yAh$!btR_KkdPDur$IQ4s*yi<%E2TUgeElB`Vh0F5+iV`&;fmYnS_ zwC%V|4m_$%vThs~rc`^kAsCuB-(O&&!y2tj^i#D7uL-0Bz^<0d1YXJLIRrJBl*?3= zBxmz^oT0Z`bPcnbj0Gq-2U_+3G>udD1}O@8p580v_VmRCn);sqT*kF;StJY0~q#E z!Y(}Y##j^CG3l*HE+@!1hLBW19TV_!YV&zt3v6^yrIn3-be;+ehrv&L#)GjXvtDF; zP!0(AaX?W%+MZ19@tsX?0getT_YiROyX%X$lW5P+E^n)NuU@uIzBs8b_&@FH7xofa zz4G$xoPWSK+Zx`R@?Q?$FH>(D&dZ}Au{$087VuzrF_p;(u_%2qlh8E}fc z0Tm)N=(SebGe0LRH3kg_&(Hac*{caoI>OyfZ{%N@0%=~u7RB|_iUM>+F-YfxWHHR{ zRF)R=m?SHEJs=-dL}H0{sK)3TNk)HXtvUQGo&SVhFJ7$%UvR`52f8PkynmPqIDK`z6q3Wu;-+LbeVFg6@|8E zmWI9G*h_h5MJ<8XK~+}p`kR`dH30(B)Ws1(=eXS~pLna|mC{r$9J*QH{jhQrr{{w` zmbmMfCil%7)&ZnrRFqqMenvLwTx(>f z(#-m@FG1HaiB{R=H}7wAjilWcFa9F);6_w*+0slzRy1 z`sMZ2=9eb1^A-OBEmi(`F2q|reKT*t_{CP#JHPp{PQD2SIr2s`4drOONPROZ6jzk9 zGWv!?JXMmeHfBEH+C1%P35|})y`s@ErY8DCoS>Sw+Lu^VZiT~e>2aAj@|F^%Sc~o@ zrG030FveTa=)GP*unWnt`R+8d)rW-L@WTjE<}GwZK&Xl@kZX+9l|7?x24!3`RF8*} zdTXr)?RK%fE8Ul-+3W3*7i5i&yM3KiKBuyWk}mb&34)fYgp^d0y0teuiNNZhIZ{^!T2~GVJGM}R(#`PdB0wAO9(6M;(cO^rKy_9~dXH`D zB|S9;nhK0#KnQFD)FiJwm8en!>4svOwV1SacNgssn#2HTJJ2dVKS*jZL=0}4o1FNx zGf8)TV8otOY?%*1Z}_QEgpvzDp2aImko2LnJ0?gP4X+?_Qwy=kz6Y3^R83N!LCz>j zNrv)4;FzJ*5N4a~5+of|Wj`c6P?h6>q~N28R_+RRqKLC^p{fFvw>fJ-rg1oBx^>Q$ zXu6+mb4!$TOq9Kp^iap-I7{}?aNK8Z*GzYO@-!gTGisSvp{1ujDd+jTYOE#A2d*s< z(lL4NWmw9A5Ejyw4Ynu$N=dZWP7baZ@1vaWD1=t;L|+^Ak*CPLPkf8aUXqS#p@2a3E*dV!X%RTc`Q4w*+O! zjOAVz^6^qS3^rId-Q0$(n~kw4J`<%pQCCHgb*d?PB+U__p4~?+Le#+^AZ6PA6H?m&@NO820s7lP)+ zKN0(?OVN=OyI#CgYq>t-ja*riz2)rzx|<#AOE$FBuQePz*5vc0bgTzaL^HKJH9EVj zbx_Sfys4d|#v3IWD%!eWyx)_{I3~$T>BfK$xmRk}j>~6crSXTwT;j8gghAY6jELr{ZRJW=oWA z%p_Jy_wm{}iEYVD9RLdDge@gy+;&QlZVDS3-EWG*JDfNiQ@WMq2#!b_1t1eL zy<<&EstSG1O^&^SvvjK^N;js-??ma2w1(UeYRRkLtsEaadna;t*qc-+Iri$Sl*2f1 zHbui8=bm)NF_j(y)_pNgbjyuD-(IJSRwtfTUZ&I2cJ`uOZqmz^>K~qNo_Ah=FHX;Y zVQs$u%lF@Z_0x|}B&>V>?Z0hqKK|;fAAWqg`I2|&zi-S&ZGHy*#jTNi@gMJJ*d6@F z+xOeO`TjS4ghmL`Y}^K%>f~~bxg&yVe7>@&}T zYSA%j?ffpsE86URsuhvr#@A;M_9=T+5jM`P(yj*2mEl^{_^U{b;$L$+8Tk z?^&@*+gLDUUC7L5(JxreQXA5!4@G~CN+^xkUf7}MJ%NoG3j_tWW6Rb#L*dC$qCbv8 zf&J^Le@q~+wRG~dJ}OsJkvtKvywd@aFP@&o??Y5MKJW)phl<8cW56?M zOdR7Vi&`*`i7JzTz-YDAe4d6j^Q@Q1->61+lfMJyS;^mh+JrTc(BEb{XLfr_Vpqyb zOxzMG6jYbrH(nq_`1k-mqL>bvW!dVW5GO1GbQl)`|E4uhNa)lz&53q8tEI#S2?P{lvSz` zROPV4NB)Hi&2GAuc;A>VzwpodatlfCNtVm&vnR7ufV0Obhlwcnj$ulY>`|&5ofNtv z%Td_BLudgpR=l#ZE*tKXpX|tO1dwj)5Xcxgc4dkX0*~npB zlAeJMWn5e`MY1A6X++?_!dF}8wUtZUZOkz4b^RVI6%9svvgE@Q-eG9aqiQy#8;P(- zKK-ht1iZ_ZzOR6JFuwa075ylEemOa-&o=qwV&3fG-A_J3b*v)`2IExyk6>MGykdIr zf;fvxrF8{p0}z_d-#%04!wJbg*mvZu?$EGNHYdL)11@F2Cn-P;Ty0BYSyqC)e zRAhCxzM@I*^a1^~N$srXU6VR^kk02zLBV5WXUR@^AJiye2d^wuP|oPUYPhN(0AjZ- z<#6{Pok2-f4thYmj*g<6inVwHcCGhqYkHQ*qf^Pc#$jP3%Ryn4Zq|2U&|!&I4Eo8M z1nJ=Q?aW>6JBOy)ss_@7)fB6!`XD2Cn`18vLY~zlEMU+`Xnm3xhtGRL6xujr9(Qro63|a}0&uS{G0<9;IZ? zhM?pkpPz1k5@roL7AWYbE-MAyQH;p zXI|n01|1aUzPX#Ue|wL&%|G=Br3r?lU)Ap3AVtu{_M*U8UNN~!+pj{~&Q%sNy6k2l z;Q|mH6z0A$+h0!kM^dlO`B|TB^7YASy-7>iCaGM#Y$qJ5owoM(&5KihhMS&Bs*S&X z(fVmCSMn`SBt&cJf<2J8i|uAz-%5QCZ*ubn+qZiEO&+1~fC&M>k(v5)6pjUR0;OxU zteRy%7Azs>+YtsgXXisxS?GaJ?Y5*ze_fU7Gkeju{%PNY*7_at&06lZ`u27 zQO_$}7g*_Nn6c8hu{MDwI6XBc3J!WsI;!A;VTYerP+})jwc>O&6sh*vW%?2<9hB#u zaok#f{D5i5k(aSyBbpj7H>iY8MQD-T-k24Yme__m=|(Q)aCZ`7T@;QNi}e2V=x;jgwm_zZ>~oxZx=ZkFOpq16jjtIpLH6F=n&}*ibjn%f zv>iZ}i%Qva<&(~aLw8K>?m;TU60Pv<6Ez7y3X7)k#f-%_jODO}*lFS@gAY7kmA4*cLXxh1w!bc+w}%qy zxX>F2MMI`DjwP`)u>e z%ahZ#VJG4A{7vI8pPX&__0{#o$)z|J>FVm_;s(H#m+5LdkocE$`uAsVsTw;N{7RQ^ zry8fttCRmN8Eu*4wzGD5x&3~DYtk4%#&xvva{FReBL9pT+{aJ3{Ry|Peh)w8?N9g^ zZPz*EP-iND%Ox6LWw0`PQc|}8D(8Z#Xpi0q7c}>qPnVg!L!=)wmHyGut>~G`-nfOH3G~K%(u_J2?d$8g%xnyPE z_nw0ep9241@$L+Y*X9*B?(CJu7DOI zYS|s`WPwZlEaSlwLq1;?D6M_K5yTy83Z7%t+N4vuj*=+SRm#b$&M_=+2f?NJIEp12 zI3~$T1IIPe-bMCI%+3WjKKclzDldIJo%Asyolr%rMf!IJ%6oG0Mm1V-;3sMm!FV(? z$fQH?0kNx4GAfamMS-sPaJESYMR$m{iBb1JN7wQR9?*;0m9GyqC7leu&e=!C{J7b>FS#eYJEw zYpk<`0|#|kap1lbN#Z9tH9U&df|0sPEOOdOnO4sHYY-D5%qby;!XkUH9U za29l!azcFej>C47n@s&ft1!fB3;!{lz4_vjH_I32|KI=f z|E8_abMlW?H(&7a^M&xW@{<2X<1cd1cGfPpFTj5|yJF`f&GPcj_*XnDjh&G zwh7JKIhxW`%-Cw@zhiOcDK7!PG2>i;--yo|Tnree5$wKu{=6o^eC!BOk1E$*l?IR1 z6l(7{LW{s}FpgP)-^e`=#}5?z)Zg5sh#}RibnI5n-OkS^2GyEP-gk#t@2QL)l;@s- z-`Z&KpTF%&m%-akqa2td9NJb1*&XN>hM z1nbdGe1L4P5um7QC9yggtFmcTna=)MEQycF*4l+Jui090t0b!3Z{F&mmQnVyD7?$_|S{ znW*P%4_)s`@*6XW73+P#{iqGWTb#0%e5DLQ()?taX(pq1F?Z#mTi*~X=~>p&64rYt zsg4Wlfx&#oYd2dBqRiXf@m2FGEu33K0IZ=t2#BX4B~prflUrAD1sy_?*s@p8KZAZB`>`z==NDOwlWngd1 zWF=jrTwPzZw=L+NNND!kjqQGqmw${VLxIi3g)lV(;rK6VU8NZaNM2}DxpxlwoJ-c$ zf|zF8>=J4lGno~&4S6Sqe^DRI&O6cB#7Z3XLDk!=U8_>cGC#tU)}(}_%$r^a%~#slVX=Z+n_KjXxp=3fV{bFc~x5rwuPpOwcD;eRizxNs*SAC zynsxd-776|wlQ7SR(5+`#TZRM>0$LY6<9Y(0xrBnJa1)MDxFgZssx0d9dBfQwv{bm zwlQVy8?!zC=C7N7vHoA*HkNz-!~gL=f4FHW*DhIv%d2gb)7AOw&C7PNxv5<3sqhzn z`0Cruzc~2UC)?uJmlx;PFJ5la=B2Q(i}d;>`y4lJ#w;uDpY(2z(4M?U!3cKe*CtP% z7kX34Sl)rF*D727SB#;!%AsJ!S?ICE;KuA}WpE>zvH(FxLfBEB3>Z?cpe%YR+ld^i z=OV0>96u`GTbWl-E-|>luw!L#BfSS@fUWUv=T}N$cr4PGEaWWt|8!IN20lw!Rr0pX z=d^q{N?DuR9TAQL;P^!5=DrP1ED*|&YrX9-fKCde+4b_2b?2b6TDp6<#LisawV`#m z!~v2xugUA3_bV;5qti+CBm;irNuAl<)8zJ+Jq&K{CKBsAXN%n19@emR7v(4 zRdxZC50taFU|>ETbb-eWn#9WE4us>tV!IU~K9v3_!uOG963pFPKlR!0WQUK+vLLJz%*e#J8ThHOTK%cA|hv(QR#JdOV4(f8>IIf(YUp969`c{_NXC9$0 zfF3N%5_iH_XM?TAsqVL-@|>GajM z*7S;h@NKiAa+)sqXM1`p_tWRE_^1Dv7kY$N614-4@pgGs7CpysCM%5E+_cA`T!P}a z$DmvDz0R%)7YN&+jjV)iC~XxZ>f5YU?_`>8uPVCE=Nzvj-c+q5e(MULTTk;MrzOBP z8b|yJu>H=<_jNmeecCox>GbdK9E`vE{3BG6grLlZOyuB7gea-{k_;DI=fy@+d`i_N ztWHKN-^t+yRa_g*jlJI^v?*^uJ8LJK@-3oE97FmfH6S)f$E=d%Lu}EOggEalxnNRD zy$f+2Ix(z>V|U93Jza)4?+o_rRdS7;tzfE5;Wa8$K1iF>(X_j>|&H=pfs)s6*TC7%7OH?(L%-b-wGS5n0qH?1WtyJz4H3OGz6v%9>?cmKJ!-F8u0^p!$a`DoK#n+aQylJF$}!vCXSYyGU~Wv9->1=>S}03h z_{t*`${88{C{f?rUMA7y!0|M1Y_-aeNKojkQ#zNVJ=vydcHywZ>Be+=2u}Cq_0160 zt;hO@SrXh0e0%T9kCdsgN8zJK8>Y@DWO*4TQa+f%aletQ2|l!ZE2dgkIdZr=Z*5S~ zm8uOT6`BA(#Az-Aq=dGh^0kxnAnE*ABvSJ=hax@Q=He_;wZS-GrE2%MY3dMl#HrbW zAuKgyr+9_&rpYoYYC5Q%x=yvV7-`Sw)g6VDC;M8QngWu zR;u=ingj&42Px#A=KJatQgu#|u2MM%QOp5Ubg^WDF7vXV+)35OY+|KqAJ7?z{|V@K zQc++x$mXJ&vHW}tkV+P;3KbLYxu{_d36`kZLrHa9RLusb<8+%;3KrYCSB0cs6*#Ms z;q_F!O{w~xbDFWvC8jp0%F5L4_D48cL(n)?)tf++dQ;ds>(VGlx(tUNxu;fRcY40D zEg`irUDnwRW8Fo;li`=&MfMiF!&X%*rAW_%CaE%f3h~pZiM@Rn?(Xt7sLn%xw4YwK zH(&hRHm^9ieLMZMwsLaGPx;yAhj#Xdr&1mI#pSkAbaQ^T#cDTR#-_X}r`x`4w?(6u z*B7rZPA=PSMCuto(yOb}?F81VbN&r4)9csg{AY|N`*5bSV#2ZadxSP+JV_ox*g>gMgO4_n0$>l_QM3x9&#KpyV=awC;aMKhk`uVp z+z{jYCMC0uE>G?^X!_${IEwx5R`==SN2rSj-m#;d<_!RuR*6HU+9fG6HltFtEKail ztgAV|9()^@bfH7>EnrUF@_9i}pVh+;QnXv;X@wj!V*=`#G{`d7syPD16xK;MvUhfea1$d73T)^8t z9iTJsv|4qPsf;P}n$4Pxg0hLJSYOJX(&aIuxYq@Hy!cd_~~pvycMU&5zj^6Ud|2MV-;w@=8Z0JJ4zrvyF7F*_fE3PmFuRcBRgEvhzG zG6yD5!feSe5guBwDT0;ojPJt6#pomKB=NinyBM_cJ#(<=DoS4~qok}(8e6e6cMoD6 zlw>752c%;~Yxs1W3SX&K?cB^YP?P#51bVig-Rzn{X1u zpq~b@BH3;_+P4Gos$^|qkIGjQsB%=A+^h&6b@(jxIdqAEibF%YD1@WHbN_C=cwnTOZlT*5J+~J}mP++vGaP-(LM~!aYH+~7{ zj0y7l;GE;Fe3hF)lBSNk`@zn^Af=8fS!o@*XZKpGA^V?pY)Y{HClw)a9J^$s|=JiSW`{m~PHNQc+x@s3PSM~hOtlj*FzrdrE zolh;t+E1NWqGMs3OiIo&j<p$wO=wd|vzzJ#a5HEVE4cZn1BQqWQxET~= z1vdwJCgeE;^l=v=R^0=~=%i|n?3skbTbboet+yD!5TdKIw6+CqGpN(OC*-_ro7d_3 zvRyvgyh#7J8MMh!+V_9{?x*km^uzP-|GYWxQo(qWIrH-5a`T3xvlqO?u6YT!i)Wi3 zpa1au&$Eii`+UhqXck*=x}3=cU%ZyZfzKL7Zr>+WVcudkIFQK~c_bhN;B22EpS zJ0qFh77RKUch`O~`EH7As0p@%I=!TJCqD410jSWmp7rWnLOX-%tY~NK{T`uBK_Kf8 zN$-rxw*bBP_I4ao@lrwJs*0uuSAYe^S$5_U+p$YFdUZJRsakKV2(qNQO`6lBB zw*`u=8f7{=zkF;v=@EM;+8GmMMLXjgv8EWvSegpsYV0zS*H*cq#A0~$}R2~ z9cCNx651J+Xhl1ps7XLT>!m5l?lKh7=vcc^(E@EDA8S#I@&U0nwvN(gDYHvxXUry6 zwDXb2p9gLI)F=YG#l!)U>Mn^-W!d#DAdMm_`@1fM-0v>DdNA3JitSjIz&X;lts{dE zRN1$!g(T?_RBk@1R#Vp05@eX6geA5!D9g%rej_P|kSI=0Nez`_3^WQlb>&j@3ahuO zl-hdsd_dCd#9Kl;V|v^-+Bvo{k=9s#)-d(&tVu(q*p=2&p(tG>_}3(9K@T=-8zJ6Z zTQ#W5y)?}_P`fXlel4x1PA)fR?H3^i+sTf+WY5|rx2s>I9o5V0SLtlqc#40klYUb8 z=iKDe>x;`jd~vJ!7u&v9AOCWX&|spIh|f%^!!70D3$J04#=K4kqcVl0_{^i+b+*>* z0X$;{vjU#6)W;zGX{I~l>KaB0Ua=?1frU(dMH!k51QyY9a9(Ct8jFNyFtYgQwp9m8 zc+739jOH~Kotd0U>HdbXq6%5svbv~M(q1cVicQE%jYXfy_~B6Ho@roa~8kv%A>b@A(#w&~!+%=M-F=QffJ5#46deTf}RlG*8#4gj4zo zRqK5;&Mz6xuewvMH10R|WF53ch`4iobwb1YuTwhligtypq8zg77*ee{rBG*k@)D05 zlVs&_2i!bcuT5YdcUM|knr0cilrZvRkr;&nWtA;y=L~zz^Bc`2AUCSf3gkXfo1lOo z&CsV3_ELH$=M)%ZyXb~@(#(3)=#znh7Pjuw9XxK#Bvu~xQ7aiS05OQOU5V|MLuZ--DLJGUD0*c>S77Yjmfi+Vf8!5@!x#+ z!&kS;-87V!&pmyl%4yUbx})6{pYj89UAwH3N#gCZe5vxn;ebV`K8%Ggx`+jk7cU8_7w( zor!c1UHRSL=Mfqa`!QOR_tVI0OF_F*Np)wka-k|448h;shlrMXThYOt zrmOC`h;IwARpq?b{BtBp8_<$_#am6zPmYqYcs`=oq0zhJvhh+fkU%9Zw~I~&CSgd5 zUCUr7*lfzoyIevnV~PwRmJgBT2oX!v7$e=LrP<_KDeTe|l6fb!@`8~GO1TGg&X|() ztQq(cVj0!wZp3n+JS$?k*I->EyN`C4El!atalEcdmDVYwC2UVs=~}VHT(ZMimc|le z8MBFjVEsU|_^cRbSPd0hw2HP!;;-hQkpmDGs6eu%w3hcUmO)weGnPX)*`r`Apkn|_5O#v3 z&|8YUM5-fVN71t&A%fxsRXP>0NOzBl85CqMWI0fd=lpUfC7r#8S>FHjBb3OvsAYH$ zP320Cn$Awu8nklSB$X3pMIKy5vI)~3&N8OZy`(=Ks^aCg?(D@ydi`34>1}VyPtPwe zpKZ>sUbYMV@9D|k+vdmXSFfZFt-Z?Um0gqbpKm7d6@D33;Aa1Qhu3`MD?ho34tKBq zSjkTa5R8e&PjweL^FEuEp&pb=1r_z!l+{$ar|3eM)#fjepD|my*QI`}JoXN^||?d%qW)88v;K8yxamm@!nMD z1;x(>G)MXrI>0N#NjtpM*K{W9{_K*XI9d0Qz0izU{gT(3?c zZ_�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�E3!%sFHQRV-jjrgk&mNsCx+RG1aZ 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 literal 152638 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 z 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 diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts index d5939d47..3774fec1 100644 --- a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -1,8 +1,6 @@ import { ClapEntityGender } from "@aitube/clap" import Cache, { FileSystemCache } from "file-system-cache" -import { getRandomDirectory } from "@/utils" - import { normalizeName } from "./normalizeName" export type AgeNameGenderStats = [ClapEntityGender, number, number] @@ -21,25 +19,27 @@ export const state: { // note: this takes about 140 Mb of memory export async function loadAgeGenderNameStats() { + let nameToStats = {} as Record - if (!state.cache) { - state.cache = Cache({ - basePath: ".age_and_gender_dataset_cache", // await getRandomDirectory() - ttl: 30 * 24 * 60 // (optional) A time-to-live (in secs) on how long an item remains cached. - }); - } + if (typeof window === "undefined") { + if (!state.cache) { + state.cache = Cache({ + basePath: ".age_and_gender_dataset_cache", // await getRandomDirectory() + ttl: 30 * 24 * 60 // (optional) A time-to-live (in secs) on how long an item remains cached. + }); + } - let nameToStats = {} as Record - try { - const rawString = await state.cache.get(CACHE_KEY) - nameToStats = JSON.parse(rawString) as Record - if (Object.keys(nameToStats).length === 0) { - throw new Error(`failed to load the dataset`) + try { + const rawString = await state.cache.get(CACHE_KEY) + nameToStats = JSON.parse(rawString) as Record + if (Object.keys(nameToStats).length === 0) { + throw new Error(`failed to load the dataset`) + } + return nameToStats + } catch (err) { + nameToStats = {} } - return nameToStats - } catch (err) { - nameToStats = {} } const url = "https://huggingface.co/datasets/jbilcke-hf/detection-of-age-and-gender/resolve/main/baby-names-us-year-of-birth-full.csv?download=true" @@ -68,10 +68,12 @@ export async function loadAgeGenderNameStats() { nameToStats[key].sort((a, b) => b[1] - a[1]) }) - try { - await state.cache.set(CACHE_KEY, JSON.stringify(nameToStats)) - } catch (err) { - console.error(`failed to cache the dataset: ${err}`) + if (typeof window === "undefined" && state.cache) { + try { + await state.cache.set(CACHE_KEY, JSON.stringify(nameToStats)) + } catch (err) { + console.error(`failed to cache the dataset: ${err}`) + } } return nameToStats } From 7c0987cea0b731b5c44594a13a096244373dab13 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 19 May 2024 17:45:30 +0200 Subject: [PATCH 055/346] add licence for the scripts --- packages/broadway/samples/scripts/LICENCE.txt | 437 ++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 packages/broadway/samples/scripts/LICENCE.txt diff --git a/packages/broadway/samples/scripts/LICENCE.txt b/packages/broadway/samples/scripts/LICENCE.txt new file mode 100644 index 00000000..68b598b4 --- /dev/null +++ b/packages/broadway/samples/scripts/LICENCE.txt @@ -0,0 +1,437 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. \ No newline at end of file From d628ee14490b9e75d7114f63f61c8328e3bd07aa Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 20 May 2024 17:36:34 +0200 Subject: [PATCH 056/346] 0.0.18 --- packages/aitube-clap/README.md | 1 + packages/aitube-clap/package.json | 2 +- .../aitube-clap/src/factories/newEntity.ts | 4 +- .../aitube-clap/src/factories/newSegment.ts | 11 ++- packages/aitube-clap/src/index.ts | 1 + packages/aitube-clap/src/io/parseClap.ts | 10 ++- packages/aitube-clap/src/io/serializeClap.ts | 10 ++- packages/aitube-clap/src/types.ts | 77 ++++++++++++------- .../src/utils/getClapAssetSourceType.ts | 10 +-- packages/aitube-clap/src/utils/index.ts | 1 + .../src/utils/parseSegmentStatus.ts | 31 ++++++++ 11 files changed, 116 insertions(+), 42 deletions(-) create mode 100644 packages/aitube-clap/src/utils/parseSegmentStatus.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 41e44198..78bfc9f0 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -88,6 +88,7 @@ import { parseMediaOrientation, parseOutputType, parseSegmentCategory, + parseSegmentStatus, UUID, // converters diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 12f74f6b..b9e0cd5c 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.17", + "version": "0.0.18", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/factories/newEntity.ts b/packages/aitube-clap/src/factories/newEntity.ts index e77bd1b5..dcc5f113 100644 --- a/packages/aitube-clap/src/factories/newEntity.ts +++ b/packages/aitube-clap/src/factories/newEntity.ts @@ -17,11 +17,11 @@ export function newEntity(maybeEntity?: Partial) { seed: isValidNumber(maybeEntity?.seed) ? (maybeEntity?.seed || 0) : generateSeed(), imagePrompt: typeof maybeEntity?.imagePrompt === "string" ? maybeEntity.imagePrompt : "", - imageSourceType: typeof maybeEntity?.imageSourceType === "string" ? (maybeEntity.imageSourceType as ClapAssetSource) : "EMPTY", + imageSourceType: typeof maybeEntity?.imageSourceType === "string" ? (maybeEntity.imageSourceType as ClapAssetSource) : ClapAssetSource.EMPTY, imageEngine: typeof maybeEntity?.imageEngine === "string" ? maybeEntity.imageEngine : "", imageId: typeof maybeEntity?.imageId === "string" ? maybeEntity.imageId : "", audioPrompt: typeof maybeEntity?.audioPrompt === "string" ? maybeEntity.audioPrompt : "", - audioSourceType: typeof maybeEntity?.audioSourceType === "string" ? (maybeEntity.audioSourceType as ClapAssetSource) : "EMPTY", + audioSourceType: typeof maybeEntity?.audioSourceType === "string" ? (maybeEntity.audioSourceType as ClapAssetSource) : ClapAssetSource.EMPTY, audioEngine: typeof maybeEntity?.audioEngine === "string" ? (maybeEntity.audioEngine as ClapEntityAudioEngine) : "Parler-TTS", audioId: typeof maybeEntity?.audioId === "string" ? maybeEntity.audioId : "", diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts index 9ff9462e..c12744c4 100644 --- a/packages/aitube-clap/src/factories/newSegment.ts +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -1,4 +1,4 @@ -import { ClapOutputType, ClapSegment } from "@/types" +import { ClapAssetSource, ClapOutputType, ClapSegment, ClapSegmentStatus } from "@/types" import { isValidNumber } from "@/utils/isValidNumber" import { generateSeed } from "@/utils/generateSeed" import { UUID } from "@/utils/uuid" @@ -34,10 +34,13 @@ export function newSegment(maybeSegment?: Partial) { label: typeof maybeSegment?.label === "string" ? maybeSegment.label : "", outputType: parseOutputType(maybeSegment?.outputType, ClapOutputType.TEXT), renderId: typeof maybeSegment?.renderId === "string" ? maybeSegment.renderId : "", - status: typeof maybeSegment?.status === "string" ? maybeSegment.status : "to_generate", + status: typeof maybeSegment?.status === "string" ? maybeSegment.status : ClapSegmentStatus.TO_GENERATE, assetUrl: typeof maybeSegment?.assetUrl === "string" ? maybeSegment.assetUrl : "", - assetDurationInMs, - assetSourceType: typeof maybeSegment?.assetSourceType === "string" ? maybeSegment.assetSourceType : "EMPTY", + assetDurationInMs: isValidNumber(assetDurationInMs) ? assetDurationInMs : 0, + assetSourceType: typeof maybeSegment?.assetSourceType === "string" ? maybeSegment.assetSourceType : ClapAssetSource.EMPTY, + assetFileFormat: typeof maybeSegment?.assetFileFormat === "string" ? maybeSegment.assetFileFormat : "", + revision: isValidNumber(maybeSegment?.revision) ? (maybeSegment?.revision || 0) : 0, + createdAt: typeof maybeSegment?.createdAt === "string" ? maybeSegment.createdAt : new Date().toISOString(), createdBy: typeof maybeSegment?.createdBy === "string" ? maybeSegment.createdBy : "ai", editedBy: typeof maybeSegment?.editedBy === "string" ? maybeSegment.editedBy : "ai", outputGain: isValidNumber(maybeSegment?.outputGain) ? (maybeSegment?.outputGain || 0) : 0, diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 6823d573..13458e9c 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -44,6 +44,7 @@ export { parseMediaOrientation, parseOutputType, parseSegmentCategory, + parseSegmentStatus, UUID } from './utils' export { diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index 66340cff..ba11d703 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -1,6 +1,6 @@ import YAML from "yaml" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "../types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat } from "../types" import { getValidNumber } from "../utils/getValidNumber" import { dataUriToBlob } from "../converters/dataUriToBlob" import { UUID } from "@/utils/uuid" @@ -149,7 +149,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false const maybeClapHeader = maybeArray[0] as ClapHeader - if (maybeClapHeader.format !== "clap-0") { + if (maybeClapHeader.format !== ClapFormat.CLAP_0) { throw new Error("invalid clap file (sorry, but you can't make up version numbers like that)") } @@ -292,6 +292,9 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false assetUrl, assetDurationInMs, assetSourceType, + assetFileFormat, + revision, + createdAt, createdBy, editedBy, outputGain, @@ -317,6 +320,9 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false assetUrl, assetDurationInMs, assetSourceType, + assetFileFormat, + revision, + createdAt, createdBy, editedBy, outputGain, diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index e03a6bbe..2720d0f9 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -2,7 +2,7 @@ import YAML from "yaml" import { getValidNumber } from "@/utils/getValidNumber" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat } from "@/types" import { UUID } from "@/utils/uuid" import { parseMediaOrientation } from "@/utils/parseMediaOrientation" @@ -99,6 +99,9 @@ export async function serializeClap({ assetUrl, assetDurationInMs, assetSourceType, + assetFileFormat, + revision, + createdAt, createdBy, editedBy, outputGain, @@ -119,6 +122,9 @@ export async function serializeClap({ assetUrl, assetDurationInMs, assetSourceType, + assetFileFormat, + revision, + createdAt, createdBy, editedBy, outputGain, @@ -126,7 +132,7 @@ export async function serializeClap({ })) const clapHeader: ClapHeader = { - format: "clap-0", + format: ClapFormat.CLAP_0, numberOfEntities: clapEntities.length, numberOfScenes: clapScenes.length, numberOfSegments: clapSegments.length, diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 60d90e0e..b6437139 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -1,6 +1,12 @@ -export type ClapFormat = - | "clap-0" - | "clap-1" +export enum ClapFormat { + // the current active version + // as long as the Clap format is not "standardized" + // we will stay in clap-0 + CLAP_0 = "clap-0", + + // reserved for future use + // CLAP_1 = "clap-1" +} export enum ClapSegmentCategory { // a 3D Gaussian Splatting object (eg. a .splatv) @@ -118,29 +124,32 @@ export enum ClapOutputType { AUDIO = "audio" } -export type ClapSegmentStatus = - | "to_generate" - | "to_interpolate" - | "to_upscale" - | "completed" - | "error" +export enum ClapSegmentStatus { + TO_GENERATE = "to_generate", + TO_INTERPOLATE = "to_interpolate", + TO_UPSCALE = "to_upscale", + COMPLETED = "completed", + ERROR = "error", +} export type ClapAuthor = | "auto" // the element was edited automatically using basic if/else logical rules | "ai" // the element was edited using a large language entity | "human" // the element was edited by a human + | string -export type ClapAssetSource = - | "REMOTE" // http:// or https:// +export enum ClapAssetSource { + REMOTE = "REMOTE", // http:// or https:// - // note that "path" assets are potentially a security risk, they need to be treated with care - | "PATH" // a file path eg. /path or ./path/to/ or ../path/to/ + // note that "path" assets are potentially a security risk, they need to be treated with care + PATH = "PATH", // a file path eg. /path or ./path/to/ or ../path/to/ - | "DATA" // a data URI, starting with data: + DATA = "DATA", // a data URI, starting with data: - | "PROMPT" // by default, a plain text prompt + PROMPT = "PROMPT", // by default, a plain text prompt - | "EMPTY" + EMPTY = "EMPTY" +} // @deprecated we are going to use ClapEntityVariant (see below) export type ClapEntityGender = @@ -148,18 +157,18 @@ export type ClapEntityGender = | "female" | "person" | "object" + | string -// this is what we should be using - using presets like "male" / "female" is okay, -// but we are going to also enable arbitrary strings -// export type ClapEntityVariant = -// | "male" -// | "female" -// | "person" -// | "object" -// | string +// an arbitrary physical description +export type ClapEntityVariant = string // @deprecated - we are going to use the ClapEntityVariant instead -export type ClapEntityAppearance = "serious" | "neutral" | "friendly" | "chill" +export type ClapEntityAppearance = + | "serious" + | "neutral" + | "friendly" + | "chill" + | string // this is used for accent, style.. export type ClapEntityRegion = @@ -174,6 +183,7 @@ export type ClapEntityRegion = | "italian" | "german" | "chinese" + | string // note: this is all very subjective, so please use good judgment // @@ -184,7 +194,12 @@ export type ClapEntityRegion = // "high" could be used for some other countries, eg. asia export type ClapEntityTimbre = "high" | "neutral" | "deep" -export type ClapEntityAudioEngine = "ElevenLabs" | "XTTS" | "Parler-TTS" +export type ClapEntityAudioEngine = + | "ElevenLabs" + | "XTTS" + | "Parler-TTS" + | "OpenVoice" + | string export enum ClapSegmentFilteringMode { // the start of a segment must be within the range @@ -279,8 +294,18 @@ export type ClapSegment = { assetUrl: string assetDurationInMs: number assetSourceType: ClapAssetSource + assetFileFormat: string + + // when was the segment created + createdAt: string + createdBy: ClapAuthor + + // clap segment default: 0) + revision: number + editedBy: ClapAuthor + outputGain: number seed: number } diff --git a/packages/aitube-clap/src/utils/getClapAssetSourceType.ts b/packages/aitube-clap/src/utils/getClapAssetSourceType.ts index be2baf01..ff5f146a 100644 --- a/packages/aitube-clap/src/utils/getClapAssetSourceType.ts +++ b/packages/aitube-clap/src/utils/getClapAssetSourceType.ts @@ -5,21 +5,21 @@ export function getClapAssetSourceType(input: string = ""): ClapAssetSource { const str = `${input || ""}`.trim() if (!str || !str.length) { - return "EMPTY" + return ClapAssetSource.EMPTY } if (str.startsWith("https://") || str.startsWith("http://")) { - return "REMOTE" + return ClapAssetSource.REMOTE } // note that "path" assets are potentially a security risk, they need to be treated with care if (str.startsWith("/") || str.startsWith("../") || str.startsWith("./")) { - return "PATH" + return ClapAssetSource.PATH } if (str.startsWith("data:")) { - return "DATA" + return ClapAssetSource.DATA } - return "PROMPT" + return ClapAssetSource.PROMPT } \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index dbb16101..b754525b 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -7,4 +7,5 @@ export { isValidNumber } from './isValidNumber' export { parseMediaOrientation } from './parseMediaOrientation' export { parseOutputType } from './parseOutputType' export { parseSegmentCategory } from './parseSegmentCategory' +export { parseSegmentStatus } from './parseSegmentStatus' export { UUID } from './uuid' \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseSegmentStatus.ts b/packages/aitube-clap/src/utils/parseSegmentStatus.ts new file mode 100644 index 00000000..6941f3f3 --- /dev/null +++ b/packages/aitube-clap/src/utils/parseSegmentStatus.ts @@ -0,0 +1,31 @@ +import { ClapSegmentStatus } from "@/types" + +export function parseSegmentStatus(input: any, defaultStatus?: ClapSegmentStatus): ClapSegmentStatus { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(ClapSegmentStatus).includes(unknownString as ClapSegmentStatus)) { + return unknownString as ClapSegmentStatus + } + + let status: ClapSegmentStatus = defaultStatus || ClapSegmentStatus.TO_GENERATE + + unknownString = unknownString.toLowerCase() + + if (unknownString === "to_generate") { + status = ClapSegmentStatus.TO_GENERATE + } + else if (unknownString === "to_interpolate") { + status = ClapSegmentStatus.TO_INTERPOLATE + } + else if (unknownString === "to_upscale") { + status = ClapSegmentStatus.TO_UPSCALE + } + else if (unknownString === "completed") { + status = ClapSegmentStatus.COMPLETED + } else { + status = ClapSegmentStatus.ERROR + } + return status +} \ No newline at end of file From 7e697b309cc5c66e91e631e927e310839d45c4ba Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 20 May 2024 17:39:23 +0200 Subject: [PATCH 057/346] 0.0.26 --- packages/aitube-client/README.md | 1 + packages/aitube-client/bun.lockb | Bin 19118 -> 18764 bytes packages/aitube-client/package.json | 7 +- .../aitube-client/src/api/editClapStory.ts | 96 ++++++++++++++++++ packages/aitube-client/src/api/index.ts | 1 + packages/aitube-client/src/index.ts | 1 + 6 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 packages/aitube-client/src/api/editClapStory.ts diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index 220aa626..005d47c7 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -34,6 +34,7 @@ import { editClapEntities, editClapMusic, editClapSounds, + editClapStory, editClapStoryboards, editClapVideos, exportClapToVideo, diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 37936efba747a4d6bf5bbb7a04ac4d51129f2741..3d7e09389e6a967a7ccf13843e0cd3f903f17fb2 100755 GIT binary patch delta 3528 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 pEr{ { + + if (!clap) { throw new Error(`please provide a clap to extend`) } + + const hasToken = typeof token === "string" && token.length > 0 + + const params: Record = {} + + if (typeof completionMode === "string") { + params.c = completionMode + } + + if (isValidNumber(startTimeInMs)) { + params.s = startTimeInMs + } + + if (isValidNumber(endTimeInMs)) { + params.e = endTimeInMs + } + + if (turbo) { + params.t = "true" + } + + const newClap = await fetchClap( + `${aitubeApiUrl}edit/story?${queryString.stringify(params)}`, { + method: "POST", + headers: { + "Content-Type": "application/x-gzip", + ...hasToken && { + "Authorization": `Bearer ${token}` + } + }, + body: await serializeClap(clap), + cache: "no-store", + }) + + const result = await applyClapCompletion(clap, newClap, completionMode) + + return result +} \ No newline at end of file diff --git a/packages/aitube-client/src/api/index.ts b/packages/aitube-client/src/api/index.ts index 58b6a6f3..97203e54 100644 --- a/packages/aitube-client/src/api/index.ts +++ b/packages/aitube-client/src/api/index.ts @@ -3,6 +3,7 @@ export { editClapDialogues } from "./editClapDialogues" export { editClapEntities } from "./editClapEntities" export { editClapMusic } from "./editClapMusic" export { editClapSounds } from "./editClapSounds" +export { editClapStory } from "./editClapStory" export { editClapStoryboards } from "./editClapStoryboards" export { editClapVideos } from "./editClapVideos" export { exportClapToVideo } from "./exportClapToVideo" diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index b8560342..32a05ac3 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -5,6 +5,7 @@ export { editClapEntities, editClapMusic, editClapSounds, + editClapStory, editClapStoryboards, editClapVideos, exportClapToVideo, From 604f69d1ac87e4f5de228f9fe77881d5b1ce8a4f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 20 May 2024 17:43:18 +0200 Subject: [PATCH 058/346] 0.0.8 --- packages/aitube-engine/bun.lockb | Bin 17638 -> 17638 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 6ef3a628808a78ddafb3312f7b16dcde0d6f5d6d..b62ef2fdaa2b465649693042a456d126105ff52d 100755 GIT binary patch delta 616 zcmV-u0+;>fi2>$`0gx^rWyH|q7I-D>U)#xxO2qcA!T{Pzd;qL!w*=bOeLfv{u}-Q3 z0SA*|11FOp1Q-DilVJlVlVAiGlk^BEv!Dc62muI_VFM?VAPran43l94CzGHJm;n-# zVFM?#U=Ae&f1O^KaGE*6vexgpzVN8W@t}Y2`td_AQfEQf=E!HkLf=d8XPG-yTmnQ- zlU-(Dvjd0EBk|_f3O_!N_?n7Nb^!nY0Ra9F{s9000{{R300000000001kuisl$&)- zfQ!oVSRe{?+^*rAy8*B5w) zHtOB`Bd3!c6Bs~Ut_{Op#Y@mBKvI3WV&Ww(D6DAa?VRvZyc(IokhpZS4=Z8yx(W@f zoMF)1WIL*01lPlX#a;%gSvM_P`}G{NbrWz4Kz9gVxk8c{uOXX~<#P7<`RLJy?j|DN zB5dZ#RH#`7$h1kySDN2|m87+JHM+SK!X7<5;R|$-ihw6iKkbo%^^+wZa6oxt!x&%1 zIV0@?@hW)`5a2HhNDj=@j^ffxwIjtlkUdG{gz{T(EJhS7DOwhPnnfv{q#(Nl7?^A$ z+Wp-2Cp(kXAILzeujyyxbSvLJp0I*baC<~paw*DveLqwrEr*R?b&d>&&_?_zRSRui z2Jaoxu3(?4x!Z`$z*vt7p&b{w%;LAR-5^R38#n*}4gdfE3;+OtkOkl0Y#N2I2mvrI zFfK7TvqCZ51_3vd5j`K1KR6NrHIq^}YXLE{zBt(l0XUPGLV*D?lNv+30XVbQLk|JD C(*>sh delta 614 zcmV-s0-62hi2>$`0gx^r8fj(fg(R4EW3I<6_&}n^#GGc5xo1HvO5S{R$yk3Iu}-Q3 z0R@v`11FOp1Q-DhlVJlVlVAiGlQ;%2v#1162muF^VFM?VAPrcPGzKV>pbeM-5tCs9 zC$nGuaKjb6sgZrJ}Pf)Xu=q$bVVYB zdRFXx3$We}O=L8ym6kvz>c`Xp00031{tx~E000930000000000000Ex`2ec#cg62a zleu2@{W9HJ&kmx>9jeWXYdAjs-`gXveifgE&fytE@xuI^sxqeh2k`Cv;gaHh@{k7qEJrS-I4bPCOmwLeCaYqNC|a0@{6y>Q*!SFE00gV7Op#~kp2QyrhQT9kta z*$AVnRhL^gn!{|O+Y@>nHd_q5a`$&@h1L^4eonG%suc8eo|g%eB_D7=yf{5QpYx03 zYNw{?NaXvbQ*O2tZh%6f#5?)0RLG`5JoL$pv_LBXC`jULZeMSdtg#;UoI=+5wsJYW zVpW?blhq%{K!f<>c=h%lKSZO5Wcs{a=u~i{Er-Y38gyddH{6y=ZrvDoYxEz(R{tI@ zFz>% diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index bfd6c605..8ed752a3 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.7", + "version": "0.0.8", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -18,10 +18,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "typescript": "^5.4.5", - "@aitube/clap": "0.0.17" + "@aitube/clap": "0.0.18" }, "peerDependencies": { - "@aitube/clap": "0.0.17" + "@aitube/clap": "0.0.18" }, "repository": { "type": "git", From c7179c36e94158294c388270f55814acdc378c60 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 20 May 2024 17:44:39 +0200 Subject: [PATCH 059/346] 0.0.9 --- packages/aitube-engine/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 8ed752a3..a5b58b31 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", From 5c4905e37cf22dbcc58c3e02777a4730e4de3d75 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 20 May 2024 18:01:40 +0200 Subject: [PATCH 060/346] 0.0.19 --- packages/aitube-clap/bun.lockb | Bin 17263 -> 16901 bytes packages/aitube-clap/package.json | 7 +++---- packages/aitube-clap/src/index.ts | 26 ++++++++++++++------------ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index 41b0eb78be94eb1d3ac3d8c88d27853161d1ae3f..8060e41d3dadb56de3d24f2834630e6212259fc3 100755 GIT binary patch delta 2770 zcmb_eX>3$g6n=N6Go3eO=t5Z@LpRFa&UBVe2c$4S8z>-4L6ISVEm+#pLK|9?)s6}h zS)}Ed(qSu0Fs1<`lphud5ePd8h>C!$QAj8%G$9c|!SB2`WBh?Z6K-HS zn9g-`P1ZlsG=bK)lcd1H!a3#4CDqj>)yxx;6b0d&(z&ITg;iAt!OP%FL%3QeNzveM z0owx$Lh?m=Ns8flKnrkIgf?#g&gv*>d7Yrd8Q2CZjP*b^*acyzOFU=oPi3MEd0Kkj`w#jC9N3m91EmIRkUz4Y~}C z7RV++rl*uhuN;kR57ul%dc_zDntX-^$cE81!$9#9DY8!_lVA49QzA86kyI#q<@yk( zt|KmxVpjFgPp6>SCvV5Duw5e+V&$8pMET^w$Rf)k*n(I>LCAiD%mtZ_V~{&yFG3uA z8v$;(HU@43xMAQ_zYSNx^{0fWfuaW~7N3|(e)LTgM1P$wqldh`mkRU|HE>m8;`Tg5 z!ANjd;vGT>OT3e)47L3eSr3&ZF~+K+8nS+e5YLG8NeT$tBXvV*s}mByaAV|wWDvJx zwbzghr+^r{hvbZ`-xI|0ULbCaEbq$<+VhYdOOveXI6kxqb|4$dU@>iu?p(tks9?1* z@-*y%s^tzLD){gAlJlwM=YJ$rb?oKkbF>!Ne^02U|F8MvoqBOT$sb!iBy#?2OXEj6 zOYyAwWx=wE(?$;6+-f|rb*=m2!&h@g-EE3HuyOIV3$~W43GbKe-?uQYXkEgsi%a*8 zkaCKwRmq93ktOcrkj>K@DmM%`y!Yb$mO~FdJJGha=KkZhoQw&@LoeMqS$ufdjnVgu zg9Bfms>>Zm(`FSk>sOphZM*Zm**AFYqYW#^zTMohLz#sp>f>=KMbLxf+)h^z0192b z(u&I~W^h1PB>FgYQgcDdO~HEdDI8p!!N51PCUvHWr?%7;&8vH4o6JMfSzVHDrjy<_ zxaR3It+6Ov!{NPVo@+@a4gNaR%5jUj`jP_}{4)2Ol~1kxQ*NC=tXt=nhKeyD4$Qzxdo>~4D&ewLKsbX&u3gXJ+(%gdLEO&E9DoesN8 zI!H^MY4S15hiie=w8yE4TXe>$Si|puElun0b?SIwIp*}Y^Au?jJ##9a@O$9Ta`8oF z_uMNO_t>30-WNN>)%WP};*ukiKiR1haggwvVE~PBDb~s0_yzKo|LBn|(OV5Vkpl_x z9GFG#xfIU_;II<`r@8H3zv1x_I#B@$(i(ni1jc3@*{+;E8jm$I;S;voNatLN7(n^% zPKjW{kCrK7(+|UcYphhAbJ$T6>nXvlSi_H)T@}uK<-g9{f^oNIh)pPB6_r6N{F3>4 za?|;d4;ydm#JfnF9argTYQ*?+Q=qP*1}b9d7ifjwH~!;U6Iw_8{xjA>8rkXfl#uobm6LAH2G!c^9<2nn!M`$aIVSv?FtjSVL`?QBP4G#TtIr>^Re~uyOW+d-$ q7PNnA@~9fpoS|gS%BK9RK`6MoK}qy^)~6^#d^J~l)1xRqrQt8JLfg6k delta 3052 zcmb_e4^WiV7XL2nF8eLjYY{ zGf7FN#vDZ_sld|y$=Hi=s_CE4UKwxd`Fz<}CYEm=^PWjKy_ZvBVZZZzyG_k7)AZ-e zoO`}=?)i7mJ@t390znrTx`gn~bh1-{}Ze}j0yF0z(ULi^G5Uy@q)7ZLv{rY3zW$>X0 z-5n!IN#I986G59I^3GUEN(SEsngF`ipxae|TEJg#)TtFb2OR*P3c3%J<9!G@Xh*om zq&pY^Wy7Cy6m^hh))R_23NJ-soKPvU=K!7vy}O}tWdl~*xIWkx1brKFUeF!{OOX6h zxOI7`A+IUe-nuRr3N;4T&43bD;2^v(?FVItSy%?IQidDt4BpX!gCCqrCff8t7q_WtVn$~RUGN@t;4PpG8 zWTPrFsmiFzcfr{lSjc2G`o#en!pu0yCRLPD6~gk)J2 z4yuw>IT)vVio**1a({%=qKILVEt($2M(VPt@&Go8y_#qt;$9#*UX`m*RF-j#{Nh3C zf@}=3e8^&W1#$+qCc+`JMd0S?bKv%aD+i}#ZTt_oLQ04)7EY2ARI!SxFdn8ZjOS?x zBjkyGuCcWho9BlmLTO+|^&K5ZP-0}5jH0W!3nbn%^uNTri#F5X$CUM~K&IDfvpQw{ zlnBohC6%TDv1L*k`d>4c4u*j#PjCw|{Ft)iOd!)NAOlm@&jzx5CXj(C%X63kOh!4e zTyAWJTwpBSm6Y1SZrm&aOh(y^JDv5=%Nq58GDInV|H`^{uv$6nLuh|9xGLKDX-c2jBRjEht|4>Pmgl|JwdoGZYf9jVxCx zxBBmUXW7*R*NZQIuz%|LldqiIeI~Fed+nM#XKwd3x6M&#!1`{$(s#PMrQdz=FUMCG zq4Don?(GZQgG)3O2h~7@85L7T;FfQ5 zZnss(Q-;-T3FNW8 zBz=}grrc8Qv5BiXurzvlqQ{nbK0O?J3Xr#Mc7$g+eq)-<5uvzgC0pcM+i-mIb&&yN zA5I|q;G=H`&SnD_kcGHFrR#w#;4Apz@r zbXv*gb<$NOJrz3|j{a!PVp);mQVNj)*_}5}$Bn~lK0VSh-Ge<;!*t4Qaa(Zi6**$F+@g}#~ytTbtd20+`L)zvaSN{ zeCZh7;c{gC1N(scI~;u%)x9}p>^=L%Ea>GUGejGuewR(O(W@?-J^D&|rhTHt(`PR; zh-J`mD=x`O7cuX}PGU2{-;8f+I9j`Ne~d_jgx^UOWcAo?TM3R|UG;Tu9eq5h&ln>X zK!U3O@Jy=yVDyHKEy;C=U#PHSX*)FdMdr4Ac_C+BiXld9gaq3g{*bo1ZT9Gk?7L?1 zLThHlX;^x7%L;naZSzH6Zc9Y(C-c63q80N#ePz+7*J%Bc>fw?j6kKGC50!x(p{4mYd-Q#_zwMgWs=ZEN*KEEJx5s8WhkXZw2k~x~4q_9!(eCT Date: Mon, 20 May 2024 18:03:24 +0200 Subject: [PATCH 061/346] 0.0.10 --- packages/aitube-engine/bun.lockb | Bin 17638 -> 17292 bytes packages/aitube-engine/package.json | 9 ++++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index b62ef2fdaa2b465649693042a456d126105ff52d..ae4888be15401cbebed60b6a26387fab658f5936 100755 GIT binary patch delta 2775 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 Date: Mon, 20 May 2024 18:05:06 +0200 Subject: [PATCH 062/346] 0.0.27 --- packages/aitube-client/bun.lockb | Bin 18764 -> 18764 bytes packages/aitube-client/package.json | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 3d7e09389e6a967a7ccf13843e0cd3f903f17fb2..15f9016264175ba70386b261dec010e1c466865c 100755 GIT binary patch delta 179 zcmV;k08IbPk^#(;0gx^r!Sd##pqf!ZzyktZN?hDipMdyd#T}Fb-r+beT?tcIu}<0! z0TYvv11Gak4|Nkj*>}AVHZ-)tI%um}M# hE-)@JIg?T}O#wHvpfpDX0W!1bIaCe-IkP=T4*~LIMl}Ec delta 179 zcmV;k08IbPk^#(;0gx^rJd;tAL=Ge%+cf&+!jl|L=U4YEHsxT&E5Yy%?MD!0u}<0! z0TPpu11Gak4|Nkjs;}v1U%)nTW385Vqxy<6XvjrnE5gRxF01f~E01N;CfRF{>-)tI%um}M# hE-)@JIFnK|O#wBtpfpDX0Wq`aIaCe-II}%S4*}K Date: Mon, 20 May 2024 18:11:30 +0200 Subject: [PATCH 063/346] 0.0.2 --- packages/broadway/bun.lockb | Bin 24397 -> 24397 bytes packages/broadway/package.json | 10 +++++----- .../broadway/src/factories/generateClap.ts | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index f869c49be446d7b4231a42f614ece7c9216f61d9..3ecbd5212c896bdab04c097124aebe27670c3930 100755 GIT binary patch delta 158 zcmV;P0Ac^lz5&g?0gx^rUYz8(ox%jhE2Yp65>g0;A4goYR+Z)`jP0tF)ewGku}+E; z0TYvf1Shf-jTu1McfAlcH0iB9KAwN3Hs_8&h)qljesyj|#2aHB1U$J-ioV&FI2mP&5j7 Date: Mon, 20 May 2024 19:42:08 +0200 Subject: [PATCH 064/346] 0.0.28 --- packages/aitube-client/package.json | 2 +- packages/aitube-client/src/api/editClapStory.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index f7537748..fbf0f2f9 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.27", + "version": "0.0.28", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-client/src/api/editClapStory.ts b/packages/aitube-client/src/api/editClapStory.ts index 4ba6db80..df08681c 100644 --- a/packages/aitube-client/src/api/editClapStory.ts +++ b/packages/aitube-client/src/api/editClapStory.ts @@ -7,6 +7,7 @@ import { applyClapCompletion } from "@/utils" export async function editClapStory({ clap, + prompt, startTimeInMs, endTimeInMs, completionMode = ClapCompletionMode.MERGE, @@ -16,6 +17,9 @@ export async function editClapStory({ // A ClapProject instance clap: ClapProject + // a prompt to describe how to extend the story (optional) + prompt?: string + // indicates where the completion should start in the timeline // // this can be used tp jump to arbitrary timestamps @@ -65,6 +69,10 @@ export async function editClapStory({ params.c = completionMode } + if (typeof prompt === "string" && prompt.length > 0) { + params.p = prompt + } + if (isValidNumber(startTimeInMs)) { params.s = startTimeInMs } From 2f98747715fbb8721e5377b47e46922b1df74c00 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 02:17:51 +0200 Subject: [PATCH 065/346] generate spec draft using gpt-4 --- packages/aitube-clap/SPECIFICATION.md | 1035 +++++++++++++++++++++++++ 1 file changed, 1035 insertions(+) create mode 100644 packages/aitube-clap/SPECIFICATION.md diff --git a/packages/aitube-clap/SPECIFICATION.md b/packages/aitube-clap/SPECIFICATION.md new file mode 100644 index 00000000..eb5a3a11 --- /dev/null +++ b/packages/aitube-clap/SPECIFICATION.md @@ -0,0 +1,1035 @@ +# WARNING + +This documented has been generated using GPT-4. +It probably contains inacurracies. + +# OpenClap File Format Specification + +## 1. Introduction + +This document specifies the OpenClap file format, which is used to serialize AI video projects into a compressed stream of YAML documents. The format is designed to include information regarding metadata, entities, scenes, and segments, ensuring a structure suitable for AI-driven video generation. + +## 2. Conventions Used in This Document + +The key words **"MUST"**, **"MUST NOT"**, **"REQUIRED"**, **"SHALL"**, **"SHALL NOT"**, **"SHOULD"**, **"SHOULD NOT"**, **"RECOMMENDED"**, **"MAY"**, and **"OPTIONAL"** in this document are to be interpreted as described in RFC 2119. + +## 3. Structure of the OpenClap File + +An OpenClap file is composed of a sequence of YAML documents, representing various components of an AI video project. These documents MUST be serialized in the following order: + +1. **ClapHeader** + +2. **ClapMeta** + +3. **ClapEntity** objects + +4. **ClapScene** objects + +5. **ClapSegment** objects + +The entire YAML sequence MUST be compressed using gzip for efficient storage and transmission. + +### 3.1 ClapHeader + +The ClapHeader provides the format version and counts of entities, scenes, and segments included in the file. + +#### 3.1.1 Fields + +- **format** (ClapFormat): The format version, e.g., "clap-0". + +- **numberOfEntities** (number): The total number of entities. + +- **numberOfScenes** (number): The total number of scenes. + +- **numberOfSegments** (number): The total number of segments. + + +### 3.2 ClapMeta + +The ClapMeta provides metadata about the project. + + +#### 3.2.1 Fields + + +- **id** (string): Unique identifier for the metadata. + +- **title** (string): Title of the project. + +- **description** (string): Description of the project. + +- **synopsis** (string): Synopsis of the project. + +- **licence** (string): Licensing information. + +- **orientation** (ClapMediaOrientation): Media orientation, e.g., "landscape". + +- **durationInMs** (number): Duration in milliseconds. + +- **width** (number): Width of the video. + +- **height** (number): Height of the video. + +- **defaultVideoModel** (string): Default video model. + +- **extraPositivePrompt** (string[]): Additional positive prompts. + +- **screenplay** (string): Screenplay text. + +- **isLoop** (boolean): Indicates if the project should loop. + +- **isInteractive** (boolean): Indicates if the project is interactive. + + + +### 3.3 ClapEntity + + + +A ClapEntity represents an entity in the project, such as a character. + + + +#### 3.3.1 Fields + + + +- **id** (string): Unique identifier for the entity. + +- **category** (ClapSegmentCategory): Category of the entity. + +- **triggerName** (string): Trigger name associated with the entity. + +- **label** (string): Label of the entity. + +- **description** (string): Description of the entity. + +- **author** (string): Author of the entity. + +- **thumbnailUrl** (string): URL of the thumbnail image for the entity. + +- **seed** (number): Random seed for generation. + +- **imagePrompt** (string): Prompt for generating the image. + +- **imageSourceType** (ClapAssetSource): Source type of the image. + +- **imageEngine** (string): Engine used for generating the image. + +- **imageId** (string): Identifier of the image. + +- **audioPrompt** (string): Prompt for generating the audio. + +- **audioSourceType** (ClapAssetSource): Source type of the audio. + +- **audioEngine** (ClapEntityAudioEngine): Engine used for generating the audio. + +- **audioId** (string): Identifier of the audio. + +- **age** (number): Age of the entity. + +- **gender** (ClapEntityGender): Gender of the entity. + +- **region** (ClapEntityRegion): Region associated with the entity. + +- **appearance** (ClapEntityAppearance): Appearance of the entity. + + + +### 3.4 ClapScene + + + +A ClapScene describes scenes within the project, including events. + + + +#### 3.4.1 Fields + + + +- **id** (string): Unique identifier for the scene. + +- **scene** (string): Description of the scene. + +- **line** (string): Line identifier associated with the scene. + +- **rawLine** (string): Raw line text. + +- **sequenceFullText** (string): Full text of the sequence. + +- **sequenceStartAtLine** (number): Start line of the sequence. + +- **sequenceEndAtLine** (number): End line of the sequence. + +- **startAtLine** (number): Start line of the scene. + +- **endAtLine** (number): End line of the scene. + +- **events** (ClapSceneEvent[]): List of events in the scene. + + + +### 3.5 ClapSegment + + + +A ClapSegment represents a segment of time within the timeline of the project. + + + +#### 3.5.1 Fields + + + +- **id** (string): Unique identifier for the segment. + +- **track** (number): Track number of the segment. + +- **startTimeInMs** (number): Start time in milliseconds. + +- **endTimeInMs** (number): End time in milliseconds. + +- **category** (ClapSegmentCategory): Category of the segment. + +- **entityId** (string): Identifier of the associated entity. + +- **sceneId** (string): Identifier of the associated scene. + +- **prompt** (string): Prompt for generating content in the segment. + +- **label** (string): Label of the segment. + +- **outputType** (ClapOutputType): Output type of the segment. + +- **renderId** (string): Identifier of the render. + +- **status** (ClapSegmentStatus): Status of the segment. + +- **assetUrl** (string): URL of the asset. + +- **assetDurationInMs** (number): Duration of the asset in milliseconds. + +- **assetSourceType** (ClapAssetSource): Source type of the asset. + +- **assetFileFormat** (string): File format of the asset. + +- **createdAt** (string): Creation timestamp. + +- **createdBy** (ClapAuthor): Creator of the segment. + +- **editedBy** (ClapAuthor): Editor of the segment. + +- **outputGain** (number): Output gain value. + +- **seed** (number): Random seed for generation. + + + +## 4. Serialization and Compression + + + +The series of YAML documents MUST be serialized and then compressed using gzip. The resulting MIME type SHALL be "application/x-gzip". + + + +### 4.1 YAML Serialization + + + +Each component (ClapHeader, ClapMeta, ClapEntity, ClapScene, and ClapSegment) SHOULD be serialized to a separate YAML document. The following steps MUST be followed for serialization and compression: + + + +1. Serialize each component to YAML. + +2. Concatenate the YAML strings in the prescribed order. + +3. Compress the combined string using gzip. + + + +## 5. Deserialization and Decompression + + + +When reading an OpenClap file, the following steps MUST be adhered to: + + + +1. Decompress the file using gzip. + +2. Parse the YAML documents in the order they appear. + +3. Construct the in-memory data structures representing `ClapProject` components. + + + +## 6. Example + + + +Below is an example OpenClap YAML structure before compression: + + + +```yaml + +- format: clap-0 + + numberOfEntities: 1 + + numberOfScenes: 1 + + numberOfSegments: 1 + +- id: 123e4567-e89b-12d3-a456-426614174000 + + title: Example Project + + description: An example AI video project. + + synopsis: This is an example synopsis. + + licence: MIT + + orientation: landscape + + durationInMs: 5000 + + width: 1920 + + height: 1080 + + defaultVideoModel: SVD + + extraPositivePrompt: [] + + screenplay: Example screenplay + + isLoop: false + + isInteractive: false + +- id: 1 + + category: character + + triggerName: trigger_1 + + label: Example Entity + + description: An example entity. + + author: human + + thumbnailUrl: http://example.com/thumbnail.jpg + + seed: 12345 + + imagePrompt: Example image prompt + + imageSourceType: REMOTE + + imageEngine: ExampleEngine + + imageId: img_001 + + audioPrompt: Example audio prompt + + audioSourceType: REMOTE + + audioEngine: ExampleAudioEngine + + audioId: audio_001 + + age: 25 + + gender: male + + region: european + + appearance: friendly + +- id: 1 + + scene: Example Scene + + line: Line 1 + + rawLine: Raw line 1 + + sequenceFullText: Example full text + + sequenceStartAtLine: 1 + + sequenceEndAtLine: 10 + + startAtLine: 1 + + endAtLine: 5 + + events: + + - id: evt_001 + + type: action + + description: Example action + + behavior: Neutral + + startAtLine: 1 + + endAtLine: 2 + +- id: 1 + + track: 0 + + startTimeInMs: 1000 + + endTimeInMs: 2000 + + category: video + + entityId: 1 + + sceneId: 1 + + prompt: Example prompt + + label: Example label + + outputType: video + + renderId: render_001 + + status: to_generate + + assetUrl: http://example.com/asset.mp4 + + assetDurationInMs: 1000 + + assetSourceType: REMOTE + + assetFileFormat: mp4 + + createdAt: 2022-01-01T00:00:00Z + + createdBy: human + + editedBy: human + + outputGain: 0 + + seed: 12345 + +``` + + +## 7. Types and Enumerations + + + +This section details the types and enumerations used in the OpenClap file format. + + + +### 7.1 Enumerations + + +#### 7.1.1 ClapFormat + +Describes the format version of the Clap file. + +- **CLAP_0**: "clap-0" + +- Future versions, e.g. **CLAP_1**, are reserved for future use. + + + +#### 7.1.2 ClapSegmentCategory + +Defines categories for different types of segments. + +- **SPLAT**: "splat" + +- **MESH**: "mesh" + +- **DEPTH**: "depth" + +- **EVENT**: "event" + +- **INTERFACE**: "interface" + +- **PHENOMENON**: "phenomenon" + +- **VIDEO**: "video" + +- **STORYBOARD**: "storyboard" + +- **TRANSITION**: "transition" + +- **CHARACTER**: "character" + +- **LOCATION**: "location" + +- **TIME**: "time" + +- **ERA**: "era" (deprecated, use TIME instead) + +- **LIGHTING**: "lighting" + +- **WEATHER**: "weather" + +- **ACTION**: "action" + +- **MUSIC**: "music" + +- **SOUND**: "sound" + +- **DIALOGUE**: "dialogue" + +- **STYLE**: "style" + +- **CAMERA**: "camera" + +- **GENERIC**: "generic" + + + +#### 7.1.3 ClapMediaOrientation + +Defines the orientation for media. + +- **LANDSCAPE**: "landscape" + +- **PORTRAIT**: "portrait" + +- **SQUARE**: "square" + + + +#### 7.1.4 ClapOutputType + +Defines output types for segments. + +- **TEXT**: "text" + +- **ANIMATION**: "animation" + +- **INTERFACE**: "interface" + +- **EVENT**: "event" + +- **PHENOMENON**: "phenomenon" + +- **TRANSITION**: "transition" + +- **IMAGE**: "image" + +- **VIDEO**: "video" + +- **AUDIO**: "audio" + + + +#### 7.1.5 ClapSegmentStatus + +Defines the status of a segment. + +- **TO_GENERATE**: "to_generate" + +- **TO_INTERPOLATE**: "to_interpolate" + +- **TO_UPSCALE**: "to_upscale" + +- **COMPLETED**: "completed" + +- **ERROR**: "error" + + + +#### 7.1.6 ClapAssetSource + +Defines the source type of assets. + +- **REMOTE**: "REMOTE" + +- **PATH**: "PATH" + +- **DATA**: "DATA" + +- **PROMPT**: "PROMPT" + +- **EMPTY**: "EMPTY" + + + +#### 7.1.7 ClapEntityGender + +Defines gender types for entities. + +- **male** + +- **female** + +- **person** + +- **object** + + + +#### 7.1.8 ClapEntityRegion + +Defines regions for entities. + +- **global** + +- **american** + +- **european** + +- **british** + +- **australian** + +- **canadian** + +- **indian** + +- **french** + +- **italian** + +- **german** + +- **chinese** + + + +#### 7.1.9 ClapEntityAudioEngine + +Defines audio engines for entities. + +- **ElevenLabs** + +- **XTTS** + +- **Parler-TTS** + +- **OpenVoice** + + + +#### 7.1.10 ClapSegmentFilteringMode + +Defines filtering mode for segments. + +- **START**: start of a segment must be within the range. + +- **END**: end of a segment must be within the range. + +- **ANY**: any end of a segment must be within the range. + +- **BOTH**: both ends of a segment must be within the range. + + + +### 7.2 Types + +This section describes the various type definitions used in the OpenClap format. + + + +#### 7.2.1 ClapAuthor + +Defines the type of author. + +- **"auto"**: automatically edited using basic if/else logical rules + +- **"ai"**: edited using a large language model + +- **"human"**: edited by a human + +- **string**: custom author type + + + +#### 7.2.2 ClapVoice + +Describes the attributes of a voice. + +- **name** (string) + +- **gender** (ClapEntityGender) + +- **age** (number) + +- **region** (ClapEntityRegion) + +- **timbre** (string: "high" | "neutral" | "deep") + +- **appearance** (string) + +- **audioEngine** (ClapEntityAudioEngine) + +- **audioId** (string) + + + +#### 7.2.3 ClapSceneEvent + +Describes an event within a scene. + +- **id** (string): Unique identifier for the event. + +- **type** (string: "description" | "dialogue" | "action"): Type of the event. + +- **character** (string): Character involved in the event, if applicable. + +- **description** (string): Description of the event. + +- **behavior** (string): Behavior during the event. + +- **startAtLine** (number): Starting line of the event. + +- **endAtLine** (number): Ending line of the event. + + + +#### 7.2.4 ClapHeader, ClapMeta, ClapEntity, ClapScene, ClapSegment + +These types have been described in the sections 3.1 to 3.5 respectively. + + + +## 8. Compliance and Future Considerations + + + +### 8.1 Compliance + +To ensure compliance with the OpenClap specification, implementations MUST strictly adhere to the prescribed serialization, structure, and compression processes as defined in this document. Non-compliant implementations MAY result in files that are not interoperable with existing tools and programs designed to read or write OpenClap files. + + + +### 8.2 Extensibility + +Future versions of this specification MAY introduce new fields or types. Existing fields MAY evolve. Backwards compatibility SHALL be maintained whenever possible. Developers are encouraged to closely follow updates to the specification to ensure ongoing compatibility with future versions. + + + +## 9. Security Considerations + + + +Implementations that read, write, or otherwise process OpenClap files SHOULD be aware of potential security risks, especially when handling remote or file path assets as defined by the `ClapAssetSource` type. Specifically: + + + +- **REMOTE**: Ensure proper validation of all URLs to mitigate potential exploits, such as URL redirection attacks. + +- **PATH**: Handle file paths with care to prevent potential directory traversal attacks and ensure paths are valid and do not expose sensitive files on the filesystem. + +- **DATA**: Validate `data:` URIs to prevent data injection or related security issues. + + + +An implementation processing OpenClap files MUST ensure that untrusted files and sources do not compromise system security. + + +## Addendum + +## 10. Before you read + +The following IS NOT a proposal to add OpenClap to AAF, +but simply a study (generated using GPT-4) of the possibility +of converting OpenClap to AAF some how. + +## 10.1 Advanced Authoring Format (AAF) Compatibility + +To ensure compatibility with the Advanced Authoring Format (AAF), we outline the necessary mapping between OpenClap and the AAF structures. This section provides guidelines on how OpenClap’s data model can integrate with AAF's existing specifications. + +### 10.2 Mapping OpenClap Data Model to AAF + +AAF is a professional file interchange format designed for the exchange of digital media and metadata. It incorporates a sophisticated data model to support the interchange of authored media data, including timelines, metadata, and media essence. + +This section describes how the various elements of the OpenClap data model can be mapped to the AAF data structure. + +#### 10.2.1 ClapHeader and AAF Descriptive Metadata + +The `ClapHeader` in OpenClap can be mapped to AAF’s descriptive metadata to indicate the format version and counts of entities, scenes, and segments. + + +- **ClapHeader.format** -> AAF `Identification.Description` + +- **ClapHeader.numberOfEntities** -> AAF `MobID` + +- **ClapHeader.numberOfScenes** -> AAF `MobID` + +- **ClapHeader.numberOfSegments** -> AAF `MobID` + + + +#### 10.2.2 ClapMeta and AAF Content Description + +The `ClapMeta` object in OpenClap includes metadata about the project which can be mapped to various AAF metadata fields. + + + +- **ClapMeta.id** -> AAF `Identification.InstanceUID` + +- **ClapMeta.title** -> AAF `Mob.Name` + +- **ClapMeta.description** -> AAF `Mob.Comment` + +- **ClapMeta.synopsis** -> AAF `DescriptiveObjectFramework` + +- **ClapMeta.licence** -> AAF `ContentStorage` + +- **ClapMeta.orientation** -> Custom descriptive metadata in AAF + +- **ClapMeta.durationInMs** -> AAF `Mob.Sequence.Length` + +- **ClapMeta.width** and **ClapMeta.height** -> AAF `DescriptiveClip.FrameLayout` + +- **ClapMeta.defaultVideoModel** -> Custom taxonomy in AAF metadata + +- **ClapMeta.extraPositivePrompt** -> AAF `CommentMarker` + +- **ClapMeta.screenplay** -> Custom descriptive metadata in AAF + +- **ClapMeta.isLoop** -> Custom descriptive metadata in AAF + +- **ClapMeta.isInteractive** -> Custom descriptive metadata in AAF + + + +#### 10.2.3 ClapEntity and AAF Composition Mob + +The `ClapEntity` object in OpenClap can correspond to the `Composition Mob` in AAF, which represents logical groupings of media assets. + + + +- **ClapEntity.id** -> AAF `Composition Mob UID` + +- **ClapEntity.category** -> AAF `User defined data or Custom subclass` + +- **ClapEntity.triggerName** -> AAF `Slot.EditRate` + +- **ClapEntity.label** -> AAF `MobSlot.Name` + +- **ClapEntity.description** -> AAF `MobSlot.Comment` + +- **ClapEntity.author** -> AAF `DescriptiveMarkerText` + +- **ClapEntity.thumbnailUrl** -> Custom metadata field linked to a locator in AAF + +- **ClapEntity.seed** -> Custom descriptive metadata in AAF + +- **ClapEntity.imagePrompt** -> Custom descriptive metadata in AAF + +- **ClapEntity.imageSourceType** -> AAF `Locator` + +- **ClapEntity.imageEngine** -> AAF `CodecDefinition` + +- **ClapEntity.imageId** -> Custom metadata in AAF + +- **ClapEntity.audioPrompt** -> Custom descriptive metadata in AAF + +- **ClapEntity.audioSourceType** -> AAF `Locator` + +- **ClapEntity.audioEngine** -> AAF `CodecDefinition` + +- **ClapEntity.audioId** -> Custom metadata in AAF + +- **ClapEntity.age** -> Custom descriptive metadata in AAF + +- **ClapEntity.gender** -> Custom taxonomy in AAF + +- **ClapEntity.region** -> Custom taxonomy in AAF + +- **ClapEntity.appearance** -> Custom descriptive metadata in AAF + + + +#### 10.2.4 ClapScene and AAF Event Mob + +The `ClapScene` can be represented as AAF `Event MobReferences`. + + + +- **ClapScene.id** -> AAF `MobID` + +- **ClapScene.scene** -> Custom descriptive metadata in AAF + +- **ClapScene.line** -> AAF `Timeline Track` + +- **ClapScene.rawLine** -> Custom descriptive metadata in AAF + +- **ClapScene.sequenceFullText** -> Custom descriptive metadata in AAF + +- **ClapScene.sequenceStartAtLine** -> AAF `SourceClip.StartTime` + +- **ClapScene.sequenceEndAtLine** -> AAF `SourceClip.Length` + +- **ClapScene.startAtLine** -> AAF `Event.StartTime` + +- **ClapScene.endAtLine** -> AAF `Timeline Track` + + + +The `ClapSceneEvent` type in OpenClap maps to AAF’s events within a timeline track: + + + +- **ClapSceneEvent.id** -> AAF `Event UID` + +- **ClapSceneEvent.type** -> Custom marker in AAF (e.g., EventType) + +- **ClapSceneEvent.character** -> AAF `Descriptive Marker Text` + +- **ClapSceneEvent.description** -> AAF `Event Comment` + +- **ClapSceneEvent.behavior** -> Custom descriptive metadata + +- **ClapSceneEvent.startAtLine** and **ClapSceneEvent.endAtLine** -> AAF `Timeline Track` + + + +#### 10.2.5 ClapSegment and AAF Source Clips + +`ClapSegment` aligns with AAF's `Source Clips` and related components. + + + +- **ClapSegment.id** -> AAF `SourceClip UID` + +- **ClapSegment.track** -> AAF `Timeline Track Number` + +- **ClapSegment.startTimeInMs** -> AAF `SourceClip.StartTime` + +- **ClapSegment.endTimeInMs** -> AAF `SourceClip.Length` + +- **ClapSegment.category** -> User-defined metadata in AAF + +- **ClapSegment.entityId** -> AAF `SourceMob SourceID` + +- **ClapSegment.sceneId** -> AAF `MobID` + +- **ClapSegment.prompt** -> Custom descriptive metadata in AAF + +- **ClapSegment.label** -> AAF `MobSlot.Name` + +- **ClapSegment.outputType** -> Custom classification in AAF + +- **ClapSegment.renderId** -> Custom descriptive metadata in AAF + +- **ClapSegment.status** -> Custom metadata in AAF + +- **ClapSegment.assetUrl** -> AAF `Locator.Location` + +- **ClapSegment.assetDurationInMs** -> AAF `Descriptive Marker Length` + +- **ClapSegment.assetSourceType** -> AAF `Locator.Type` + +- **ClapSegment.assetFileFormat** -> Custom classification in AAF + +- **ClapSegment.createdAt** -> AAF `MobID.CreationTime` + +- **ClapSegment.createdBy** -> User-defined metadata in AAF + +- **ClapSegment.editedBy** -> User-defined metadata in AAF + +- **ClapSegment.outputGain** -> Custom field in AAF + +- **ClapSegment.seed** -> User-defined metadata in AAF + + +### 10.3 Implementation Considerations + +While mapping OpenClap data to AAF: + +1. **Data Translation**: Ensure that all non-standard fields in OpenClap are correctly translated to AAF's “user-defined” fields or through custom metadata extensions in AAF. + +2. **Application Specifications**: Follow AAF's application-specific guidelines to maintain integrity and compatibility of the data. + +3. **Interface Specifications**: Use AAF’s interface specifications to handle APIs and data interchange effectively. + + +### 10.4 Example Mapping + + +Here is an example of how a simple `ClapMeta` object would map to AAF metadata fields: + +**ClapMeta JSON:** + + +```yaml + +id: "123e4567-e89b-12d3-a456-426614174000" + +title: "Example Project" + +description: "An example AI video project." + +synopsis: "This is an example synopsis." + +licence: "MIT" + +orientation: "landscape" + +durationInMs: 5000 + +width: 1920 + +height: 1080 + +defaultVideoModel: "SVD" + +extraPositivePrompt: [] + +screenplay: "Example screenplay" + +isLoop: false + +isInteractive: false + +``` + + +**AAF Metadata Mapping:** + + +``` + +AAF Identification.InstanceUID = "123e4567-e89b-12d3-a456-426614174000" + +AAF Mob.Name = "Example Project" + +AAF Mob.Comment = "An example AI video project." + +AAF DescriptiveObjectFramework = "This is an example synopsis." + +AAF ContentStorage = "MIT" + +Custom Metadata Field (Orientation) = "landscape" + +AAF Mob.Sequence.Length = 5000 + +AAF DescriptiveClip.FrameLayout = [Width: 1920, Height: 1080] + +Custom Metadata Field (DefaultVideoModel) = "SVD" + +Custom Descriptive Metadata (Extra Positive Prompt) = [] + +Custom Metadata Field (Screenplay) = "Example screenplay" + +Custom Metadata Field (IsLoop) = false + +Custom Metadata Field (IsInteractive) = false + +``` From 529a24472c21c1f816a2c8f52d295d1e6009f1ee Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 12:29:54 +0200 Subject: [PATCH 066/346] update doc --- packages/aitube-clap/README.md | 26 +- packages/aitube-clap/SPECIFICATION.md | 1035 ------------------------- 2 files changed, 2 insertions(+), 1059 deletions(-) delete mode 100644 packages/aitube-clap/SPECIFICATION.md diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 78bfc9f0..d6c25aeb 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -4,31 +4,9 @@ ## Introduction -This library is used to manipulate Clap files, the file format used to describe AI scenes for AiTube. +This library is the reference implementation of [OpenClap](https://github.com/jbilcke-hf/OpenClap-Format) for NodeJS and browser environments. -It in an open interchange format that other people can use freely for their own projects. - -## Design and capabilities - -A Clap file (.clap) is a compressed YAML stream of documents that describe all aspects of a scene. - -(to be continued) - -## Roadmap - -- [ ] Create a DRAFT for the specification -- [x] Use it in production -- [x] First working implementation for NodeJS - -## Implementations: - -- [ ] C++ library (for native binding): TODO -- [x] Python (in progress): [py-aitube-clap](https://github.com/jbilcke-hf/py-aitube-clap) -- [x] NodeJS (released): [aitube-clap](https://github.com/jbilcke-hf/aitube-clap) -- [ ] Swift: TODO -- [ ] G TODO -- [ ] Java TODO -- [ ] Haskell TODO +**OpenClap** is a prompt container file format that was initially created for my AiTube.at project. I am also using it in my other AI demos, and I think you should use it, too! ## Installation diff --git a/packages/aitube-clap/SPECIFICATION.md b/packages/aitube-clap/SPECIFICATION.md deleted file mode 100644 index eb5a3a11..00000000 --- a/packages/aitube-clap/SPECIFICATION.md +++ /dev/null @@ -1,1035 +0,0 @@ -# WARNING - -This documented has been generated using GPT-4. -It probably contains inacurracies. - -# OpenClap File Format Specification - -## 1. Introduction - -This document specifies the OpenClap file format, which is used to serialize AI video projects into a compressed stream of YAML documents. The format is designed to include information regarding metadata, entities, scenes, and segments, ensuring a structure suitable for AI-driven video generation. - -## 2. Conventions Used in This Document - -The key words **"MUST"**, **"MUST NOT"**, **"REQUIRED"**, **"SHALL"**, **"SHALL NOT"**, **"SHOULD"**, **"SHOULD NOT"**, **"RECOMMENDED"**, **"MAY"**, and **"OPTIONAL"** in this document are to be interpreted as described in RFC 2119. - -## 3. Structure of the OpenClap File - -An OpenClap file is composed of a sequence of YAML documents, representing various components of an AI video project. These documents MUST be serialized in the following order: - -1. **ClapHeader** - -2. **ClapMeta** - -3. **ClapEntity** objects - -4. **ClapScene** objects - -5. **ClapSegment** objects - -The entire YAML sequence MUST be compressed using gzip for efficient storage and transmission. - -### 3.1 ClapHeader - -The ClapHeader provides the format version and counts of entities, scenes, and segments included in the file. - -#### 3.1.1 Fields - -- **format** (ClapFormat): The format version, e.g., "clap-0". - -- **numberOfEntities** (number): The total number of entities. - -- **numberOfScenes** (number): The total number of scenes. - -- **numberOfSegments** (number): The total number of segments. - - -### 3.2 ClapMeta - -The ClapMeta provides metadata about the project. - - -#### 3.2.1 Fields - - -- **id** (string): Unique identifier for the metadata. - -- **title** (string): Title of the project. - -- **description** (string): Description of the project. - -- **synopsis** (string): Synopsis of the project. - -- **licence** (string): Licensing information. - -- **orientation** (ClapMediaOrientation): Media orientation, e.g., "landscape". - -- **durationInMs** (number): Duration in milliseconds. - -- **width** (number): Width of the video. - -- **height** (number): Height of the video. - -- **defaultVideoModel** (string): Default video model. - -- **extraPositivePrompt** (string[]): Additional positive prompts. - -- **screenplay** (string): Screenplay text. - -- **isLoop** (boolean): Indicates if the project should loop. - -- **isInteractive** (boolean): Indicates if the project is interactive. - - - -### 3.3 ClapEntity - - - -A ClapEntity represents an entity in the project, such as a character. - - - -#### 3.3.1 Fields - - - -- **id** (string): Unique identifier for the entity. - -- **category** (ClapSegmentCategory): Category of the entity. - -- **triggerName** (string): Trigger name associated with the entity. - -- **label** (string): Label of the entity. - -- **description** (string): Description of the entity. - -- **author** (string): Author of the entity. - -- **thumbnailUrl** (string): URL of the thumbnail image for the entity. - -- **seed** (number): Random seed for generation. - -- **imagePrompt** (string): Prompt for generating the image. - -- **imageSourceType** (ClapAssetSource): Source type of the image. - -- **imageEngine** (string): Engine used for generating the image. - -- **imageId** (string): Identifier of the image. - -- **audioPrompt** (string): Prompt for generating the audio. - -- **audioSourceType** (ClapAssetSource): Source type of the audio. - -- **audioEngine** (ClapEntityAudioEngine): Engine used for generating the audio. - -- **audioId** (string): Identifier of the audio. - -- **age** (number): Age of the entity. - -- **gender** (ClapEntityGender): Gender of the entity. - -- **region** (ClapEntityRegion): Region associated with the entity. - -- **appearance** (ClapEntityAppearance): Appearance of the entity. - - - -### 3.4 ClapScene - - - -A ClapScene describes scenes within the project, including events. - - - -#### 3.4.1 Fields - - - -- **id** (string): Unique identifier for the scene. - -- **scene** (string): Description of the scene. - -- **line** (string): Line identifier associated with the scene. - -- **rawLine** (string): Raw line text. - -- **sequenceFullText** (string): Full text of the sequence. - -- **sequenceStartAtLine** (number): Start line of the sequence. - -- **sequenceEndAtLine** (number): End line of the sequence. - -- **startAtLine** (number): Start line of the scene. - -- **endAtLine** (number): End line of the scene. - -- **events** (ClapSceneEvent[]): List of events in the scene. - - - -### 3.5 ClapSegment - - - -A ClapSegment represents a segment of time within the timeline of the project. - - - -#### 3.5.1 Fields - - - -- **id** (string): Unique identifier for the segment. - -- **track** (number): Track number of the segment. - -- **startTimeInMs** (number): Start time in milliseconds. - -- **endTimeInMs** (number): End time in milliseconds. - -- **category** (ClapSegmentCategory): Category of the segment. - -- **entityId** (string): Identifier of the associated entity. - -- **sceneId** (string): Identifier of the associated scene. - -- **prompt** (string): Prompt for generating content in the segment. - -- **label** (string): Label of the segment. - -- **outputType** (ClapOutputType): Output type of the segment. - -- **renderId** (string): Identifier of the render. - -- **status** (ClapSegmentStatus): Status of the segment. - -- **assetUrl** (string): URL of the asset. - -- **assetDurationInMs** (number): Duration of the asset in milliseconds. - -- **assetSourceType** (ClapAssetSource): Source type of the asset. - -- **assetFileFormat** (string): File format of the asset. - -- **createdAt** (string): Creation timestamp. - -- **createdBy** (ClapAuthor): Creator of the segment. - -- **editedBy** (ClapAuthor): Editor of the segment. - -- **outputGain** (number): Output gain value. - -- **seed** (number): Random seed for generation. - - - -## 4. Serialization and Compression - - - -The series of YAML documents MUST be serialized and then compressed using gzip. The resulting MIME type SHALL be "application/x-gzip". - - - -### 4.1 YAML Serialization - - - -Each component (ClapHeader, ClapMeta, ClapEntity, ClapScene, and ClapSegment) SHOULD be serialized to a separate YAML document. The following steps MUST be followed for serialization and compression: - - - -1. Serialize each component to YAML. - -2. Concatenate the YAML strings in the prescribed order. - -3. Compress the combined string using gzip. - - - -## 5. Deserialization and Decompression - - - -When reading an OpenClap file, the following steps MUST be adhered to: - - - -1. Decompress the file using gzip. - -2. Parse the YAML documents in the order they appear. - -3. Construct the in-memory data structures representing `ClapProject` components. - - - -## 6. Example - - - -Below is an example OpenClap YAML structure before compression: - - - -```yaml - -- format: clap-0 - - numberOfEntities: 1 - - numberOfScenes: 1 - - numberOfSegments: 1 - -- id: 123e4567-e89b-12d3-a456-426614174000 - - title: Example Project - - description: An example AI video project. - - synopsis: This is an example synopsis. - - licence: MIT - - orientation: landscape - - durationInMs: 5000 - - width: 1920 - - height: 1080 - - defaultVideoModel: SVD - - extraPositivePrompt: [] - - screenplay: Example screenplay - - isLoop: false - - isInteractive: false - -- id: 1 - - category: character - - triggerName: trigger_1 - - label: Example Entity - - description: An example entity. - - author: human - - thumbnailUrl: http://example.com/thumbnail.jpg - - seed: 12345 - - imagePrompt: Example image prompt - - imageSourceType: REMOTE - - imageEngine: ExampleEngine - - imageId: img_001 - - audioPrompt: Example audio prompt - - audioSourceType: REMOTE - - audioEngine: ExampleAudioEngine - - audioId: audio_001 - - age: 25 - - gender: male - - region: european - - appearance: friendly - -- id: 1 - - scene: Example Scene - - line: Line 1 - - rawLine: Raw line 1 - - sequenceFullText: Example full text - - sequenceStartAtLine: 1 - - sequenceEndAtLine: 10 - - startAtLine: 1 - - endAtLine: 5 - - events: - - - id: evt_001 - - type: action - - description: Example action - - behavior: Neutral - - startAtLine: 1 - - endAtLine: 2 - -- id: 1 - - track: 0 - - startTimeInMs: 1000 - - endTimeInMs: 2000 - - category: video - - entityId: 1 - - sceneId: 1 - - prompt: Example prompt - - label: Example label - - outputType: video - - renderId: render_001 - - status: to_generate - - assetUrl: http://example.com/asset.mp4 - - assetDurationInMs: 1000 - - assetSourceType: REMOTE - - assetFileFormat: mp4 - - createdAt: 2022-01-01T00:00:00Z - - createdBy: human - - editedBy: human - - outputGain: 0 - - seed: 12345 - -``` - - -## 7. Types and Enumerations - - - -This section details the types and enumerations used in the OpenClap file format. - - - -### 7.1 Enumerations - - -#### 7.1.1 ClapFormat - -Describes the format version of the Clap file. - -- **CLAP_0**: "clap-0" - -- Future versions, e.g. **CLAP_1**, are reserved for future use. - - - -#### 7.1.2 ClapSegmentCategory - -Defines categories for different types of segments. - -- **SPLAT**: "splat" - -- **MESH**: "mesh" - -- **DEPTH**: "depth" - -- **EVENT**: "event" - -- **INTERFACE**: "interface" - -- **PHENOMENON**: "phenomenon" - -- **VIDEO**: "video" - -- **STORYBOARD**: "storyboard" - -- **TRANSITION**: "transition" - -- **CHARACTER**: "character" - -- **LOCATION**: "location" - -- **TIME**: "time" - -- **ERA**: "era" (deprecated, use TIME instead) - -- **LIGHTING**: "lighting" - -- **WEATHER**: "weather" - -- **ACTION**: "action" - -- **MUSIC**: "music" - -- **SOUND**: "sound" - -- **DIALOGUE**: "dialogue" - -- **STYLE**: "style" - -- **CAMERA**: "camera" - -- **GENERIC**: "generic" - - - -#### 7.1.3 ClapMediaOrientation - -Defines the orientation for media. - -- **LANDSCAPE**: "landscape" - -- **PORTRAIT**: "portrait" - -- **SQUARE**: "square" - - - -#### 7.1.4 ClapOutputType - -Defines output types for segments. - -- **TEXT**: "text" - -- **ANIMATION**: "animation" - -- **INTERFACE**: "interface" - -- **EVENT**: "event" - -- **PHENOMENON**: "phenomenon" - -- **TRANSITION**: "transition" - -- **IMAGE**: "image" - -- **VIDEO**: "video" - -- **AUDIO**: "audio" - - - -#### 7.1.5 ClapSegmentStatus - -Defines the status of a segment. - -- **TO_GENERATE**: "to_generate" - -- **TO_INTERPOLATE**: "to_interpolate" - -- **TO_UPSCALE**: "to_upscale" - -- **COMPLETED**: "completed" - -- **ERROR**: "error" - - - -#### 7.1.6 ClapAssetSource - -Defines the source type of assets. - -- **REMOTE**: "REMOTE" - -- **PATH**: "PATH" - -- **DATA**: "DATA" - -- **PROMPT**: "PROMPT" - -- **EMPTY**: "EMPTY" - - - -#### 7.1.7 ClapEntityGender - -Defines gender types for entities. - -- **male** - -- **female** - -- **person** - -- **object** - - - -#### 7.1.8 ClapEntityRegion - -Defines regions for entities. - -- **global** - -- **american** - -- **european** - -- **british** - -- **australian** - -- **canadian** - -- **indian** - -- **french** - -- **italian** - -- **german** - -- **chinese** - - - -#### 7.1.9 ClapEntityAudioEngine - -Defines audio engines for entities. - -- **ElevenLabs** - -- **XTTS** - -- **Parler-TTS** - -- **OpenVoice** - - - -#### 7.1.10 ClapSegmentFilteringMode - -Defines filtering mode for segments. - -- **START**: start of a segment must be within the range. - -- **END**: end of a segment must be within the range. - -- **ANY**: any end of a segment must be within the range. - -- **BOTH**: both ends of a segment must be within the range. - - - -### 7.2 Types - -This section describes the various type definitions used in the OpenClap format. - - - -#### 7.2.1 ClapAuthor - -Defines the type of author. - -- **"auto"**: automatically edited using basic if/else logical rules - -- **"ai"**: edited using a large language model - -- **"human"**: edited by a human - -- **string**: custom author type - - - -#### 7.2.2 ClapVoice - -Describes the attributes of a voice. - -- **name** (string) - -- **gender** (ClapEntityGender) - -- **age** (number) - -- **region** (ClapEntityRegion) - -- **timbre** (string: "high" | "neutral" | "deep") - -- **appearance** (string) - -- **audioEngine** (ClapEntityAudioEngine) - -- **audioId** (string) - - - -#### 7.2.3 ClapSceneEvent - -Describes an event within a scene. - -- **id** (string): Unique identifier for the event. - -- **type** (string: "description" | "dialogue" | "action"): Type of the event. - -- **character** (string): Character involved in the event, if applicable. - -- **description** (string): Description of the event. - -- **behavior** (string): Behavior during the event. - -- **startAtLine** (number): Starting line of the event. - -- **endAtLine** (number): Ending line of the event. - - - -#### 7.2.4 ClapHeader, ClapMeta, ClapEntity, ClapScene, ClapSegment - -These types have been described in the sections 3.1 to 3.5 respectively. - - - -## 8. Compliance and Future Considerations - - - -### 8.1 Compliance - -To ensure compliance with the OpenClap specification, implementations MUST strictly adhere to the prescribed serialization, structure, and compression processes as defined in this document. Non-compliant implementations MAY result in files that are not interoperable with existing tools and programs designed to read or write OpenClap files. - - - -### 8.2 Extensibility - -Future versions of this specification MAY introduce new fields or types. Existing fields MAY evolve. Backwards compatibility SHALL be maintained whenever possible. Developers are encouraged to closely follow updates to the specification to ensure ongoing compatibility with future versions. - - - -## 9. Security Considerations - - - -Implementations that read, write, or otherwise process OpenClap files SHOULD be aware of potential security risks, especially when handling remote or file path assets as defined by the `ClapAssetSource` type. Specifically: - - - -- **REMOTE**: Ensure proper validation of all URLs to mitigate potential exploits, such as URL redirection attacks. - -- **PATH**: Handle file paths with care to prevent potential directory traversal attacks and ensure paths are valid and do not expose sensitive files on the filesystem. - -- **DATA**: Validate `data:` URIs to prevent data injection or related security issues. - - - -An implementation processing OpenClap files MUST ensure that untrusted files and sources do not compromise system security. - - -## Addendum - -## 10. Before you read - -The following IS NOT a proposal to add OpenClap to AAF, -but simply a study (generated using GPT-4) of the possibility -of converting OpenClap to AAF some how. - -## 10.1 Advanced Authoring Format (AAF) Compatibility - -To ensure compatibility with the Advanced Authoring Format (AAF), we outline the necessary mapping between OpenClap and the AAF structures. This section provides guidelines on how OpenClap’s data model can integrate with AAF's existing specifications. - -### 10.2 Mapping OpenClap Data Model to AAF - -AAF is a professional file interchange format designed for the exchange of digital media and metadata. It incorporates a sophisticated data model to support the interchange of authored media data, including timelines, metadata, and media essence. - -This section describes how the various elements of the OpenClap data model can be mapped to the AAF data structure. - -#### 10.2.1 ClapHeader and AAF Descriptive Metadata - -The `ClapHeader` in OpenClap can be mapped to AAF’s descriptive metadata to indicate the format version and counts of entities, scenes, and segments. - - -- **ClapHeader.format** -> AAF `Identification.Description` - -- **ClapHeader.numberOfEntities** -> AAF `MobID` - -- **ClapHeader.numberOfScenes** -> AAF `MobID` - -- **ClapHeader.numberOfSegments** -> AAF `MobID` - - - -#### 10.2.2 ClapMeta and AAF Content Description - -The `ClapMeta` object in OpenClap includes metadata about the project which can be mapped to various AAF metadata fields. - - - -- **ClapMeta.id** -> AAF `Identification.InstanceUID` - -- **ClapMeta.title** -> AAF `Mob.Name` - -- **ClapMeta.description** -> AAF `Mob.Comment` - -- **ClapMeta.synopsis** -> AAF `DescriptiveObjectFramework` - -- **ClapMeta.licence** -> AAF `ContentStorage` - -- **ClapMeta.orientation** -> Custom descriptive metadata in AAF - -- **ClapMeta.durationInMs** -> AAF `Mob.Sequence.Length` - -- **ClapMeta.width** and **ClapMeta.height** -> AAF `DescriptiveClip.FrameLayout` - -- **ClapMeta.defaultVideoModel** -> Custom taxonomy in AAF metadata - -- **ClapMeta.extraPositivePrompt** -> AAF `CommentMarker` - -- **ClapMeta.screenplay** -> Custom descriptive metadata in AAF - -- **ClapMeta.isLoop** -> Custom descriptive metadata in AAF - -- **ClapMeta.isInteractive** -> Custom descriptive metadata in AAF - - - -#### 10.2.3 ClapEntity and AAF Composition Mob - -The `ClapEntity` object in OpenClap can correspond to the `Composition Mob` in AAF, which represents logical groupings of media assets. - - - -- **ClapEntity.id** -> AAF `Composition Mob UID` - -- **ClapEntity.category** -> AAF `User defined data or Custom subclass` - -- **ClapEntity.triggerName** -> AAF `Slot.EditRate` - -- **ClapEntity.label** -> AAF `MobSlot.Name` - -- **ClapEntity.description** -> AAF `MobSlot.Comment` - -- **ClapEntity.author** -> AAF `DescriptiveMarkerText` - -- **ClapEntity.thumbnailUrl** -> Custom metadata field linked to a locator in AAF - -- **ClapEntity.seed** -> Custom descriptive metadata in AAF - -- **ClapEntity.imagePrompt** -> Custom descriptive metadata in AAF - -- **ClapEntity.imageSourceType** -> AAF `Locator` - -- **ClapEntity.imageEngine** -> AAF `CodecDefinition` - -- **ClapEntity.imageId** -> Custom metadata in AAF - -- **ClapEntity.audioPrompt** -> Custom descriptive metadata in AAF - -- **ClapEntity.audioSourceType** -> AAF `Locator` - -- **ClapEntity.audioEngine** -> AAF `CodecDefinition` - -- **ClapEntity.audioId** -> Custom metadata in AAF - -- **ClapEntity.age** -> Custom descriptive metadata in AAF - -- **ClapEntity.gender** -> Custom taxonomy in AAF - -- **ClapEntity.region** -> Custom taxonomy in AAF - -- **ClapEntity.appearance** -> Custom descriptive metadata in AAF - - - -#### 10.2.4 ClapScene and AAF Event Mob - -The `ClapScene` can be represented as AAF `Event MobReferences`. - - - -- **ClapScene.id** -> AAF `MobID` - -- **ClapScene.scene** -> Custom descriptive metadata in AAF - -- **ClapScene.line** -> AAF `Timeline Track` - -- **ClapScene.rawLine** -> Custom descriptive metadata in AAF - -- **ClapScene.sequenceFullText** -> Custom descriptive metadata in AAF - -- **ClapScene.sequenceStartAtLine** -> AAF `SourceClip.StartTime` - -- **ClapScene.sequenceEndAtLine** -> AAF `SourceClip.Length` - -- **ClapScene.startAtLine** -> AAF `Event.StartTime` - -- **ClapScene.endAtLine** -> AAF `Timeline Track` - - - -The `ClapSceneEvent` type in OpenClap maps to AAF’s events within a timeline track: - - - -- **ClapSceneEvent.id** -> AAF `Event UID` - -- **ClapSceneEvent.type** -> Custom marker in AAF (e.g., EventType) - -- **ClapSceneEvent.character** -> AAF `Descriptive Marker Text` - -- **ClapSceneEvent.description** -> AAF `Event Comment` - -- **ClapSceneEvent.behavior** -> Custom descriptive metadata - -- **ClapSceneEvent.startAtLine** and **ClapSceneEvent.endAtLine** -> AAF `Timeline Track` - - - -#### 10.2.5 ClapSegment and AAF Source Clips - -`ClapSegment` aligns with AAF's `Source Clips` and related components. - - - -- **ClapSegment.id** -> AAF `SourceClip UID` - -- **ClapSegment.track** -> AAF `Timeline Track Number` - -- **ClapSegment.startTimeInMs** -> AAF `SourceClip.StartTime` - -- **ClapSegment.endTimeInMs** -> AAF `SourceClip.Length` - -- **ClapSegment.category** -> User-defined metadata in AAF - -- **ClapSegment.entityId** -> AAF `SourceMob SourceID` - -- **ClapSegment.sceneId** -> AAF `MobID` - -- **ClapSegment.prompt** -> Custom descriptive metadata in AAF - -- **ClapSegment.label** -> AAF `MobSlot.Name` - -- **ClapSegment.outputType** -> Custom classification in AAF - -- **ClapSegment.renderId** -> Custom descriptive metadata in AAF - -- **ClapSegment.status** -> Custom metadata in AAF - -- **ClapSegment.assetUrl** -> AAF `Locator.Location` - -- **ClapSegment.assetDurationInMs** -> AAF `Descriptive Marker Length` - -- **ClapSegment.assetSourceType** -> AAF `Locator.Type` - -- **ClapSegment.assetFileFormat** -> Custom classification in AAF - -- **ClapSegment.createdAt** -> AAF `MobID.CreationTime` - -- **ClapSegment.createdBy** -> User-defined metadata in AAF - -- **ClapSegment.editedBy** -> User-defined metadata in AAF - -- **ClapSegment.outputGain** -> Custom field in AAF - -- **ClapSegment.seed** -> User-defined metadata in AAF - - -### 10.3 Implementation Considerations - -While mapping OpenClap data to AAF: - -1. **Data Translation**: Ensure that all non-standard fields in OpenClap are correctly translated to AAF's “user-defined” fields or through custom metadata extensions in AAF. - -2. **Application Specifications**: Follow AAF's application-specific guidelines to maintain integrity and compatibility of the data. - -3. **Interface Specifications**: Use AAF’s interface specifications to handle APIs and data interchange effectively. - - -### 10.4 Example Mapping - - -Here is an example of how a simple `ClapMeta` object would map to AAF metadata fields: - -**ClapMeta JSON:** - - -```yaml - -id: "123e4567-e89b-12d3-a456-426614174000" - -title: "Example Project" - -description: "An example AI video project." - -synopsis: "This is an example synopsis." - -licence: "MIT" - -orientation: "landscape" - -durationInMs: 5000 - -width: 1920 - -height: 1080 - -defaultVideoModel: "SVD" - -extraPositivePrompt: [] - -screenplay: "Example screenplay" - -isLoop: false - -isInteractive: false - -``` - - -**AAF Metadata Mapping:** - - -``` - -AAF Identification.InstanceUID = "123e4567-e89b-12d3-a456-426614174000" - -AAF Mob.Name = "Example Project" - -AAF Mob.Comment = "An example AI video project." - -AAF DescriptiveObjectFramework = "This is an example synopsis." - -AAF ContentStorage = "MIT" - -Custom Metadata Field (Orientation) = "landscape" - -AAF Mob.Sequence.Length = 5000 - -AAF DescriptiveClip.FrameLayout = [Width: 1920, Height: 1080] - -Custom Metadata Field (DefaultVideoModel) = "SVD" - -Custom Descriptive Metadata (Extra Positive Prompt) = [] - -Custom Metadata Field (Screenplay) = "Example screenplay" - -Custom Metadata Field (IsLoop) = false - -Custom Metadata Field (IsInteractive) = false - -``` From f68ad859aceeb65df69930b76c982a6ad6f87d12 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 17:08:31 +0200 Subject: [PATCH 067/346] preparing the next version --- packages/aitube-clap/README.md | 4 +- packages/aitube-clap/package.json | 2 +- .../src/helpers/filterClapSegmentAssets.ts | 67 +++++++++++++++++++ .../src/helpers/filterClapSegments.ts | 53 +++++++++++++++ packages/aitube-clap/src/helpers/index.ts | 4 +- packages/aitube-clap/src/index.ts | 4 +- 6 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts create mode 100644 packages/aitube-clap/src/helpers/filterClapSegments.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index d6c25aeb..3a2ec317 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -75,9 +75,11 @@ import { clapToDataUri, // helpers + buildEntityIndex, + filterClapSegmentAssets, + filterClapSegments, generateClapFromSimpleStory, getEmptyClap, - buildEntityIndex } from "@aitube/clap" diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index e59fbc8b..46f0846f 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.19", + "version": "0.0.20", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts b/packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts new file mode 100644 index 00000000..f3fc783d --- /dev/null +++ b/packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts @@ -0,0 +1,67 @@ +import { parseClap } from "@/io/parseClap" +import { serializeClap } from "@/io/serializeClap" +import { ClapProject, ClapSegmentCategory, ClapSegmentStatus } from "@/types" + +/** + * Keep or remove segment assets, by category + * + * You can choose a mode, to either INCLUDE or EXCLUDE + * + * The original is NOT modifed by default, unless you set: `modifyOriginal: true` + * which will clone the whole clap project + */ +export async function filterClapSegmentAssets({ + clap, + immutable, + mode, + categories, + updateStatus = true +}: { + clap: ClapProject + immutable?: boolean + mode: "INCLUDE" | "EXCLUDE" + categories: Record + updateStatus?: boolean +}): Promise { + + if (immutable) { + const tmp = await serializeClap(clap) + const newClap = await parseClap(tmp) + return filterClapSegmentAssets({ + clap: newClap, + immutable: false, + mode, + categories, + updateStatus, + }) + } + + if (mode !== "INCLUDE" && mode !== "EXCLUDE") { + throw new Error(`unsupported mode "${mode}"`) + } + + clap.segments = clap.segments.map(segment => { + if (mode === "INCLUDE") { + if (typeof categories[segment.category] === "boolean" && categories[segment.category]) { + segment.assetUrl = segment.assetUrl + } else { + segment.assetUrl = "" + if (updateStatus) { + segment.status = ClapSegmentStatus.TO_GENERATE + } + } + } else if (mode === "EXCLUDE") { + if (typeof categories[segment.category] === "boolean" && !categories[segment.category]) { + segment.assetUrl = "" + if (updateStatus) { + segment.status = ClapSegmentStatus.TO_GENERATE + } + } else { + segment.assetUrl = segment.assetUrl + } + } + return segment + }) + + return clap +} \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/filterClapSegments.ts b/packages/aitube-clap/src/helpers/filterClapSegments.ts new file mode 100644 index 00000000..49f91980 --- /dev/null +++ b/packages/aitube-clap/src/helpers/filterClapSegments.ts @@ -0,0 +1,53 @@ +import { parseClap } from "@/io/parseClap" +import { serializeClap } from "@/io/serializeClap" +import { ClapProject, ClapSegmentCategory } from "@/types" + +/** + * Filter segments by category + * + * You can choose a mode, to either INCLUDE or EXCLUDE + * + * The original is NOT modifed by default, unless you set: `modifyOriginal: true` + * which will clone the whole clap project + */ +export async function filterClapSegments({ + clap, + modifyOriginal, + mode, + categories +}: { + clap: ClapProject + modifyOriginal?: boolean + mode: "INCLUDE" | "EXCLUDE" + categories: Record +}): Promise { + + if (!modifyOriginal) { + const tmp = await serializeClap(clap) + const newClap = await parseClap(tmp) + return filterClapSegments({ + clap: newClap, + modifyOriginal: true, + mode, + categories, + }) + } + + if (mode === "INCLUDE") { + clap.segments = clap.segments.filter(segment => ( + typeof categories[segment.category] === "boolean" + ? categories[segment.category] + : false + )) + } else if (mode === "EXCLUDE") { + clap.segments = clap.segments.filter(segment => ( + typeof categories[segment.category] === "boolean" + ? !categories[segment.category] + : true + )) + } else { + throw new Error(`unsupported mode "${mode}"`) + } + + return clap +} \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/index.ts b/packages/aitube-clap/src/helpers/index.ts index 02d819aa..4ea3b2af 100644 --- a/packages/aitube-clap/src/helpers/index.ts +++ b/packages/aitube-clap/src/helpers/index.ts @@ -1,3 +1,5 @@ +export { buildEntityIndex } from './buildEntityIndex' +export { filterClapSegmentAssets } from './filterClapSegmentAssets' +export { filterClapSegments } from './filterClapSegments' export { getEmptyClap } from './getEmptyClap' export { generateClapFromSimpleStory } from './generateClapFromSimpleStory' -export { buildEntityIndex } from './buildEntityIndex' diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index b28cb779..b9a1fcc6 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -55,7 +55,9 @@ export { clapToDataUri } from './converters' export { + buildEntityIndex, + filterClapSegmentAssets, + filterClapSegments, generateClapFromSimpleStory, getEmptyClap, - buildEntityIndex } from './helpers' From 0a73d3e8b5dfde992037219fb1dfd71691a8f5a0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 22:29:31 +0200 Subject: [PATCH 068/346] 0.0.20 --- ...erClapSegmentAssets.ts => filterAssets.ts} | 20 ++++++++++++------- ...egments.ts => filterSegmentsByCategory.ts} | 6 +++--- packages/aitube-clap/src/helpers/index.ts | 4 ++-- packages/aitube-clap/src/index.ts | 4 ++-- 4 files changed, 20 insertions(+), 14 deletions(-) rename packages/aitube-clap/src/helpers/{filterClapSegmentAssets.ts => filterAssets.ts} (73%) rename packages/aitube-clap/src/helpers/{filterClapSegments.ts => filterSegmentsByCategory.ts} (93%) diff --git a/packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts b/packages/aitube-clap/src/helpers/filterAssets.ts similarity index 73% rename from packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts rename to packages/aitube-clap/src/helpers/filterAssets.ts index f3fc783d..94999473 100644 --- a/packages/aitube-clap/src/helpers/filterClapSegmentAssets.ts +++ b/packages/aitube-clap/src/helpers/filterAssets.ts @@ -1,6 +1,6 @@ import { parseClap } from "@/io/parseClap" import { serializeClap } from "@/io/serializeClap" -import { ClapProject, ClapSegmentCategory, ClapSegmentStatus } from "@/types" +import { ClapAssetSource, ClapProject, ClapSegmentCategory, ClapSegmentStatus } from "@/types" /** * Keep or remove segment assets, by category @@ -10,24 +10,24 @@ import { ClapProject, ClapSegmentCategory, ClapSegmentStatus } from "@/types" * The original is NOT modifed by default, unless you set: `modifyOriginal: true` * which will clone the whole clap project */ -export async function filterClapSegmentAssets({ +export async function filterAssets({ clap, - immutable, - mode, - categories, + immutable = false, + mode = "INCLUDE", + categories = {}, updateStatus = true }: { clap: ClapProject immutable?: boolean mode: "INCLUDE" | "EXCLUDE" - categories: Record + categories: Partial> updateStatus?: boolean }): Promise { if (immutable) { const tmp = await serializeClap(clap) const newClap = await parseClap(tmp) - return filterClapSegmentAssets({ + return filterAssets({ clap: newClap, immutable: false, mode, @@ -48,6 +48,9 @@ export async function filterClapSegmentAssets({ segment.assetUrl = "" if (updateStatus) { segment.status = ClapSegmentStatus.TO_GENERATE + segment.assetDurationInMs = 0 + segment.assetSourceType = ClapAssetSource.EMPTY + segment.assetFileFormat = "" } } } else if (mode === "EXCLUDE") { @@ -55,6 +58,9 @@ export async function filterClapSegmentAssets({ segment.assetUrl = "" if (updateStatus) { segment.status = ClapSegmentStatus.TO_GENERATE + segment.assetDurationInMs = 0 + segment.assetSourceType = ClapAssetSource.EMPTY + segment.assetFileFormat = "" } } else { segment.assetUrl = segment.assetUrl diff --git a/packages/aitube-clap/src/helpers/filterClapSegments.ts b/packages/aitube-clap/src/helpers/filterSegmentsByCategory.ts similarity index 93% rename from packages/aitube-clap/src/helpers/filterClapSegments.ts rename to packages/aitube-clap/src/helpers/filterSegmentsByCategory.ts index 49f91980..b92555bd 100644 --- a/packages/aitube-clap/src/helpers/filterClapSegments.ts +++ b/packages/aitube-clap/src/helpers/filterSegmentsByCategory.ts @@ -10,7 +10,7 @@ import { ClapProject, ClapSegmentCategory } from "@/types" * The original is NOT modifed by default, unless you set: `modifyOriginal: true` * which will clone the whole clap project */ -export async function filterClapSegments({ +export async function filterSegmentsByCategory({ clap, modifyOriginal, mode, @@ -25,7 +25,7 @@ export async function filterClapSegments({ if (!modifyOriginal) { const tmp = await serializeClap(clap) const newClap = await parseClap(tmp) - return filterClapSegments({ + return filterSegmentsByCategory({ clap: newClap, modifyOriginal: true, mode, @@ -50,4 +50,4 @@ export async function filterClapSegments({ } return clap -} \ No newline at end of file +} diff --git a/packages/aitube-clap/src/helpers/index.ts b/packages/aitube-clap/src/helpers/index.ts index 4ea3b2af..42beea61 100644 --- a/packages/aitube-clap/src/helpers/index.ts +++ b/packages/aitube-clap/src/helpers/index.ts @@ -1,5 +1,5 @@ export { buildEntityIndex } from './buildEntityIndex' -export { filterClapSegmentAssets } from './filterClapSegmentAssets' -export { filterClapSegments } from './filterClapSegments' +export { filterAssets } from './filterAssets' +export { filterSegmentsByCategory } from './filterSegmentsByCategory' export { getEmptyClap } from './getEmptyClap' export { generateClapFromSimpleStory } from './generateClapFromSimpleStory' diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index b9a1fcc6..875758fc 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -56,8 +56,8 @@ export { } from './converters' export { buildEntityIndex, - filterClapSegmentAssets, - filterClapSegments, + filterAssets, + filterSegmentsByCategory, generateClapFromSimpleStory, getEmptyClap, } from './helpers' From 930704b8eff02cdf76f3f78e309ec6565a304f05 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 22:33:00 +0200 Subject: [PATCH 069/346] fix doc --- packages/aitube-clap/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 3a2ec317..02df0cd1 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -76,8 +76,8 @@ import { // helpers buildEntityIndex, - filterClapSegmentAssets, - filterClapSegments, + filterAssets, + filterSegmentsByCategory, generateClapFromSimpleStory, getEmptyClap, } from "@aitube/clap" From 13441839bd23b3a47ed2487a2f5fd780a8a6fc32 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 22:34:10 +0200 Subject: [PATCH 070/346] 0.0.11 --- packages/aitube-engine/bun.lockb | Bin 17292 -> 17292 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index ae4888be15401cbebed60b6a26387fab658f5936..cbea4500d9b996661c9ecc8da5617a0048765f3a 100755 GIT binary patch delta 358 zcmV-s0h#`chXIU-0gx^rWWa5zz{H#$&`DHkbz{Gk&z3i*!m6JG$YSoE{&q0Ju}<0p z0T7c>11Gak1dss%1CyZ%H?tT9&<6n&lTiaFvk(q#1VAJ*mzPlDy5Y&`^-|bXWZ9XY*{^{vC_2_}w${b3D0kq%Zn03O*=@mK=W-~+S05-0*d zk!g!6eXT~<*f3wgYDl3~RC5HQvCoJJG9vayKXqDg0p&BNCER4kMwWrJp_rh5qG`50P4d{H1E?YQKVs|x(^^_P z{3tL4oN_Sbpz)$T??Th_{O}5a>dxCYaOBTh^i8uRAOR2@GB5xD4gdfE3;+OtkOkl0 zY#N2I2mvrIFfKAMlR_}D1v4%&E;6(DFg6AOHnT4`7y<<|E-@}LvrIWJ2?8=OvwcDj E0ppFA!2kdN delta 366 zcmeBaXY6TboS>&5%%3D7eVIFBwVH5SQvPT-JKly^tAJhg)_cf7q4hHdv*7>^774lg*2EP z%xjvwKgTs4Zd~MUBf;+T(Os?X&>~NLnXVae{68PXTP)u}3 zq^!ITThP~Skz0?=+UAzKSyl7^m&48Sy#i(?FW1`I&8uH#_UuE8x`=}Fe?6OM6D_U2 z+5aPUPmw7;GC$$TeCdnE=Bjs3mN;ncnZN7S&CBmLW=kZUaowz{z$hSNXvx692lOuw z14F|E*8BH!q*^y{FdFC?=owm0b~4z=YNThZXSVr=ff*a4>1KU%2_~qBkEK2*lcDA2 IS|@%+0M?(3bN~PV diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 0207a72f..a2584b0a 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.10", + "version": "0.0.11", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -17,10 +17,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.7", "typescript": "^5.4.5", - "@aitube/clap": "0.0.19" + "@aitube/clap": "0.0.20" }, "peerDependencies": { - "@aitube/clap": "0.0.19" + "@aitube/clap": "0.0.20" }, "repository": { "type": "git", From 27504fbda4754df7d8b7d291b234898874b66a74 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 22:37:23 +0200 Subject: [PATCH 071/346] 0.0.29 --- packages/aitube-client/bun.lockb | Bin 18764 -> 18764 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 15f9016264175ba70386b261dec010e1c466865c..08ec1127512d5570961c7d3a29112e02519e7f90 100755 GIT binary patch delta 359 zcmV-t0hs>Gk^#(;0gx^rvV0Yvl*-==qc;%lATPW|if7k)Ws#HswH{IH^@iozu}&HV z0T7ds11GbP1&{#&1C!wjH?vp=&<6n&laT`_vrrEW20$b-mzPlDy5Y&`^-|bXWZ9XY*{^{vC_2_}w${b3D0kq%Zn03O*=@mK=W-~+Rr6(|Bg zk!g!6eXT~<*f3wgYDl3~RC5HQvCoJJG9vayKXqDg0p&BNCER4kMwWrJp_rh5qG`50P4d{H1E?YQKVs|x(^^_P z{3tL4oN_Sbpz)$T??Th_{O}5a>dxCYaOBTh^i8t`BQX&iGB5xD4gdfE3;+OtkOkl0 zY#N2I2mvrIFfKAMvr;q}0R=NIF)lK*a5a7h0XDPmJQxB6GcGYMGP4XnF9`xNFta^K F4*`eLmdpSE delta 367 zcmX>ziSf)N#tC`~2R}VqykJ(K;{j%-Sg)8n!Sfq_Bp;QX!hG+cg?=n&aKuJGDON`Q z$rG8?H&0-lz{ttOz`(!^#B5-p0QMW~jKUBmKQEiZ#d8y<%r5n5=sxu+LV>F=|KOUq zwnZ0~^1tEn(%{ZXEKg9CO_OkydShYWC3bgm4)YzEabeyczCtn4 z9g(u~K5Ri>w?%F}Hfx((?q*hr16&R_%l8VHnY>(UYd5ccnc1@sE$Si)&j0mnqD{24 z`ey%+*gZw2_{jW(C-bE*8k?)$Jz3(Qxo7^aTQ@Ji+n6npbjEcvtFob>jG-k110T@8 zJPZsC6Ik!x&yi}~z` diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index fbf0f2f9..1b762d46 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.28", + "version": "0.0.29", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -17,10 +17,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.7", "typescript": "^5.4.5", - "@aitube/clap": "0.0.19" + "@aitube/clap": "0.0.20" }, "peerDependencies": { - "@aitube/clap": "0.0.19" + "@aitube/clap": "0.0.20" }, "repository": { "type": "git", From abe067b24a8c30438e4b8ee6aaf4cc0e4c6a1312 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 21 May 2024 22:44:04 +0200 Subject: [PATCH 072/346] 0.0.3 --- packages/broadway/bun.lockb | Bin 24397 -> 24397 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 3ecbd5212c896bdab04c097124aebe27670c3930..9321fdbdc20a6e46b72d2582d882168b8434279e 100755 GIT binary patch delta 339 zcmV-Z0j&Pbz5&g?0gx^rE*&}Q@Mr65vp;a*0d%|OWWJnrwArNMwdMMU*ErC(u}(?~ z0T7dc1Shk=3XlN-1CtRDH?xQgPzM1NlYs;$vJ}+}KqNAkmr&xm;mPUsQrK1FqY2t- z_acaMR8xtLy!BKAfFq6ddv+6@T0|hfK lF)lK*Do0lg0XDOOQy2mTGcGYMGP9pmod^OlFta{h4*@Jkmt_C| delta 343 zcmV-d0jU1Xz5&g?0gx^rUYz8(ox%jhE2Yp65>g0;A4goYR+Z)`jP0tF)ewGku}(?~ z0S}Xb1Shk=3XlN>0ssI21C!AQE3<$MSO)Tl$&)-fQ!oVSRe{< zZ^5iyhN94=59|y|C<|<1cVHzQW*9{p>^Lw=7TuFs<;z3Zp_ug77kGy@>fQSzr?V9y zC;~t?e1c2!UV_7cqDMR!2TbutCVs-ANiQ6Vm|hS0;=elk(?R~8!w$rl(4PDbaTXQ0 zSsfot22%C5S+&NRwnlBUeIpPGK-qV_5H>XFtvx=Tf2KC(@PsE6AVdEyJXDvq1~ zSi6)QbHtxualv+6@T p0|hcJGcGo>Do0lg0X4INQy2mTGA=VNHnX2qod^OkIkP@q4*@i=j^Y3S diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 8c766f69..4d94d9c5 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -13,14 +13,14 @@ "publish": "npm publish --access public" }, "devDependencies": { - "@aitube/clap": "0.0.19", + "@aitube/clap": "0.0.20", "bun-types": "latest", "prettier": "^3.2.5", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.19" + "@aitube/clap": "0.0.20" }, "repository": { "type": "git", From e3d078b675e7f579ec93b32fbc22c126020ec6ea Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 22 May 2024 15:43:53 +0200 Subject: [PATCH 073/346] 0.0.21 --- packages/aitube-clap/README.md | 1 + packages/aitube-clap/bun.lockb | Bin 16901 -> 16901 bytes packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/helpers/index.ts | 1 + .../src/helpers/removeGeneratedAssetUrls.ts | 25 ++++++++++++++++++ packages/aitube-clap/src/index.ts | 1 + packages/aitube-clap/src/io/updateClap.ts | 10 ++++--- 7 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 02df0cd1..81bd9ec4 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -80,6 +80,7 @@ import { filterSegmentsByCategory, generateClapFromSimpleStory, getEmptyClap, + removeGeneratedAssetUrls, } from "@aitube/clap" diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index 8060e41d3dadb56de3d24f2834630e6212259fc3..59517e51e3b3cbe9688abb12f3019429ad941109 100755 GIT binary patch delta 709 zcmV;$0y_PLgaL(w0gx^roEi>I_z#A(4a(vu1U47Pid;kzJ34DCy=AGT)>B__u}(?^ z0T7cx11FQf1QY=alTisPk_8l#6bm$yNCgm+SPC$chy}<21CtR7H?xQa&;|hslR*O~ zlYk9W1q=WH01T5s11GW$%>+OsGMAT7;=19<>Ge|BRpX-x+G_VAh;vj^iH^Nr!SCJC zE*&|&lJ%{_=Lsf`g8g9)K9LSqI{+TpQt?;<)8GS>4HFoDU9JtoUd2n$DL_(vx?>J1?F%=b8jyI=!l+HR`eMej;ZYTu2RFl0E7(n(KcUGOhgj5uWj0&U0 z!gy6@t`85Bbl5cV5$@7J45+zb_XY0p8Y{N16m;cFE#x?+8YKprmGLO)i*=d-x%fvbvafny4y@ILhq@MtP@IfU-f- zRtU6+#$d1nRpTL~ZTPwCmMlu!)T^PFO<;F{uFUbw=a7>XA8FiZn6E-?me_kP8 delta 717 zcmV;;0y6!DgaL(w0gx^rxib4m$vvf6G%ahmStPBIzU!IDZ8u`YExM5_N>40%u}(?^ z0SuEt11FQf1QY=ZlaUH5k_8l#lm#@CNCgm+*a|R{hy}+P9BX9EZe#br#ilpg$;y~&_ui7_YH;0?g;+Xc)vE-gB9Q`QsiH$$tDIczfMSm`{a-ph|4HFoD?-bg++_^;s z=dv&jy<5zXNbi<|qMkq_zxH|}S9A9Lk&1SBND`A+QT%cJJEVk!etH#8I%@auQIowB7(lfxxU!Jm z|25%RvriJRhqLeoJ2uJ~bpFY-fvRUqo5h*e70X)j{6c>9K=380SY6Vk6IwjJDql&M zgrE)4Be1g-6d(aWH++Ii^In3(fuct|7za%8M<#y4qDe0tikMyx`QpDi`_n=Gp2H5r zn9!d54sjM0xLF+^Oa@Z*wpq2tnzlx5vvn0<2|(0YXlbV^7E269Z))f3`)&9sAFB2t z9A-RY37w{Y($it`nsFafxA8?mixw>M diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 46f0846f..ba2e513a 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.20", + "version": "0.0.21", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/helpers/index.ts b/packages/aitube-clap/src/helpers/index.ts index 42beea61..885cd67c 100644 --- a/packages/aitube-clap/src/helpers/index.ts +++ b/packages/aitube-clap/src/helpers/index.ts @@ -3,3 +3,4 @@ export { filterAssets } from './filterAssets' export { filterSegmentsByCategory } from './filterSegmentsByCategory' export { getEmptyClap } from './getEmptyClap' export { generateClapFromSimpleStory } from './generateClapFromSimpleStory' +export { removeGeneratedAssetUrls } from './removeGeneratedAssetUrls' \ No newline at end of file diff --git a/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts b/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts new file mode 100644 index 00000000..79cf7439 --- /dev/null +++ b/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts @@ -0,0 +1,25 @@ +import { ClapProject, ClapSegmentCategory, ClapSegmentStatus, ClapSegment } from "@/types" + +// return a new clap (but in a memory efficient way: it will hold references to the original) +// with all the generated, partially generated or in-erorr segments stripped of their assetUrl +// +// this will has the effect or drastically reducing the size of the payload +// +// note: please make sure you don't accidentally have segments +// with status TO_GENERATE and something in assetUrl +export function removeGeneratedAssetUrls( + clap: ClapProject, + keep: ClapSegmentCategory[] = [] +): ClapProject { + return { + ...clap, + segments: (Array.isArray(clap.segments) ? clap.segments : []) + .map((segment: ClapSegment) => + // if a segment is not "TO_GENERATE" then we assume it contains an URL, + // which is information we can strip out + (segment?.status === ClapSegmentStatus.TO_GENERATE) + ? segment + : { ...segment, assetUrl: '' } + ) + } +} diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 875758fc..b6dd6282 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -60,4 +60,5 @@ export { filterSegmentsByCategory, generateClapFromSimpleStory, getEmptyClap, + removeGeneratedAssetUrls, } from './helpers' diff --git a/packages/aitube-clap/src/io/updateClap.ts b/packages/aitube-clap/src/io/updateClap.ts index 5b95c06f..78fd61d7 100644 --- a/packages/aitube-clap/src/io/updateClap.ts +++ b/packages/aitube-clap/src/io/updateClap.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" +import { ClapEntity, ClapProject, ClapScene, ClapSegment, ClapSegmentStatus } from "@/types" import { newClap } from "@/factories/newClap" function clone(input: T): T { @@ -98,12 +98,16 @@ export async function updateClap(existingClap: ClapProject, newerClap: ClapProje for (const segment of newerClap.segments) { if (existingSegmentIndex[segment.id]) { - // we only ovewrite segments that are not completed + // we only overwrite segments that are not completed // otherwise we would have issue during parallel execution, // older empty data would be used to update the segments - if (existingSegmentIndex[segment.id].status !== "completed") { + if (existingSegmentIndex[segment.id].status !== ClapSegmentStatus.COMPLETED) { Object.assign(existingSegmentIndex[segment.id], segment) } + + // note: sometimes a segment is marked as "completed" but is actually + // empty when it comes to the assetUrl.. that is perfectly fine! + // it just means that its value is held somewhere else, and that we shouldn't touch it } else { clap.segments.push(existingSegmentIndex[segment.id] = segment) } From a2bc5dbb31ba35a0cadf184d3ecde55d9ada0f2c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 22 May 2024 16:15:42 +0200 Subject: [PATCH 074/346] 0.0.22 --- packages/aitube-clap/package.json | 2 +- .../aitube-clap/src/helpers/removeGeneratedAssetUrls.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index ba2e513a..40dcd3bc 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.21", + "version": "0.0.22", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts b/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts index 79cf7439..00079e9f 100644 --- a/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts +++ b/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts @@ -9,7 +9,9 @@ import { ClapProject, ClapSegmentCategory, ClapSegmentStatus, ClapSegment } from // with status TO_GENERATE and something in assetUrl export function removeGeneratedAssetUrls( clap: ClapProject, - keep: ClapSegmentCategory[] = [] + + // those segments will be preserved no matter what + idsOfSegmentsToKeep: string[] = [] ): ClapProject { return { ...clap, @@ -17,7 +19,10 @@ export function removeGeneratedAssetUrls( .map((segment: ClapSegment) => // if a segment is not "TO_GENERATE" then we assume it contains an URL, // which is information we can strip out - (segment?.status === ClapSegmentStatus.TO_GENERATE) + // also if it's in idsOfSegmentsToKeep we keep it without asking questions + ( + idsOfSegmentsToKeep.includes(segment.id) || + segment?.status === ClapSegmentStatus.TO_GENERATE) ? segment : { ...segment, assetUrl: '' } ) From 3dd03bfaba75d19111e455b0682bdfa0368bb7a4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 22 May 2024 16:19:48 +0200 Subject: [PATCH 075/346] 0.0.31 --- packages/aitube-client/README.md | 2 +- packages/aitube-client/bun.lockb | Bin 18764 -> 18764 bytes packages/aitube-client/package.json | 6 ++-- .../src/api/editClapDialogues.ts | 4 +-- .../aitube-client/src/api/editClapEntities.ts | 4 +-- .../aitube-client/src/api/editClapMusic.ts | 4 +-- .../aitube-client/src/api/editClapSounds.ts | 4 +-- .../aitube-client/src/api/editClapStory.ts | 15 +++++++-- .../src/api/editClapStoryboards.ts | 4 +-- .../aitube-client/src/api/editClapVideos.ts | 29 ++++++++++++++++-- packages/aitube-client/src/index.ts | 2 +- packages/aitube-client/src/utils/index.ts | 2 +- 12 files changed, 56 insertions(+), 20 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index 005d47c7..1ba08ab4 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -48,7 +48,7 @@ import { ClapCompletionMode, ClapEntityPrompt, SupportedExportFormat, - applyClapCompletion + applyClapCompletion, } from '@aitube/client' const ultraSecret = "ultra secret token unavailable to common mortals" diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 08ec1127512d5570961c7d3a29112e02519e7f90..a68b23bb63786242b92976ccf99e6b693696f80f 100755 GIT binary patch delta 253 zcmVY@btWfY+MHvoR{{q#U-_?wu}<0z z0SS|l11FPE4%h(}laT`_vrrEe5*=d-x%fvbvafny4y@ILhq@MtP@IfU-f- zRtU6+#$d1nRpTL~ZTPwCmMlu!)T^PFO<;F{uFUbw=a93dAs_)jpx>>2jI@5Ac>*jA zF-)tI%um}M#E-)@KGP6=N;t~Nlvo%Kt0Rb|zJxC7$ Dcerdk delta 253 zcmV;ltTT08tGFa(@(Fy)}}qCM|I)ARiB3W4g*+c$9J&s+3O zvjrnE5gRZ701f~E01N;CfRF{>-)tI%um}M#E-)@KFtbuL;t~Nkvo%Kt0Rb?xJxC7$ DMv-qF diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 1b762d46..ca347ff9 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.29", + "version": "0.0.31", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -17,10 +17,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.7", "typescript": "^5.4.5", - "@aitube/clap": "0.0.20" + "@aitube/clap": "0.0.22" }, "peerDependencies": { - "@aitube/clap": "0.0.20" + "@aitube/clap": "0.0.22" }, "repository": { "type": "git", diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts index 975bc6d6..23415488 100644 --- a/packages/aitube-client/src/api/editClapDialogues.ts +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -1,4 +1,4 @@ -import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, removeGeneratedAssetUrls, serializeClap } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" @@ -52,7 +52,7 @@ export async function editClapDialogues({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap(removeGeneratedAssetUrls(clap)), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index 80b40e98..67292b02 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -1,4 +1,4 @@ -import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" @@ -65,7 +65,7 @@ export async function editClapEntities({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap(removeGeneratedAssetUrls(clap)), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapMusic.ts b/packages/aitube-client/src/api/editClapMusic.ts index d5f979eb..f845d7cb 100644 --- a/packages/aitube-client/src/api/editClapMusic.ts +++ b/packages/aitube-client/src/api/editClapMusic.ts @@ -1,5 +1,5 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" import { ClapCompletionMode } from "@/constants/types" @@ -51,7 +51,7 @@ export async function editClapMusic({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap(removeGeneratedAssetUrls(clap)), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapSounds.ts b/packages/aitube-client/src/api/editClapSounds.ts index 201af50d..3bf26964 100644 --- a/packages/aitube-client/src/api/editClapSounds.ts +++ b/packages/aitube-client/src/api/editClapSounds.ts @@ -1,5 +1,5 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" import { ClapCompletionMode } from "@/constants/types" @@ -51,7 +51,7 @@ export async function editClapSounds({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap(removeGeneratedAssetUrls(clap)), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapStory.ts b/packages/aitube-client/src/api/editClapStory.ts index df08681c..35922cbd 100644 --- a/packages/aitube-client/src/api/editClapStory.ts +++ b/packages/aitube-client/src/api/editClapStory.ts @@ -1,4 +1,4 @@ -import { ClapProject, fetchClap, isValidNumber, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, filterAssets, isValidNumber, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" @@ -85,6 +85,17 @@ export async function editClapStory({ params.t = "true" } + // we remove heavy elements from the payload + const payload = await filterAssets({ + clap, + mode: "INCLUDE", + categories: {}, + immutable: true, // to create a standalone copy + + // we only remove the data, but we still keep things marked as "generated" + updateStatus: false, + }) + const newClap = await fetchClap( `${aitubeApiUrl}edit/story?${queryString.stringify(params)}`, { method: "POST", @@ -94,7 +105,7 @@ export async function editClapStory({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap(removeGeneratedAssetUrls(clap)), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index 542b524d..b2d6d5fb 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -1,5 +1,5 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" import { ClapCompletionMode } from "@/constants/types" @@ -51,7 +51,7 @@ export async function editClapStoryboards({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap(removeGeneratedAssetUrls(clap)), cache: "no-store", }) diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts index 9b9954c4..22a2485e 100644 --- a/packages/aitube-client/src/api/editClapVideos.ts +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -1,5 +1,5 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap } from "@aitube/clap" +import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls, ClapSegmentStatus, ClapSegmentCategory, filterSegments, ClapSegmentFilteringMode, ClapSegment } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" import { ClapCompletionMode } from "@/constants/types" @@ -42,6 +42,27 @@ export async function editClapVideos({ if (turbo) { params.t = "true" } + // special trick to not touch the generated + // storyboards that are used by pending videos + const idsOfStoryboardsToKeep = clap.segments.map(segment => { + + const isPendingVideo = ( + segment.category === ClapSegmentCategory.VIDEO + && + segment.status === ClapSegmentStatus.TO_GENERATE + ) + + if (!isPendingVideo) { return undefined } + + const storyboard: ClapSegment | undefined = filterSegments( + ClapSegmentFilteringMode.BOTH, + segment, + clap.segments, + ClapSegmentCategory.STORYBOARD + ).at(0) + + return storyboard?.id + }).filter(x => x) as string[] const newClap = await fetchClap(`${aitubeApiUrl}edit/videos?${queryString.stringify(params)}`, { method: "POST", @@ -51,7 +72,11 @@ export async function editClapVideos({ "Authorization": `Bearer ${token}` } }, - body: await serializeClap(clap), + body: await serializeClap( + // need a special trick here, to not touch the generated + // storyboards that are used by pending videos + removeGeneratedAssetUrls(clap, idsOfStoryboardsToKeep) + ), cache: "no-store", }) diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index 32a05ac3..321d935e 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -25,5 +25,5 @@ export { } from "./constants" export { - applyClapCompletion + applyClapCompletion, } from "./utils" \ No newline at end of file diff --git a/packages/aitube-client/src/utils/index.ts b/packages/aitube-client/src/utils/index.ts index 917b5631..8244b256 100644 --- a/packages/aitube-client/src/utils/index.ts +++ b/packages/aitube-client/src/utils/index.ts @@ -1 +1 @@ -export { applyClapCompletion } from "./applyClapCompletion" \ No newline at end of file +export { applyClapCompletion } from "./applyClapCompletion" From c532e11ec426ce1206a05ee05744387d17fea41a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 22 May 2024 16:21:31 +0200 Subject: [PATCH 076/346] 0.0.12 --- packages/aitube-engine/bun.lockb | Bin 17292 -> 17292 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index cbea4500d9b996661c9ecc8da5617a0048765f3a..374cc13b9c213007b1c49d48116eb6369fe0791a 100755 GIT binary patch delta 253 zcmVAGU?c!vM8N!!<73Fda!*=d-x%fvbvafny4y@ILhq@MtP@IfU-f- zRtU6+#$d1nRpTL~ZTPwCmMlu!)T^PFO<;F{uFUbw=a93-9v}fgpx>>2jI@5Ac>*jA zF-)tI%um}M#E-)@KGP6Q3G7$kevvolS0Rb|zeL@cb DOap0$ delta 253 zcmV(11FOZ4cGw`lTiaFvk(q-5I}bbU%5h(7_T9llI3#t`T6M4hwdgK-y&@0$yBIW z2FSEY%2%4-fR&`Rcs07Y6~Z1pJmCv;kcxmOPe1LEg7ve-9v}fgK;b3aWXDF9fwZBR zpnsxiwmnVq*rEfdA@@IG>;ltTT08tGFa(@(Fy)}}qCM|I)ARiB3W4g*+c$9J&s+3O zvn3z`5F0Q601f~E01N;CfRF{>-)tI%um}M#E-)@KFtb81G7$kdvvolS0Rb?xeL@cb DUy5$q diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index a2584b0a..a4f9e364 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.11", + "version": "0.0.12", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -17,10 +17,10 @@ "prettier": "^3.2.5", "rimraf": "^5.0.7", "typescript": "^5.4.5", - "@aitube/clap": "0.0.20" + "@aitube/clap": "0.0.22" }, "peerDependencies": { - "@aitube/clap": "0.0.20" + "@aitube/clap": "0.0.22" }, "repository": { "type": "git", From 021f4c06fbfad75038f1eb988bb9f7229e0cf926 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 22 May 2024 16:22:58 +0200 Subject: [PATCH 077/346] 0.0.4 --- packages/broadway/bun.lockb | Bin 24397 -> 24397 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 9321fdbdc20a6e46b72d2582d882168b8434279e..b1dd187c461352a7b758a90b4b22b9dda39d54c6 100755 GIT binary patch delta 230 zcmVL%m1%C$)EDbSS zx}~^eE7?DX_!-<(**=kU>9tFW4l8HyZHFo?`wX}f_-ph;OM4-yeU(=6xlyQafNQhO gEdmw+GLz6l838i0>OdxCYaOBTh^i8wP gEdmw+Fq6O Date: Mon, 27 May 2024 13:07:37 +0200 Subject: [PATCH 078/346] 0.0.5 --- packages/broadway/package.json | 4 +++- packages/broadway/src/analysis/index.ts | 1 + packages/broadway/src/index.ts | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index a211214f..6a4e6f8a 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -27,6 +27,8 @@ "url": "https://github.com/jbilcke-hf/aitube-broadway.git" }, "keywords": [ + "OpenClap", + "AiTube", "AI cinema", "file format", "specification" diff --git a/packages/broadway/src/analysis/index.ts b/packages/broadway/src/analysis/index.ts index 7a3095b3..854f4f95 100644 --- a/packages/broadway/src/analysis/index.ts +++ b/packages/broadway/src/analysis/index.ts @@ -2,6 +2,7 @@ export { analyzeLine } from "./analyzeLine" export { analyzeName } from "./analyzeName" export { analyzeScreenplay } from "./analyzeScreenplay" export { getEntityAnalysisPrompt } from "./getEntityAnalysisPrompt" +export { getScreenplayFromText } from "./getScreenplayFromText" export { guessAgeAndGender } from "./guessAgeAndGender" export { isCharacterLine } from "./isCharacterLine" export { isDialogueLine } from "./isDialogueLine" diff --git a/packages/broadway/src/index.ts b/packages/broadway/src/index.ts index 0e969c9e..1015ef91 100644 --- a/packages/broadway/src/index.ts +++ b/packages/broadway/src/index.ts @@ -4,6 +4,7 @@ export { analyzeScreenplay, getEntityAnalysisPrompt, guessAgeAndGender, + getScreenplayFromText, isCharacterLine, isDialogueLine, isPageSeparator, From 1fe24a023e33f02b15e1e9a6ad69a2ab526f009c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 27 May 2024 13:14:46 +0200 Subject: [PATCH 079/346] 0.0.6 --- packages/broadway/package.json | 2 +- packages/broadway/src/index.ts | 2 +- packages/broadway/src/utils/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 6a4e6f8a..82d2d3e9 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.5", + "version": "0.0.6", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", diff --git a/packages/broadway/src/index.ts b/packages/broadway/src/index.ts index 1015ef91..a8d378bc 100644 --- a/packages/broadway/src/index.ts +++ b/packages/broadway/src/index.ts @@ -74,7 +74,7 @@ export { cleanUTF8Characters, deduplicate, getEntities, - getRandomDirectory, + // getRandomDirectory, isAllCaps, onlyContainsStrangeNumber, pick, diff --git a/packages/broadway/src/utils/index.ts b/packages/broadway/src/utils/index.ts index 0e820d73..74d905ef 100644 --- a/packages/broadway/src/utils/index.ts +++ b/packages/broadway/src/utils/index.ts @@ -1,7 +1,7 @@ export { cleanUTF8Characters } from "./cleanUTF8Characters" export { deduplicate } from "./deduplicate" export { getEntities } from "./getEntities" -export { getRandomDirectory } from "./getRandomDirectory" +// export { getRandomDirectory } from "./getRandomDirectory" export { isAllCaps } from "./isAllCaps" export { onlyContainsStrangeNumber } from "./onlyContainsStrangeNumber" export { pick } from "./pick" From 1f34a58d9d5f6c87f10fa1f0b9a1fe3101b54963 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 27 May 2024 16:34:46 +0200 Subject: [PATCH 080/346] 0.0.7 - disable Node imports --- packages/broadway/bun.lockb | Bin 24397 -> 20345 bytes packages/broadway/package.json | 5 +- .../src/analysis/loadAgeAndGenderDataset.ts | 70 ++++++++++-------- ...domDirectory.ts => getRandomDirectory.txt} | 0 packages/broadway/src/utils/index.ts | 3 + 5 files changed, 45 insertions(+), 33 deletions(-) rename packages/broadway/src/utils/{getRandomDirectory.ts => getRandomDirectory.txt} (100%) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index b1dd187c461352a7b758a90b4b22b9dda39d54c6..667de886b5c1a888ed5aec57d6183a153d042643 100755 GIT binary patch delta 4221 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 S(XlzR=tAXl{h4!f#D4*yy7l+~ delta 6646 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 UhD;F@3FM8<8kyITJ1U&}7o`*8=>Px# diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 82d2d3e9..c788f6a2 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.6", + "version": "0.0.7", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -42,7 +42,6 @@ ], "dependencies": { "@datagica/parse-entities": "^0.3.0", - "@datagica/parse-names": "^0.0.8", - "file-system-cache": "^2.4.4" + "@datagica/parse-names": "^0.0.8" } } diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts index 3774fec1..0710fcba 100644 --- a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -1,5 +1,4 @@ import { ClapEntityGender } from "@aitube/clap" -import Cache, { FileSystemCache } from "file-system-cache" import { normalizeName } from "./normalizeName" @@ -9,11 +8,16 @@ const CACHE_KEY = "AGE_AND_GENDER_DATASET" export const state: { isReady: boolean - cache?: FileSystemCache + + // unfortunately we cannot use this kind of caching for now, + // as this is Node-only, and break when used in the browser + // import Cache, { FileSystemCache } from "file-system-cache" + //cache?: FileSystemCache + nameToStats: Record } = { isReady: false, - cache: undefined, + // cache: undefined, nameToStats: {}, } @@ -21,26 +25,29 @@ export const state: { export async function loadAgeGenderNameStats() { let nameToStats = {} as Record - if (typeof window === "undefined") { - if (!state.cache) { - state.cache = Cache({ - basePath: ".age_and_gender_dataset_cache", // await getRandomDirectory() - ttl: 30 * 24 * 60 // (optional) A time-to-live (in secs) on how long an item remains cached. - }); - } - - - try { - const rawString = await state.cache.get(CACHE_KEY) - nameToStats = JSON.parse(rawString) as Record - if (Object.keys(nameToStats).length === 0) { - throw new Error(`failed to load the dataset`) - } - return nameToStats - } catch (err) { - nameToStats = {} - } - } + // unfortunately we cannot use this kind of caching for now, + // as this is Node-only, and break when used in the browser + // import Cache, { FileSystemCache } from "file-system-cache" + // if (typeof window === "undefined") { + // if (!state.cache) { + // state.cache = Cache({ + // basePath: ".age_and_gender_dataset_cache", // await getRandomDirectory() + // ttl: 30 * 24 * 60 // (optional) A time-to-live (in secs) on how long an item remains cached. + // }); + // } + // + // + // try { + // const rawString = await state.cache.get(CACHE_KEY) + // nameToStats = JSON.parse(rawString) as Record + // if (Object.keys(nameToStats).length === 0) { + // throw new Error(`failed to load the dataset`) + // } + // return nameToStats + // } catch (err) { + // nameToStats = {} + // } + // } const url = "https://huggingface.co/datasets/jbilcke-hf/detection-of-age-and-gender/resolve/main/baby-names-us-year-of-birth-full.csv?download=true" @@ -68,12 +75,15 @@ export async function loadAgeGenderNameStats() { nameToStats[key].sort((a, b) => b[1] - a[1]) }) - if (typeof window === "undefined" && state.cache) { - try { - await state.cache.set(CACHE_KEY, JSON.stringify(nameToStats)) - } catch (err) { - console.error(`failed to cache the dataset: ${err}`) - } - } + // unfortunately we cannot use this kind of caching for now, + // as this is Node-only, and break when used in the browser + // import Cache, { FileSystemCache } from "file-system-cache" + // if (typeof window === "undefined" && state.cache) { + // try { + // await state.cache.set(CACHE_KEY, JSON.stringify(nameToStats)) + // } catch (err) { + // console.error(`failed to cache the dataset: ${err}`) + // } + // } return nameToStats } diff --git a/packages/broadway/src/utils/getRandomDirectory.ts b/packages/broadway/src/utils/getRandomDirectory.txt similarity index 100% rename from packages/broadway/src/utils/getRandomDirectory.ts rename to packages/broadway/src/utils/getRandomDirectory.txt diff --git a/packages/broadway/src/utils/index.ts b/packages/broadway/src/utils/index.ts index 74d905ef..44438926 100644 --- a/packages/broadway/src/utils/index.ts +++ b/packages/broadway/src/utils/index.ts @@ -1,6 +1,9 @@ export { cleanUTF8Characters } from "./cleanUTF8Characters" export { deduplicate } from "./deduplicate" export { getEntities } from "./getEntities" + + // unfortunately we cannot use this kind of export right now, + // as this is Node-only, and breaks when used in the browser // export { getRandomDirectory } from "./getRandomDirectory" export { isAllCaps } from "./isAllCaps" export { onlyContainsStrangeNumber } from "./onlyContainsStrangeNumber" From d37a16c8307e47209cabda378be769b20ff99e8b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 27 May 2024 16:56:07 +0200 Subject: [PATCH 081/346] put more node utils inside aitube-io --- packages/aitube-io/README.md | 1 + packages/aitube-io/bun.lockb | Bin 29700 -> 28648 bytes packages/aitube-io/package.json | 9 +++--- packages/aitube-io/src/index.ts | 1 + packages/aitube-io/src/read/index.ts | 1 + .../src/read/readLocalOrRemotePlainText.ts | 28 ++++++++++++++++++ .../aitube-io/src/tmp/getRandomDirectory.ts | 4 +-- packages/aitube-io/src/tmp/uuid.ts | 5 ++++ 8 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 packages/aitube-io/src/read/readLocalOrRemotePlainText.ts create mode 100644 packages/aitube-io/src/tmp/uuid.ts diff --git a/packages/aitube-io/README.md b/packages/aitube-io/README.md index b59295c7..6ec1fca0 100644 --- a/packages/aitube-io/README.md +++ b/packages/aitube-io/README.md @@ -32,6 +32,7 @@ import { convertImageToWebp, resizeImage, readJpegFileToBase64, + readLocalOrRemotePlainText, readMp3FileToBase64, readMp4FileToBase64, readPlainText, diff --git a/packages/aitube-io/bun.lockb b/packages/aitube-io/bun.lockb index a4bb7afc1a322f6c962dc144f7f491bf2e8650f9..739d9da8b3d96df50bc099b2ada453e030874f97 100755 GIT binary patch delta 7382 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 diff --git a/packages/aitube-io/package.json b/packages/aitube-io/package.json index 53d7a1ae..0c47d10e 100644 --- a/packages/aitube-io/package.json +++ b/packages/aitube-io/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "Collection of useful I/O utilities for NodeJS. Used by AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -14,17 +14,16 @@ }, "devDependencies": { "@types/mime-types": "^2.1.4", - "@types/uuid": "^9.0.8", "bun-types": "latest", "prettier": "^3.2.5", - "rimraf": "^5.0.5", + "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": {}, "dependencies": { "mime-types": "^2.1.35", - "sharp": "^0.33.3", - "uuid": "^9.0.1" + "pure-uuid": "^1.8.1", + "sharp": "^0.33.4" }, "repository": { "type": "git", diff --git a/packages/aitube-io/src/index.ts b/packages/aitube-io/src/index.ts index 18896003..97f1eb24 100644 --- a/packages/aitube-io/src/index.ts +++ b/packages/aitube-io/src/index.ts @@ -21,6 +21,7 @@ export type { ImageFileExt } from "./image" export { readJpegFileToBase64, + readLocalOrRemotePlainText, readMp3FileToBase64, readMp4FileToBase64, readPlainText, diff --git a/packages/aitube-io/src/read/index.ts b/packages/aitube-io/src/read/index.ts index 4ed659f2..5decb97b 100644 --- a/packages/aitube-io/src/read/index.ts +++ b/packages/aitube-io/src/read/index.ts @@ -1,4 +1,5 @@ export { readJpegFileToBase64 } from "./readJpegFileToBase64" +export { readLocalOrRemotePlainText } from "./readLocalOrRemotePlainText" export { readMp3FileToBase64 } from "./readMp3FileToBase64" export { readMp4FileToBase64 } from "./readMp4FileToBase64" export { readPlainText } from "./readPlainText" diff --git a/packages/aitube-io/src/read/readLocalOrRemotePlainText.ts b/packages/aitube-io/src/read/readLocalOrRemotePlainText.ts new file mode 100644 index 00000000..7f81325f --- /dev/null +++ b/packages/aitube-io/src/read/readLocalOrRemotePlainText.ts @@ -0,0 +1,28 @@ +import { readPlainText } from "./readPlainText" + +export async function readLocalOrRemotePlainText(input: string): Promise { + + if (input.startsWith("https://") || input.startsWith("http://")) { + try { + const res = await fetch(input) + return res.text() + } catch (err) { + return input + } + } + + // (probably) too long to be a filepath + if (input.length > 4096) { + return input + } + + if (input.endsWith(".txt") || input.endsWith(".md")) { + try { + return readPlainText(input) + } catch (err) { + return input + } + } + + return input +} \ No newline at end of file diff --git a/packages/aitube-io/src/tmp/getRandomDirectory.ts b/packages/aitube-io/src/tmp/getRandomDirectory.ts index 40b37a2a..b9c0f23c 100644 --- a/packages/aitube-io/src/tmp/getRandomDirectory.ts +++ b/packages/aitube-io/src/tmp/getRandomDirectory.ts @@ -2,8 +2,8 @@ import { tmpdir } from "node:os" import { join } from "node:path" import { mkdtemp } from "node:fs/promises" -import { v4 as uuidv4 } from "uuid" +import { UUID } from "./uuid" export async function getRandomDirectory(): Promise { - return mkdtemp(join(tmpdir(), uuidv4())) + return mkdtemp(join(tmpdir(), UUID())) } \ No newline at end of file diff --git a/packages/aitube-io/src/tmp/uuid.ts b/packages/aitube-io/src/tmp/uuid.ts new file mode 100644 index 00000000..b2452e0e --- /dev/null +++ b/packages/aitube-io/src/tmp/uuid.ts @@ -0,0 +1,5 @@ +import PureUUID from "pure-uuid" + +export function UUID() { + return new PureUUID(4).format() +} \ No newline at end of file From 3610f81dec0361639b62e9b07bd49e148f8b47a3 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 27 May 2024 17:02:21 +0200 Subject: [PATCH 082/346] 0.0.8 --- packages/broadway/bun.lockb | Bin 20345 -> 32464 bytes packages/broadway/package.json | 3 +- .../src/analysis/parseScriptToClap.ts | 9 ++---- packages/broadway/src/index.ts | 2 -- packages/broadway/src/tests/main.test.ts | 7 ++++- .../broadway/src/utils/getRandomDirectory.txt | 9 ------ packages/broadway/src/utils/index.ts | 6 ---- .../src/utils/readLocalOrRemotePlainText.ts | 28 ------------------ packages/broadway/src/utils/readPlainText.ts | 13 -------- 9 files changed, 11 insertions(+), 66 deletions(-) delete mode 100644 packages/broadway/src/utils/getRandomDirectory.txt delete mode 100644 packages/broadway/src/utils/readLocalOrRemotePlainText.ts delete mode 100644 packages/broadway/src/utils/readPlainText.ts diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 667de886b5c1a888ed5aec57d6183a153d042643..d00adc273d8ed2286f22218d66a5a92c4c7fa6c7 100755 GIT binary patch delta 11119 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 delta 3304 zcmb_eYiv|i5WZ)-+wCoFm#t8^U9klUB9HC6TWq(tR;(1Hh!0Aawn|H-#Ue{-6)@0E zz(-LLG7?P$Yz!DN(MYO)j79|?sSgx2YBh@Whlvp%)F&v_@4I_1qNzVLo@CD4d7Lvd zXXea3Z=X@8_Nkr0i&lNruW!9InzgsTHur-Pv+3FDSn=~;-||Is*VK=1_s!h%Wvyn7 z;$3xFJwrutB0i7RwAkhN91oleJP~*pI2|~m;0EJxrmgB& z+YFX=FhSGCfWM~wruOKH_3OU}t@nV@#}D8mZcXz6PxNS78u0x#{}5<8wjVeZcyD4{ zKMG7k^SyB#2Au+W5cCA#qrfz%YBZHTmeed~r+;FI7ppqJnk9gnW)YMXOo>&9qjYgbo$Yv=izR%}H+2q_&o z3d{|!gf&J2BNpDcVoe7=wfDiNUVnDNPG#)$96#QXdE1jkr&FG*+kL3%v4l%zH{Nyg zcqK#Sro_hRq9>YaztmuMOE2aQ8NmF6=w4I(AT?goQ{~dMDp}+$Q`=+!-1kLKGW974 z5Ooprh~FDhOQko-R8PqO<_ytwQ`Jfh=3eQ={EiIhram3HnTHihjwOcl)u1j0l^}jS zq+XQXWK&PTX_J>^X}oGvUh$`d^b};M9I`|?rib*aY|2AQ?T~>nrut6w6jQH81}m&R zxN4hCxn+qrJss(-gbdNbdL1a* z&}9j%@0Q*)Qw_=h<_V(vOuZWkqTJ1$RKN6smx*K*fakJeyW%WGFSmfIwq&3@$3Rs{ zYD$^sJmk7mQhjA=x#)gViPT{JTzWBQ$N=UB(bG-W-ZWW|S>ZaKCfhShq%twd<@3pQ zqeSu&-93m|Bj8H1Ff0uJHDr~AV~uk$^Vn+!lfX*mEcoCe?^CVvJAjB_#dE&>qG1aJ^je-42BptcaR^${23 z$4PB8OvegsIWadX0dS)bK$A0p3Ft;h3MUL=u0j!6T4gpy8CipvyO?qEEGGFM^V0Kw zCB}02-{-}O|Nlr#{78a8JfYF@K@IZ%k{A3|Mo&zb>i;=0{im|7@XKZ83ss@)DqpNC zZNxW%#1~0^*QCRk96es_#k%{fHj96XAOs@Rp%zp z#y53%cD&V;IYp0uq~;{nIbYt^^8u7OXUdCr0pJEQS@4e0Y0`lu&ek1cu8pI0hnrb zBK*-TpV2<8xH5s+Y1n<}Hr?cbvYAW*WC11u=qj!A3~~X}HLcD%Bz6gQ5_S*9##rb( z4~Pen4PfVC%sGI`0LIGLNK-~U-|7nZtCb?Q>8e0lmwuZ;Z|D^_-C)<_rxlX6tXZ}% zTM*z{*2hEBVzX!6*4mt;nu>!(LHM65-!3zXFNYj~#Zu=socet1w5=}Hlo!kkVk3rt zuwvNyO?!C*ix7?Uj&6WL>?XhUKn*(#j9!*;?{p zeP+OUycp@}9oJ0ty@#C&gO<+yk{U5opIjIzR0m}_zQ335$gJ>hC=;aR?E9?#`ENXX zKK*(IRu;f}RGjl-t6TEkqQ>EYAxN+z?e3RPB1XV@!9BWhWNl$z;1W0E&Zp6^_?H`j z>rt(|dcT~$we9e-`wqBN4LB3PiOTB@#^QTHp-^Hg>yI4X=j-#h)FyCvlFnQ3+ILUn zY+5_E9+pev(L4hU6j&@j`Q%qKtH-%r>Je~Ic6g&a4x7$v@l1z$GCF16M_5@DUm2C5 z<%XIsze3A-0-jhIx%QLt7v@>}TagV)ZiAtyn{fe-zN;7}XsFe)srz_^V5%Tk zIw+HxU<;>*w@&O&IjO@a7CX+TGbYr@Om-rL0>Wkf~e7%TH?qQocD0 IFWU$H07?WAWdHyG diff --git a/packages/broadway/package.json b/packages/broadway/package.json index c788f6a2..3cba30e7 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.7", + "version": "0.0.8", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -14,6 +14,7 @@ }, "devDependencies": { "@aitube/clap": "0.0.22", + "@aitube/io": "0.0.1", "bun-types": "latest", "prettier": "^3.2.5", "rimraf": "^5.0.7", diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts index f6426a87..59f53b79 100644 --- a/packages/broadway/src/analysis/parseScriptToClap.ts +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -1,9 +1,9 @@ import { ClapMediaOrientation, ClapProject, newClap, UUID } from "@aitube/clap" import { cleanUTF8Characters } from "@/utils" -import { getScreenplayFromText } from "./getScreenplayFromText" import { analyzeScreenplay } from "@/analysis/analyzeScreenplay" -import { readLocalOrRemotePlainText } from "@/utils/readLocalOrRemotePlainText" + +import { getScreenplayFromText } from "./getScreenplayFromText" export type ParseScriptProgressUpdate = ({ value, @@ -21,11 +21,8 @@ export async function parseScriptToClap( input: string, onProgressUpdate: ParseScriptProgressUpdate = defaultParseScriptProgressUpdate ): Promise { - - let content = await readLocalOrRemotePlainText(input) - // fix any mess which might be in it - content = cleanUTF8Characters(content) + const content = cleanUTF8Characters(input) await onProgressUpdate({ value: 10 }) diff --git a/packages/broadway/src/index.ts b/packages/broadway/src/index.ts index a8d378bc..197f6883 100644 --- a/packages/broadway/src/index.ts +++ b/packages/broadway/src/index.ts @@ -78,7 +78,5 @@ export { isAllCaps, onlyContainsStrangeNumber, pick, - readLocalOrRemotePlainText, - readPlainText, sleep } from "./utils" diff --git a/packages/broadway/src/tests/main.test.ts b/packages/broadway/src/tests/main.test.ts index 4ef7ae35..2c8d94f3 100644 --- a/packages/broadway/src/tests/main.test.ts +++ b/packages/broadway/src/tests/main.test.ts @@ -1,7 +1,8 @@ import { test, expect, describe } from "bun:test" import { ClapProject, serializeClap } from "@aitube/clap" +import { readPlainText } from "@aitube/io" -import { parseScriptToClap, readPlainText } from ".." +import { parseScriptToClap } from ".." // hack for Bun require("./bun-shims.js") @@ -27,5 +28,9 @@ describe("main demo", async () => { // example: // first time (need to download the dataset): [7.40s] // second time (with the dataset cached): [839.00ms] + // + // UPDATE: + // we currently don't cache the result, + // because this was too much platform-specific (file system caching, so for Node only) 30000) }) \ No newline at end of file diff --git a/packages/broadway/src/utils/getRandomDirectory.txt b/packages/broadway/src/utils/getRandomDirectory.txt deleted file mode 100644 index 49c0c3fc..00000000 --- a/packages/broadway/src/utils/getRandomDirectory.txt +++ /dev/null @@ -1,9 +0,0 @@ -import { UUID } from "@aitube/clap" - -import { tmpdir } from "node:os" -import { join } from "node:path" -import { mkdtemp } from "node:fs/promises" - -export async function getRandomDirectory(): Promise { - return mkdtemp(join(tmpdir(), UUID())) -} \ No newline at end of file diff --git a/packages/broadway/src/utils/index.ts b/packages/broadway/src/utils/index.ts index 44438926..09fda714 100644 --- a/packages/broadway/src/utils/index.ts +++ b/packages/broadway/src/utils/index.ts @@ -1,13 +1,7 @@ export { cleanUTF8Characters } from "./cleanUTF8Characters" export { deduplicate } from "./deduplicate" export { getEntities } from "./getEntities" - - // unfortunately we cannot use this kind of export right now, - // as this is Node-only, and breaks when used in the browser -// export { getRandomDirectory } from "./getRandomDirectory" export { isAllCaps } from "./isAllCaps" export { onlyContainsStrangeNumber } from "./onlyContainsStrangeNumber" export { pick } from "./pick" -export { readLocalOrRemotePlainText } from "./readLocalOrRemotePlainText" -export { readPlainText } from "./readPlainText" export { sleep } from "./sleep" diff --git a/packages/broadway/src/utils/readLocalOrRemotePlainText.ts b/packages/broadway/src/utils/readLocalOrRemotePlainText.ts deleted file mode 100644 index 7f81325f..00000000 --- a/packages/broadway/src/utils/readLocalOrRemotePlainText.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { readPlainText } from "./readPlainText" - -export async function readLocalOrRemotePlainText(input: string): Promise { - - if (input.startsWith("https://") || input.startsWith("http://")) { - try { - const res = await fetch(input) - return res.text() - } catch (err) { - return input - } - } - - // (probably) too long to be a filepath - if (input.length > 4096) { - return input - } - - if (input.endsWith(".txt") || input.endsWith(".md")) { - try { - return readPlainText(input) - } catch (err) { - return input - } - } - - return input -} \ No newline at end of file diff --git a/packages/broadway/src/utils/readPlainText.ts b/packages/broadway/src/utils/readPlainText.ts deleted file mode 100644 index 6b3d5901..00000000 --- a/packages/broadway/src/utils/readPlainText.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { readFile } from "node:fs/promises" - -export async function readPlainText(filePath: string): Promise { - try { - const plainText = await readFile(filePath, "utf-8") - - return plainText - } catch (error) { - // Handle errors (e.g., file not found, no permissions, etc.) - console.error(error) - throw error - } -} From 2d26b7922500e0c8f64a108c7fe0a969a52fd76e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 28 May 2024 12:59:14 +0200 Subject: [PATCH 083/346] first commit --- packages/aitube-colors/.gitignore | 179 +++++++++++++++ packages/aitube-colors/.npmignore | 4 + packages/aitube-colors/.prettierrc.json | 9 + packages/aitube-colors/LICENSE.md | 21 ++ packages/aitube-colors/README.md | 54 +++++ packages/aitube-colors/bun.lockb | Bin 0 -> 17292 bytes packages/aitube-colors/package.json | 41 ++++ .../aitube-colors/src/constants/colors.ts | 54 +++++ packages/aitube-colors/src/constants/index.ts | 8 + .../aitube-colors/src/constants/segments.ts | 211 ++++++++++++++++++ packages/aitube-colors/src/index.ts | 12 + packages/aitube-colors/src/types.ts | 11 + packages/aitube-colors/tsconfig.json | 31 +++ packages/aitube-colors/tsconfig.types.json | 14 ++ 14 files changed, 649 insertions(+) create mode 100644 packages/aitube-colors/.gitignore create mode 100644 packages/aitube-colors/.npmignore create mode 100644 packages/aitube-colors/.prettierrc.json create mode 100644 packages/aitube-colors/LICENSE.md create mode 100644 packages/aitube-colors/README.md create mode 100755 packages/aitube-colors/bun.lockb create mode 100644 packages/aitube-colors/package.json create mode 100644 packages/aitube-colors/src/constants/colors.ts create mode 100644 packages/aitube-colors/src/constants/index.ts create mode 100644 packages/aitube-colors/src/constants/segments.ts create mode 100644 packages/aitube-colors/src/index.ts create mode 100644 packages/aitube-colors/src/types.ts create mode 100644 packages/aitube-colors/tsconfig.json create mode 100644 packages/aitube-colors/tsconfig.types.json diff --git a/packages/aitube-colors/.gitignore b/packages/aitube-colors/.gitignore new file mode 100644 index 00000000..5696d8f8 --- /dev/null +++ b/packages/aitube-colors/.gitignore @@ -0,0 +1,179 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +.age_and_gender_dataset_cache + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo diff --git a/packages/aitube-colors/.npmignore b/packages/aitube-colors/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-colors/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-colors/.prettierrc.json b/packages/aitube-colors/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-colors/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-colors/LICENSE.md b/packages/aitube-colors/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-colors/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-colors/README.md b/packages/aitube-colors/README.md new file mode 100644 index 00000000..25c09e57 --- /dev/null +++ b/packages/aitube-colors/README.md @@ -0,0 +1,54 @@ +# @aitube/colors + +*Various color settings and utilities for AiTube* + +## Installation + +Run the following command (`@aitube/clap` is a peer dependency): + +```bash +# this depends on your package manager, eg: +npm install @aitube/colors @aitube/clap +# or: +bun i @aitube/colors @aitube/clap +``` + +## Getting Started + +```typescript +import { ... } from '@aitube/colors' + +... + +``` + +## Note to developers + +Use at your perils! + +## Build Instructions + +Install [Bun](https://bun.sh/) + +Run the following commands: + +```bash +bun install + +bun run build +``` + +To publish: + +```bash +bun run build + +bun run build:declaration + +bun run publish +``` + +## License + +This package is under the MIT License. See `LICENSE` file for more details. +Also please don't destroy the planet with my code. diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..a9d26ac81fe057d436db8e17a23a50a72a5df79a GIT binary patch literal 17292 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 Date: Tue, 28 May 2024 13:04:04 +0200 Subject: [PATCH 084/346] 0.0.9 --- packages/broadway/README.md | 6 +- packages/broadway/bun.lockb | Bin 32464 -> 32858 bytes packages/broadway/package.json | 3 +- packages/broadway/src/constants/colors.ts | 54 ----- packages/broadway/src/constants/index.ts | 7 - packages/broadway/src/constants/segments.ts | 211 ------------------ .../broadway/src/factories/createSegment.ts | 5 +- packages/broadway/src/index.ts | 7 - packages/broadway/src/types.ts | 8 - 9 files changed, 8 insertions(+), 293 deletions(-) delete mode 100644 packages/broadway/src/constants/colors.ts delete mode 100644 packages/broadway/src/constants/segments.ts diff --git a/packages/broadway/README.md b/packages/broadway/README.md index b5496e92..6a53d062 100644 --- a/packages/broadway/README.md +++ b/packages/broadway/README.md @@ -4,13 +4,13 @@ ## Installation -To install Broadway run the following command (`@aitube/clap` is a peer dependency): +To install Broadway run the following command (some modules are peer dependencies): ```bash # this depends on your package manager, eg: -npm install @aitube/broadway @aitube/clap +npm install @aitube/broadway @aitube/clap @aitube/colors # or: -bun i @aitube/broadway @aitube/clap +bun i @aitube/broadway @aitube/clap @aitube/colors ``` ## Getting Started diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index d00adc273d8ed2286f22218d66a5a92c4c7fa6c7..eb19cd5885c3df41c753029b0702308687bd3036 100755 GIT binary patch delta 4783 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 diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 3cba30e7..bf6cb9a8 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "Convert a script to a clap file", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -14,6 +14,7 @@ }, "devDependencies": { "@aitube/clap": "0.0.22", + "@aitube/colors": "0.0.0", "@aitube/io": "0.0.1", "bun-types": "latest", "prettier": "^3.2.5", diff --git a/packages/broadway/src/constants/colors.ts b/packages/broadway/src/constants/colors.ts deleted file mode 100644 index 9dd4dd71..00000000 --- a/packages/broadway/src/constants/colors.ts +++ /dev/null @@ -1,54 +0,0 @@ - -// important: not all colors have the same values! -// for instance the red and gray(s) have a slightly lighter border bottom, -// because they look better this way -export const segmentColorsTailwind = { - blue: `bg-blue-400 shadow-blue-600/50 border-l-blue-400/80 border-r-blue-400/80 border-t-blue-300/40 border-b-blue-500/80 text-blue-900`, - red: `bg-red-400 shadow-red-600/50 border-l-red-400/80 border-r-red-400/80 border-t-red-300/40 border-b-red-400/80 text-red-900`, - - // - - rose: `bg-rose-400 shadow-rose-600/50 border-l-rose-400/80 border-r-rose-400/80 border-t-rose-300/40 border-b-rose-500/80 text-rose-900`, - green: `bg-green-400 shadow-green-600/50 border-l-green-400/80 border-r-green-400/80 border-t-green-300/40 border-b-green-500/80 text-green-900`, - - green2: `bg-[rgb(162,222,83)] shadow-[rgb(122,162,43)]/50 border-l-[rgb(152,192,73)]/80 border-r-[rgb(152,192,73)]/80 border-t-[rgb(172,212,93)]/40 border-b-[rgb(132,172,53)]/80 text-[rgb(52,92,0)]`, - green3: `bg-[rgb(144,170,137)] shadow-[rgb(124,150,117)]/50 border-l-[rgb(164,190,157)]/80 border-r-[rgb(144,170,137)]/80 border-t-[rgb(174,200,167)]/40 border-b-[rgb(130,157,137)]/80 text-[rgb(44,70,37)]`, - - - violet: `bg-violet-400 shadow-violet-600/50 border-l-violet-400/80 border-r-violet-400/80 border-t-violet-300/40 border-b-violet-500/80 text-violet-900`, - amber: `bg-amber-400 shadow-amber-600/50 border-l-amber-400/80 border-r-amber-400/80 border-t-amber-300/40 border-b-amber-500/80 text-amber-900`, - yellow: `bg-yellow-400 shadow-yellow-600/50 border-l-yellow-400/80 border-r-yellow-400/80 border-t-yellow-300/40 border-b-yellow-500/80 text-yellow-900`, - yellow2: `bg-[rgb(250,204,110)] shadow-[rgb(230,184,90]/50 border-l-[rgb(250,204,110)]/80 border-r-[rgb(250,204,110)]/80 border-t-[rgb(255,224,130)]/40 border-b-[rgb(240,194,100)]/80 text-[rgb(91,72,3)]`, - - teal: `bg-teal-400 shadow-teal-600/50 border-l-teal-400/80 border-r-teal-400/80 border-t-teal-300/40 border-b-teal-500/80 text-teal-900`, - cyan: `bg-cyan-400 shadow-cyan-600/50 border-l-cyan-400/80 border-r-cyan-400/80 border-t-cyan-300/40 border-b-cyan-500/80 text-cyan-900`, - orange: `bg-orange-400 shadow-orange-600/50 border-l-orange-400/80 border-r-orange-400/80 border-t-orange-300/40 border-b-orange-500/80 text-orange-900`, - - orange2: `bg-[rgb(222,162,83)] shadow-[rgb(162,122,43)]/50 border-l-[rgb(192,152,73)]/80 border-r-[rgb(192,152,73)]/80 border-t-[rgb(212,172,93)]/40 border-b-[rgb(172,132,53)]/80 text-[rgb(92,52,0)]`, - - // - - sky: `bg-sky-400 shadow-sky-600/50 border-l-sky-400/80 border-r-sky-400/80 border-t-sky-300/40 border-b-sky-500/80 text-sky-900`, - stone: `bg-stone-400 shadow-stone-600/50 border-l-stone-400/80 border-r-stone-400/80 border-t-stone-300/40 border-b-stone-400/80 text-stone-700`, - // stone2: `bg-stone-500 shadow-stone-700/50 border-l-stone-500/80 border-r-stone-500/80 border-t-stone-400/40 border-b-stone-500/80 text-stone-900`, - sand: `bg-[rgb(200,176,124)] shadow-[rgb(180,156,104)]/50 border-l-[rgb(200,176,124)]/80 border-r-[rgb(200,176,124)]/80 border-t-[rgb(220,196,144)]/40 border-b-[rgb(200,176,124)]/80 text-[rgb(100,76,24)]`, - - zinc: `bg-zinc-400 shadow-zinc-600/50 border-l-zinc-400/80 border-r-zinc-400/80 border-t-zinc-300/40 border-b-zinc-400/80 text-zinc-900`, - zinc2: `bg-zinc-300 shadow-zinc-600/50 border-l-zinc-400/80 border-r-zinc-400/80 border-t-zinc-300/40 border-b-zinc-400/80 text-zinc-600`, - lime: `bg-lime-400 shadow-lime-600/50 border-l-lime-400/80 border-r-lime-400/80 border-t-lime-300/40 border-b-lime-500/80 text-lime-900`, - indigo: `bg-indigo-400 shadow-indigo-600/50 border-l-indigo-400/80 border-r-indigo-400/80 border-t-indigo-300/40 border-b-indigo-500/80 text-indigo-900`, - purple: `bg-purple-400 shadow-purple-600/50 border-l-purple-400/80 border-r-purple-400/80 border-t-purple-300/40 border-b-purple-500/80 text-purple-900`, - purple2: `bg-[rgb(175,191,203)] shadow-[rgb(145,161,173)]/50 border-l-[rgb(175,191,203)]/80 border-r-[rgb(175,191,203)]/80 border-t-[rgb(195,211,223)]/40 border-b-[rgb(145,151,173)]/80 text-[rgb(65,81,93)]`, - - pink: `bg-pink-400 shadow-pink-600/50 border-l-pink-400/80 border-r-pink-400/80 border-t-pink-300/40 border-b-pink-500/80 text-pink-900`, - pink2: `bg-[rgb(191,145,184)] shadow-[rgb(121,85,114)]/50 border-l-[rgb(181,145,174)]/80 border-r-[rgb(181,145,174)]/80 border-t-[rgb(211,175,204)]/40 border-b-[rgb(151,115,144)]/80 text-[rgb(81,45,74)]`, - pink3: `bg-[rgb(191,160,184)] shadow-[rgb(121,100,114)]/50 border-l-[rgb(181,160,174)]/80 border-r-[rgb(181,160,174)]/80 border-t-[rgb(211,190,204)]/40 border-b-[rgb(151,130,144)]/80 text-[rgb(81,60,74)]`, - - neutral: `bg-neutral-400 shadow-neutral-600/50 border-l-neutral-400/80 border-r-neutral-400/80 border-t-neutral-400/40 border-b-neutral-500/80 text-neutral-900`, - neutral2: `bg-[rgb(150,145,135)] shadow-neutral-600/50 border-l-neutral-400/80 border-r-neutral-400/80 border-t-neutral-400/40 border-b-neutral-500/80 text-neutral-700`, - - gray: `bg-gray-400 shadow-gray-600/50 border-l-gray-400/80 border-r-gray-400/80 border-t-gray-300/40 border-b-gray-400/80 text-gray-900`, - gray2: `bg-gray-400 shadow-gray-600/50 border-l-gray-400/80 border-r-gray-400/80 border-t-gray-300/40 border-b-gray-400/80 text-gray-700`, -} - -export type SegmentColor = keyof typeof segmentColorsTailwind diff --git a/packages/broadway/src/constants/index.ts b/packages/broadway/src/constants/index.ts index f431a123..dc033c9c 100644 --- a/packages/broadway/src/constants/index.ts +++ b/packages/broadway/src/constants/index.ts @@ -1,4 +1,3 @@ -export { segmentColorsTailwind, type SegmentColor } from "./colors" export { DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_COLUMNS_PER_STEP, @@ -17,9 +16,3 @@ export { type ScreenplaySequenceTime } from "./screenplaySequences" -export { - segmentCategories, - categoryNames, - getSegment, - getSegmentColor -} from "./segments" diff --git a/packages/broadway/src/constants/segments.ts b/packages/broadway/src/constants/segments.ts deleted file mode 100644 index 0bf4a2b4..00000000 --- a/packages/broadway/src/constants/segments.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { ClapSegmentCategory } from "@aitube/clap" - -import { SegmentColor } from "@/constants/colors" -import { ClapSegmentCategorySettings } from "@/types" - -// this is a special segment used for rendering the scene -const splat: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.SPLAT, - title: "Splat", - description: "Gaussian splatting", - color: "pink", -} - -const mesh: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.MESH, - title: "Mesh", - description: "Render a mesh", - color: "green2" -} - -const depth: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.DEPTH, - title: "Depth map", - description: "Dpeth map", - color: "yellow", -} - -// this is a special segment used for rendering the scene -const video: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.VIDEO, - title: "video", - description: "Render a video", - color: "indigo", -} - -// this is a special segment type used to render preview thumbnails -const storyboard: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.STORYBOARD, - title: "storyboard", - description: "Storyboard preview (image or video)", - color: "indigo", -} - -const action: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.ACTION, - title: "Action", - description: "Action", - color: "orange2", -} - -const character: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.CHARACTER, - title: "Character", - description: "Characters, animals..", - color: "purple", -} - -const location: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.LOCATION, - title: "Location", - description: "Location (country, place, background, furnitures..)", - color: "sand", -} - -const camera: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.CAMERA, - title: "camera", - description: "Camera (position, angle, direction)", - color: "zinc2", -} - -const transition: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.TRANSITION, - title: "transition", - description: "Transition", - color: "teal", -} - -const lighting: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.LIGHTING, - title: "Lighting", - description: "Lighting (natural or artifical)", - color: "neutral2", -} - -const time: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.TIME, - title: "Time", - description: "Time of the day (noon, night..)", - color: "neutral2", -} - -// @deprecated - use `time` and ClapSegmentCategory.TIME instead -const era: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.ERA, - title: "Era", - description: "Era (80s, Ancient Rome..)", - color: "gray", -} - -const weather: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.WEATHER, - title: "Weather", - description: "Weather (sunny, raining, snow..)", - color: "stone", -} - -const sound: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.SOUND, - title: "Sound", - description: "Sound (foreground, background..)", - color: "yellow2", -} - -const music: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.MUSIC, - title: "Music", - description: "Music (foreground, background..)", - color: "green3", -} - -const dialogue: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.DIALOGUE, - title: "Dialogue", - description: "Music (foreground, background..)", - color: "purple2", -} - -const style: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.STYLE, - title: "Style", - description: "Style", - color: "pink3", -} - -/* -const colors: ClapSegmentCategorySettings = { - id: "colors", - title: "Color grading", - description: "Color grading", - color: "pink", -} -*/ - -const generic: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.GENERIC, - title: "Generic", - description: "Generic", - color: "cyan", -} - -// (invisible) an event localized in time -const event: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.EVENT, - title: "Event", - description: "Event", - color: "cyan", -} - -// (visible) an Interface (UI) element -const interface_: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.INTERFACE, - title: "Interface", - description: "Interface", - color: "cyan", -} - -// (invisible) a prompt which defines new event(s) to fire based on event(s) -const phenomenon: ClapSegmentCategorySettings = { - id: ClapSegmentCategory.PHENOMENON, - title: "Phenomenon", - description: "Phenomenon", - color: "cyan", -} - -export const segmentCategories = { - splat, - mesh, - depth, - event, // (invisible) an event localized in time - interface: interface_, // (visible) - phenomenon, // (invisible) a prompt which defines new event(s) to fire based on event(s) - video, - storyboard, - character, - location, - time, - era, - lighting, - weather, - action, - music, - sound, - dialogue, - style, - camera, - transition, - generic, -} - -export const categoryNames = Object.keys(segmentCategories) - -export function getSegment(category?: ClapSegmentCategory): ClapSegmentCategorySettings { - return segmentCategories[category || "generic"] || segmentCategories.generic -} - -export function getSegmentColor(input?: ClapSegmentCategorySettings | ClapSegmentCategory): SegmentColor { - const { color } = !input || typeof input === "string" ? getSegment(input) : input - - return color as SegmentColor -} diff --git a/packages/broadway/src/factories/createSegment.ts b/packages/broadway/src/factories/createSegment.ts index 18c6cc92..b5bb260f 100644 --- a/packages/broadway/src/factories/createSegment.ts +++ b/packages/broadway/src/factories/createSegment.ts @@ -1,6 +1,7 @@ +import { getSegment, segmentCategories, ClapSegmentCategorySettings } from "@aitube/colors" + import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants/general" -import { getSegment, segmentCategories } from "@/constants/segments" -import { ClapSegmentCategorySettings, RenderedScene } from "@/types" +import { RenderedScene } from "@/types" import { pick } from "@/utils" import { generateSeed, parseOutputType, ClapOutputType, ClapSegmentCategory, ClapSegment, UUID, newSegment } from "@aitube/clap" diff --git a/packages/broadway/src/index.ts b/packages/broadway/src/index.ts index 197f6883..cc3571c1 100644 --- a/packages/broadway/src/index.ts +++ b/packages/broadway/src/index.ts @@ -17,8 +17,6 @@ export { } from "./analysis" export { - segmentColorsTailwind, type SegmentColor, - DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_COLUMNS_PER_STEP, DEFAULT_COLUMNS_PER_SLICE, @@ -31,10 +29,6 @@ export { type ScreenplaySequenceType, screenplaySequenceTimes, type ScreenplaySequenceTime, - segmentCategories, - categoryNames, - getSegment, - getSegmentColor } from "./constants" export { createSegment, generateClap } from "./factories" @@ -54,7 +48,6 @@ export { } from "./parsers" export { - type ClapSegmentCategorySettings, type MovieScriptMeta, type MovieScript, type SceneEvent, diff --git a/packages/broadway/src/types.ts b/packages/broadway/src/types.ts index 2f137a86..ebc4f648 100644 --- a/packages/broadway/src/types.ts +++ b/packages/broadway/src/types.ts @@ -1,6 +1,5 @@ import { ScreenplaySequenceType } from "@/constants/screenplaySequences" import { ClapSegmentCategory } from "@aitube/clap" -import { SegmentColor } from "./constants/colors" export type NamedEntity = { label: string @@ -37,13 +36,6 @@ export type SimpleNamedEntityParser = (inputs?: string[], defaultValues?: string export type SimpleOccurrencesCounter = (input: string, minimumOccurrences: number) => Promise> -export interface ClapSegmentCategorySettings { - id: ClapSegmentCategory // eg. "country" - title: string // eg. Country - description: string // description in one sentence - color: SegmentColor // base color name, in lowercase -} - export type MovieScriptMeta = { fileName: string title: string From 9eda1bef9fec3ecc4ee0f0c0a45d18d7e844b6a2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 28 May 2024 13:18:29 +0200 Subject: [PATCH 085/346] 0.0.1 --- packages/aitube-colors/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index b5d63600..523d7bf1 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,12 +4,12 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "Various color settings and utilities for AiTube", "scripts": { - "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", - "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" }, "devDependencies": { From 14363cb988c2afdc1c40417bc510c2ace5fe6be5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 28 May 2024 13:26:10 +0200 Subject: [PATCH 086/346] 0.0.10 --- packages/broadway/bun.lockb | Bin 32858 -> 32858 bytes packages/broadway/package.json | 8 ++++---- ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 152670 -> 157453 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index eb19cd5885c3df41c753029b0702308687bd3036..9e64148b705ef3c6903e66c0b5482df93c20c983 100755 GIT binary patch delta 143 zcmV;A0C4}>fCAcp0+22sk6#P`-9sm47Xlqqr@Iq#hdX_WIn&S2mUa$m)i%2Cu}&Hq zljsRBvzQtUB0w3yxSDvDEc7P7RAeInq6hbd&haK^`f-4ele*I$|5s38MJr>jiL1H< x4tw!grA)h6w4OiB_*uktgEUO+GqJPfJgpo7F|(6d!6lP{Y#@`ca|n}sf8LkQL4g1O delta 143 zcmV;A0C4}>fCAcp0+22s@*Fi2GJ{LvyCn&lIHBkMODb7oeq~-tCn9SC#`ZBRu}&Hq zli39*vyd7UB0!=yJXqOT*hUidM`f-DqD#%ov>_vN-1>le xyO3+YX}%*BwM9GE*bSdE7ZE>_N}03eJgpo7Ftd|c!6lP%aUheha|n}sf8IKKKS%%o diff --git a/packages/broadway/package.json b/packages/broadway/package.json index bf6cb9a8..a1469eab 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,17 +4,17 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.9", + "version": "0.0.10", "description": "Convert a script to a clap file", "scripts": { - "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", - "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" }, "devDependencies": { "@aitube/clap": "0.0.22", - "@aitube/colors": "0.0.0", + "@aitube/colors": "0.0.1", "@aitube/io": "0.0.1", "bun-types": "latest", "prettier": "^3.2.5", diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap index a6da6e860c5fc957ac9b85c77978075072fedc8d..cc299c9759ed59bb6593d09b130ce2c70313b628 100644 GIT binary patch literal 157453 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
wd#8?-QK@R956x(#toa$AM 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 z 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
l42|-*%U>;dI9r@tR_N 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
+ + + \ No newline at end of file diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json new file mode 100644 index 00000000..b6e3e788 --- /dev/null +++ b/packages/aitube-timeline/package.json @@ -0,0 +1,60 @@ +{ + "name": "@aitube/react-timeline", + "module": "index.tsx", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "version": "0.0.0", + "description": "React component to display an OpenClap timeline", + "scripts": { + "build": "bun build --target=node ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @aitube/colors --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", + "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", + "publish": "npm publish --access public", + "dev": "bunx --bun vite", + "serve": "vite preview" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "bun-types": "latest", + "prettier": "^3.2.5", + "rimraf": "^5.0.7", + "typescript": "^5.4.5" + }, + "peerDependencies": { + "@aitube/clap": "0.0.22", + "@aitube/colors": "0.0.0", + "@radix-ui/react-slider": "^1.1.2", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.105.4", + "@react-three/fiber": "^8.16.2", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "clsx": "^2.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwind-merge": "^2.3.0", + "tailwindcss": "^3.4.3", + "three": "^0.164.1", + "typescript": "^5.4.5", + "zustand": "4.5.2" + }, + "dependencies": {}, + "repository": { + "type": "git", + "url": "https://github.com/jbilcke-hf/aitube-react-timeline.git" + }, + "keywords": [ + "OpenClap", + "AiTube" + ], + "author": "Julian Bilcke", + "license": "MIT", + "files": [ + "dist/*.js", + "dist/*.d.ts", + "dist/**/*.d.ts" + ] +} diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx new file mode 100644 index 00000000..8eed31ee --- /dev/null +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -0,0 +1,36 @@ +import { Canvas } from "@react-three/fiber" +import { OrthographicCamera, Stats } from "@react-three/drei" + +import { + TimelineControls, + HorizontalScroller, + VerticalScroller, + TimelineGrid +} from "@/components" + +export function ClapTimeline({ + showFPS + }: { + showFPS?: false + } = { + showFPS: false + }) { + return ( +
+
+
+ + + + + {showFPS && } + + +
+ +
+
+ ); +}; diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx new file mode 100644 index 00000000..cc68c569 --- /dev/null +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -0,0 +1,42 @@ +import { MapControls } from "@react-three/drei" + +export function TimelineControls() { + + // TODO: we should create a new class extending from MapControls + // and add some custom code to put limits, to avoid going out of bounds + // I also don't like how scroll is working on macOS, because the mouse wheel + // creates a natural damping effect, which create an acceleration hard to stop + // it it's hard to stop the zoom "in time" + return ( + + ); +}; diff --git a/packages/aitube-timeline/src/components/controls/index.ts b/packages/aitube-timeline/src/components/controls/index.ts new file mode 100644 index 00000000..05c2eb0e --- /dev/null +++ b/packages/aitube-timeline/src/components/controls/index.ts @@ -0,0 +1 @@ +export { TimelineControls } from "./TimelineControls" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx new file mode 100644 index 00000000..d732e3e9 --- /dev/null +++ b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx @@ -0,0 +1,242 @@ +import React, { useEffect, useRef, useState } from "react" +import { GradientTexture, Plane, Text, RoundedBox, Center, Billboard, Html, MeshPortalMaterial } from "@react-three/drei" +import { useThree } from "@react-three/fiber" +import { useSpring, a, animated, config } from "@react-spring/three" + +import { DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS } from "@/constants" +import { clampWebGLText, getSegmentColorHex } from "@/utils" +import { + usePreviewTrackHeight, + useCellWidth, + useStandardTrackHeight, + useVisibleSegments, + useAxis, + useGridLines +} from "@/hooks" + +export function TimelineGrid() { + const { size, viewport } = useThree() + + const previewCellHeight = usePreviewTrackHeight() + const cellHeight = useStandardTrackHeight() // cellHeight + const cellWidth = useCellWidth() // 10 + + const nbMaxShots = ((3 * 60 * 60) / 2) // 3 hours converted to seconds, and divided by 2 (a shot is about 2 sec) + const nbMaxTracks = DEFAULT_NB_TRACKS + + const [scale, setScale] = useState(50) + + const aspect = size.width / viewport.width; + + const controls = useThree((state) => state.controls) + const camera = useThree((state) => state.camera) + + const width = nbMaxShots * cellWidth + const height = nbMaxTracks * cellHeight + + const axis = useAxis(width, height) + const gridlines = useGridLines({ + cellHeight, + cellWidth, + nbMaxTracks, + nbMaxShots, + }); + + // note: this one is async, so it creates a delay + // we could cheat by detecting the cell width change and apply it + // faster on the current geometries + const visibleSegments = useVisibleSegments({ + cellHeight, + cellWidth, + nbMaxTracks, + }); + + const [hovered, setHovered] = useState("") + + useEffect(() => { + document.body.style.cursor = hovered ? 'pointer' : 'auto' + + return () => { document.body.style.cursor = 'auto' } + }, [hovered]) + + const [props, set] = useSpring(() => ({ + pos: [0, 0, 0], + scale: [1, 1, 1], + rotation: [0, 0, 0], + config: { mass: 10, tension: 1000, friction: 300, precision: 0.00001 } + })) + + return ( + + + {/* background */} + + + + {gridlines.map((lineGeometry, idx) => ( + + + + ))} + + + + {axis.map((lineGeometry, idx) => ( + + + + ))} + + + + {visibleSegments.map((s) => { + + // this depends on the current row height + const maxNbLines = 2 + + const durationInSteps = (s.endTimeInMs - s.startTimeInMs) * DEFAULT_DURATION_IN_MS_PER_STEP + + const startTimeInSteps = s.startTimeInMs * DEFAULT_DURATION_IN_MS_PER_STEP + + // note: an alternative could be to create a small fade or blur effect, + // but I think it might be expensive + const lines = clampWebGLText( + s.label, + durationInSteps * cellWidth, + maxNbLines + ) + // const label = clampWebGLTextNaive(s.label, durationInSteps * cellWidth) + + return ( + + console.log('click')} + onContextMenu={(e) => console.log('context menu')} + onDoubleClick={(e) => console.log('double click')} + // onWheel={(e) => console.log('wheel spins')} + // onPointerUp={(e) => console.log('up')} + // onPointerDown={(e) => console.log('down')} + // onPointerOver={(e) => console.log('over')} + // onPointerOut={(e) => console.log('out')} + onPointerEnter={(e) => { + console.log('enter') + setHovered(s.id) + }} + onPointerLeave={(e) => { + console.log('leave') + setHovered(s.id) + }} + // onPointerMove={(e) => console.log('move')} + // onPointerMissed={() => console.log('missed')} + // onUpdate={(self) => console.log('props have been updated')} + > + + {/* + number[]} // Override default positioning function. (default=undefined) [ignored in transform mode] + // occlude={[ref]} // Can be true or a Ref[], true occludes the entire scene (default: undefined) + // onOcclude={(visible) => null} // Callback when the visibility changes (default: undefined) + // {...groupProps} // All THREE.Group props are valid + // {...divProps} // All HTMLDivElement props are valid + > +
+ {s.label || ""} +
+ + */} + + + + {lines.join("\n")} + + + +
+
+ ) + })} +
+ +
+
+ ); +}; diff --git a/packages/aitube-timeline/src/components/grid/index.ts b/packages/aitube-timeline/src/components/grid/index.ts new file mode 100644 index 00000000..d2b71c92 --- /dev/null +++ b/packages/aitube-timeline/src/components/grid/index.ts @@ -0,0 +1 @@ +export { TimelineGrid } from "./TimelineGrid" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/index.ts b/packages/aitube-timeline/src/components/index.ts new file mode 100644 index 00000000..29b46ec3 --- /dev/null +++ b/packages/aitube-timeline/src/components/index.ts @@ -0,0 +1,3 @@ +export { TimelineControls } from "./controls" +export { HorizontalScroller, VerticalScroller } from "./scroller" +export { TimelineGrid } from "./grid" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx new file mode 100644 index 00000000..6199de93 --- /dev/null +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -0,0 +1,40 @@ +import { HorizontalSlider } from "@/components/slider" +import { useTimelineState } from "@/hooks/useTimelineState" + +export function HorizontalScroller() { + const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) + const maxHorizontalZoomLevel = useTimelineState((s) => s.maxHorizontalZoomLevel) + const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) + const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) + + const handleZoomChange = (newRange: number[]) => { + setHorizontalZoomLevel(newRange[0]) + } + + // TODO: we want to control two things: + // on mouse click & drag, we want to move horizontally inside the timeline + // on mouse wheel (on hover), we want to adjust the horizontal time scale + + return ( + <> +
+ { + console.log("HorizontalTimelineSlider: received a mouse wheel event:", { + deltaX: e.deltaX, + deltaY: e.deltaY, + z: e.deltaZ + }) + }} + /> +
+ + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx new file mode 100644 index 00000000..566ab7c0 --- /dev/null +++ b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx @@ -0,0 +1,40 @@ +import { VerticalSlider } from "@/components/slider" +import { useTimelineState } from "@/hooks/useTimelineState" + +export function VerticalScroller() { + const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) + const maxHorizontalZoomLevel = useTimelineState((s) => s.maxHorizontalZoomLevel) + const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) + const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) + + const handleZoomChange = (newRange: number[]) => { + setHorizontalZoomLevel(newRange[0]) + } + + // TODO: we want to control two things: + // on mouse click & drag, we want to move horizontally inside the timeline + // on mouse wheel (on hover), we want to adjust the horizontal time scale + + return ( + <> +
+ { + console.log("VerticalTimelineSlider: received a mouse wheel event:", { + deltaX: e.deltaX, + deltaY: e.deltaY, + z: e.deltaZ + }) + }} + /> +
+ + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/scroller/index.ts b/packages/aitube-timeline/src/components/scroller/index.ts new file mode 100644 index 00000000..1f4f00a3 --- /dev/null +++ b/packages/aitube-timeline/src/components/scroller/index.ts @@ -0,0 +1,2 @@ +export { HorizontalScroller } from "./HorizontalScroller" +export { VerticalScroller } from "./VerticalScroller" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx b/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx new file mode 100644 index 00000000..9f65b481 --- /dev/null +++ b/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx @@ -0,0 +1,24 @@ +import * as React from "react" + +import { cn } from "@/utils/cn" + +import { TimelineSliderBase } from "./TimelineSliderBase" + +const HorizontalSlider = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +HorizontalSlider.displayName = "HorizontalSlider" + +export { HorizontalSlider } diff --git a/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx b/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx new file mode 100644 index 00000000..ac31fde3 --- /dev/null +++ b/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx @@ -0,0 +1,39 @@ +import * as React from "react" +import * as SliderPrimitive from "@radix-ui/react-slider" + +import { cn } from "@/utils/cn" + +const TimelineSliderBase = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + trackClass?: string + rangeClass?: string + thumbClass?: string + } +>(({ className, trackClass, rangeClass, thumbClass, ...props }, ref) => ( + + + + + + +)) +TimelineSliderBase.displayName = "TimelineSliderBase" + +export { TimelineSliderBase } diff --git a/packages/aitube-timeline/src/components/slider/VerticalSlider.tsx b/packages/aitube-timeline/src/components/slider/VerticalSlider.tsx new file mode 100644 index 00000000..e7a60d00 --- /dev/null +++ b/packages/aitube-timeline/src/components/slider/VerticalSlider.tsx @@ -0,0 +1,24 @@ +import * as React from "react" + +import { cn } from "@/utils/cn" + +import { TimelineSliderBase } from "./TimelineSliderBase" + +const VerticalSlider = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +VerticalSlider.displayName = "VerticalSlider" + +export { VerticalSlider } diff --git a/packages/aitube-timeline/src/components/slider/index.ts b/packages/aitube-timeline/src/components/slider/index.ts new file mode 100644 index 00000000..8dd32d20 --- /dev/null +++ b/packages/aitube-timeline/src/components/slider/index.ts @@ -0,0 +1,3 @@ +export { HorizontalSlider } from "./HorizontalSlider" +export { TimelineSliderBase } from "./TimelineSliderBase" +export { VerticalSlider } from "./VerticalSlider" \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/colors.ts b/packages/aitube-timeline/src/constants/colors.ts new file mode 100644 index 00000000..31f0d18f --- /dev/null +++ b/packages/aitube-timeline/src/constants/colors.ts @@ -0,0 +1 @@ +export const colors = ["blue", "red", "hotpink", "green", "orange", "yellow"]; \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/grid.ts b/packages/aitube-timeline/src/constants/grid.ts new file mode 100644 index 00000000..6adcd158 --- /dev/null +++ b/packages/aitube-timeline/src/constants/grid.ts @@ -0,0 +1,11 @@ +export const DEFAULT_DURATION_IN_MS_PER_STEP = 500 + +export const DEFAULT_NB_TRACKS = 24 + +// how many columns per slice / default segment lenght - this may be an option in the future +// so here, a "slice" (a typical shot) +// lasts for 2 seconds (500ms * 4) +export const DEFAULT_COLUMNS_PER_SLICE = 4 + +export const PROMPT_STEP_HEIGHT_IN_PX = 24 +export const PREVIEW_STEP_HEIGHT_IN_PX = 3 * PROMPT_STEP_HEIGHT_IN_PX diff --git a/packages/aitube-timeline/src/constants/index.ts b/packages/aitube-timeline/src/constants/index.ts new file mode 100644 index 00000000..4ab12c51 --- /dev/null +++ b/packages/aitube-timeline/src/constants/index.ts @@ -0,0 +1,11 @@ +export { + colors +} from "./colors" + +export { + DEFAULT_DURATION_IN_MS_PER_STEP, + DEFAULT_NB_TRACKS, + DEFAULT_COLUMNS_PER_SLICE, + PROMPT_STEP_HEIGHT_IN_PX, + PREVIEW_STEP_HEIGHT_IN_PX +} from "./grid" \ No newline at end of file diff --git a/packages/aitube-timeline/src/demo.tsx b/packages/aitube-timeline/src/demo.tsx new file mode 100644 index 00000000..01d6398c --- /dev/null +++ b/packages/aitube-timeline/src/demo.tsx @@ -0,0 +1,16 @@ +import React from 'react' +import { createRoot } from 'react-dom/client' + +import { TimelineGrid } from '.' + +const container = document.getElementById('root') +const root = createRoot(container!) + +root.render( + +
Hello
+
+ +
+
+); \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/aitube-timeline/src/hooks/index.ts new file mode 100644 index 00000000..6b194459 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/index.ts @@ -0,0 +1,7 @@ +export { useAxis } from "./useAxis" +export { useCellWidth } from "./useCellWidth" +export { useGridLines } from "./useGridLines" +export { usePreviewTrackHeight } from "./usePreviewTrackHeight" +export { useStandardTrackHeight } from "./useStandardTrackHeight" +export { useTimelineState } from "./useTimelineState" +export { useVisibleSegments } from "./useVisibleSegments" \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useAxis.ts b/packages/aitube-timeline/src/hooks/useAxis.ts new file mode 100644 index 00000000..ae7902dd --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useAxis.ts @@ -0,0 +1,22 @@ +import { useEffect, useState } from "react" + +import * as THREE from "three" + +export const useAxis = (width: number, height: number) => { + const [axis, setAxis] = useState([] as THREE.BufferGeometry[]); + + useEffect(() => { + const OX = new THREE.BufferGeometry().setFromPoints([ + new THREE.Vector3(0, 0, 1), + new THREE.Vector3(width, 0, 1) + ]); + + const OY = new THREE.BufferGeometry().setFromPoints([ + new THREE.Vector3(0, 0, 1), + new THREE.Vector3(0, -height, 1) + ]); + setAxis([OY, OX]); + }, [width, height]); + + return axis; +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useCellWidth.ts b/packages/aitube-timeline/src/hooks/useCellWidth.ts new file mode 100644 index 00000000..f7ec8b54 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useCellWidth.ts @@ -0,0 +1,6 @@ +import { useTimelineState } from "./useTimelineState" + +export function useCellWidth() { + const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) + return horizontalZoomLevel +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useGridLines.ts b/packages/aitube-timeline/src/hooks/useGridLines.ts new file mode 100644 index 00000000..a3158e8b --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useGridLines.ts @@ -0,0 +1,50 @@ +import { useEffect, useState } from "react" + +import * as THREE from "three" + +export const useGridLines = ({ + cellHeight, + cellWidth, + nbMaxTracks, + nbMaxShots, +}: { + cellHeight: number, + cellWidth: number, + nbMaxTracks: number, + nbMaxShots: number, +}) => { + const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); + + const maxWidth = nbMaxShots * cellWidth + const maxHeight = nbMaxTracks * cellHeight + + useEffect(() => { + + const thisLines = [] as THREE.BufferGeometry[]; + + // TODO: this is a + for (let i = 0; i < nbMaxShots; i++) { + const verticalLinePoints = [ + new THREE.Vector3(i * cellWidth, 0, 1), + new THREE.Vector3(i * cellWidth, -maxHeight, 1) + ]; + const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); + + thisLines.push(verticalLineGeometry); + } + + for (let i = 0; i < nbMaxTracks; i++) { + const horizontalLinePoints = [ + new THREE.Vector3(0, -i * cellHeight, 1), + new THREE.Vector3(maxWidth, -i * cellHeight, 1) + ]; + const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); + + thisLines.push(horizontalLineGeometry); + } + + setGridLines(thisLines); + }, [maxWidth, maxHeight, cellHeight, cellWidth, nbMaxTracks, nbMaxShots]); + + return gridlines; +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts b/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts new file mode 100644 index 00000000..e48b827b --- /dev/null +++ b/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts @@ -0,0 +1,17 @@ + +import { DEFAULT_COLUMNS_PER_SLICE } from "@/constants/grid" + +import { useCellWidth } from "./useCellWidth" + +export function usePreviewTrackHeight() { + const cellWidth = useCellWidth() + + const imageRatio = 0.5625 // 0.6 + const previewWidth = Math.round( + // (horizontalZoomLevel / 40) * + imageRatio + * DEFAULT_COLUMNS_PER_SLICE // typically 4, but this might change in the future + * cellWidth) + + return previewWidth +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts b/packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts new file mode 100644 index 00000000..9384b331 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts @@ -0,0 +1,6 @@ +import { PROMPT_STEP_HEIGHT_IN_PX } from "@/constants/grid" + +export function useStandardTrackHeight() { + + return PROMPT_STEP_HEIGHT_IN_PX +} diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts new file mode 100644 index 00000000..e9911209 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -0,0 +1,39 @@ +import * as THREE from "three" +import { create } from "zustand" +import { ClapSegment } from "@aitube/clap" + + +import { TimelineState } from "@/types/timeline" +import { DEFAULT_NB_TRACKS, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" + +export const useTimelineState = create((set, get) => ({ + segments: [], + segmentsChanged: 0, + visibleSegments: [], + + position: new THREE.Vector3(), + scale: new THREE.Vector3(), + initialized: false, + beforeSteps: 0, + afterSteps: 0, + timeout: 0 as unknown as NodeJS.Timeout, + + minHorizontalZoomLevel: 25, + maxHorizontalZoomLevel: 150, + horizontalZoomLevel: 20, // 80, + + cellHeight: PROMPT_STEP_HEIGHT_IN_PX, + cellWidth: 20, + nbMaxTracks: DEFAULT_NB_TRACKS, + + setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { + const { minHorizontalZoomLevel, maxHorizontalZoomLevel } = get() + const horizontalZoomLevel = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) + set({ horizontalZoomLevel }) + }, + + setSegments: (segments: ClapSegment[] = []) => { + set({ segments, visibleSegments: segments }) + }, + setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, +})) diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts new file mode 100644 index 00000000..8b6a6ead --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -0,0 +1,235 @@ +import { useEffect, useRef } from "react" +import * as THREE from "three" +import { useThree } from "@react-three/fiber" +import { ClapSegment } from "@aitube/clap" + +import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" +import { similar, sliceSegments } from "@/utils" + +import { useTimelineState } from "./useTimelineState" + +export const useVisibleSegments = ({ + cellHeight, + cellWidth, + nbMaxTracks, +}: { + cellHeight: number + cellWidth: number + nbMaxTracks: number +}) => { + // to make it react to screen width change + // however, this doesn't seem to work well + const { size: canvasSize, viewport } = useThree() + + // let's use the whole screen size for reference + // this will help us in case of fast canvas resize (eg. resize using the mouse) + const size = { width: typeof window !== "undefined" ? window.innerWidth : canvasSize.width } + + const segments = useTimelineState((s) => s.segments) + const segmentsChanged = useTimelineState((s) => s.segmentsChanged) + + const visibleSegments = useTimelineState((s) => s.visibleSegments) + const setVisibleSegments = useTimelineState((s) => s.setVisibleSegments) + + const controls = useThree((state) => state.controls) + const camera = useThree((state) => state.camera) + + // TODO: maybe refactor this, put it inside the Zustand state + + const stateRef = useRef<{ + position: THREE.Vector3 + scale: THREE.Vector3 + initialized: boolean + beforeTimeInMs: number + afterTimeInMs: number + timeout: NodeJS.Timeout + segments: ClapSegment[] + visibleSegments: ClapSegment[] + cellHeight: number + cellWidth: number + nbMaxTracks: number + }>({ + position: new THREE.Vector3(), + scale: new THREE.Vector3(), + initialized: false, + beforeTimeInMs: 0, + afterTimeInMs: 0, + timeout: 0 as unknown as NodeJS.Timeout, + segments: [], + visibleSegments: [], + cellHeight, + cellWidth, + nbMaxTracks, + }) + + + // make sure the state reflects the latest params + stateRef.current.segments = [...segments] + stateRef.current.cellHeight = cellHeight + stateRef.current.cellWidth = cellWidth + stateRef.current.nbMaxTracks = nbMaxTracks + + useEffect(() => { + stateRef.current.segments = [...segments] + console.log("TODO: force a re-rendering") + }, [segmentsChanged]) + /* + + for some reason, this: + + controls.addEventListener("change", onChange) + + doesn't work.. + + useEffect(() => { + const previous = cameraRef.current + if (!previous || previous.initialized || !controls) { return } + + previous.initialized = true + + console.log("getting ready..", { + previous, + camera, + controls + }) + // Fires when the camera has been transformed by the controls. + const onChange = () => { + console.log("onChange!") + // we can adjust this threshold to only re compute the geometry + // when a significant shift has been done by the user + const epsilonPaneThreshold = 5 + + // now the zoom is tricky because it may be equivalent to a large paning, + // if we are in a zoom out + const epsilonZoomThreshold = 1 + + const cameraDidntPaneALot = similar(previous.position, camera.position, epsilonPaneThreshold) + const cameraDidntZoomALot = similar(previous.scale, camera.scale, epsilonZoomThreshold) + + if (cameraDidntPaneALot && cameraDidntZoomALot) { return } + + previous.position.copy(camera.position) + previous.scale.copy(camera.scale) + + console.log("the camera has changed a lot!") + } + + // Fires when an interaction was initiated. + const onStart = () => { + console.log("onStart!") + } + + // Fires when an interaction has finished. + const onEnd = () => { + console.log("onEnd!") + } + + controls.addEventListener("change", onChange) + controls.addEventListener("start", onStart) + controls.addEventListener("end", onEnd) + + return () => { + controls.removeEventListener("change", onChange) + controls.removeEventListener("start", onStart) + controls.removeEventListener("chaendnge", onEnd) + } + }, [controls]) + */ + + + // TODO we should use: + // controls.addEventListener("change", onChange) + // instead, but it doesn't work for some reason.. + const sync = async (forceRerendering?: boolean) => { + if (!stateRef.current) { return } + const state = stateRef.current + + // we can adjust this threshold to only re compute the geometry + // when a significant shift has been done by the user + const epsilonPaneThreshold = 5 + + // now the zoom is tricky because it may be equivalent to a large paning, + // if we are in a zoom out + const epsilonZoomThreshold = 1 + + const cameraDidntPaneALot = similar(state.position, camera.position, epsilonPaneThreshold) + const cameraDidntZoomALot = similar(state.scale, camera.scale, epsilonZoomThreshold) + + if (cameraDidntPaneALot && cameraDidntZoomALot && !forceRerendering) { return } + + state.position.copy(camera.position) + state.scale.copy(camera.scale) + + // TODO: compute the visible cell X and Y + // then we are going to be a bit generous and also display items on the left and right of it + + // determine, based on the current zoom level, and screen width, + // how many horizontal cell columns could be visible at a time + const maxPossibleNumberOfVisibleHorizontalCells = + Math.ceil(size.width / state.cellWidth / camera.zoom) + + const cellWidthInPixelBasedOnZoom = size.width / maxPossibleNumberOfVisibleHorizontalCells + + // determine, based on the current camera position, + // what is the cell which is in the middle + + const vector = new THREE.Vector3(); + vector.project(camera); + + // distance between the begining of the timeline grid and the left side of the screen + const relativeX = - Math.round((0.5 + vector.x / 2) * (size.width / window.devicePixelRatio)) + const pixelX = relativeX * 2 + + // determine the minimum visible index + + const cellIndex = Math.max(0, pixelX / cellWidthInPixelBasedOnZoom) + + const securityMargin = maxPossibleNumberOfVisibleHorizontalCells + + // we only keep segments within a given range + // those are not necessarily visible (there is a security margin) + const afterSteps = Math.floor(Math.max(0, cellIndex - securityMargin)) + const beforeSteps = Math.floor(cellIndex + maxPossibleNumberOfVisibleHorizontalCells + securityMargin) + + const afterTimeInMs = afterSteps * DEFAULT_DURATION_IN_MS_PER_STEP + const beforeTimeInMs = beforeSteps * DEFAULT_DURATION_IN_MS_PER_STEP + + if (state.afterTimeInMs !== afterTimeInMs || state.beforeTimeInMs !== beforeTimeInMs || forceRerendering) { + state.afterTimeInMs = afterTimeInMs + state.beforeTimeInMs = beforeTimeInMs + + const visibleSegments = await sliceSegments({ ...state }) + + state.visibleSegments = [...visibleSegments] + + setVisibleSegments(visibleSegments) + } + } + + useEffect(() => { + const state = stateRef.current + if (!state || state.initialized || !controls) { return } + + state.initialized = true + + const refreshRateInMs = 500 + + // we could also use useInterval, but we need something async-friendly + const fn = async () => { + try { await sync(false) } catch (err) {} + // console.log("setting a new timeout") + + state.timeout = setTimeout(fn, refreshRateInMs) as any + } + fn() + // no need to clear the timeout + }, [controls]) // to wait before we are sure to have the controls + + // force a re-render when cell width or height change + useEffect(() => { + const fn = async () => { try { await sync(true) } catch (err) {} } + fn() + }, [cellHeight, cellWidth]) + + return visibleSegments; +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx new file mode 100644 index 00000000..97c29578 --- /dev/null +++ b/packages/aitube-timeline/src/index.tsx @@ -0,0 +1,30 @@ +export { + TimelineControls, + HorizontalScroller, + VerticalScroller, + TimelineGrid +} from "./components" + +export { + useAxis, + useCellWidth, + useGridLines, + usePreviewTrackHeight, + useStandardTrackHeight, + useTimelineState, + useVisibleSegments +} from "./hooks" + +export { + cn, + getSegmentColorHex, + getWebGLCharWidth, + getWebGLTextWidth, + clampWebGLText, + clampWebGLTextNaive, + segmentsToCells, + similar, + sliceSegments +} from "./utils" + +export { ClapTimeline } from "./ClapTimeline" \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/grid.ts b/packages/aitube-timeline/src/types/grid.ts new file mode 100644 index 00000000..9e1ce797 --- /dev/null +++ b/packages/aitube-timeline/src/types/grid.ts @@ -0,0 +1,8 @@ +import { Vector3 } from "three" + +export type Cell = { + position: Vector3 + width: number + height: number + color: string +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts new file mode 100644 index 00000000..0c39948d --- /dev/null +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -0,0 +1,26 @@ +import * as THREE from "three" +import { ClapSegment } from "@aitube/clap" + +export type TimelineState = { + segments: ClapSegment[] + segmentsChanged: number + visibleSegments: ClapSegment[] + + minHorizontalZoomLevel: number + maxHorizontalZoomLevel: number + horizontalZoomLevel: number + + position: THREE.Vector3 + scale: THREE.Vector3 + initialized: boolean + beforeSteps: number + afterSteps: number + timeout: NodeJS.Timeout + cellHeight: number + cellWidth: number + nbMaxTracks: number + + setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void + setSegments: (segments?: ClapSegment[]) => void + setVisibleSegments: (visibleSegments?: ClapSegment[]) => void +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/cn.ts b/packages/aitube-timeline/src/utils/cn.ts new file mode 100644 index 00000000..ec79801f --- /dev/null +++ b/packages/aitube-timeline/src/utils/cn.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/packages/aitube-timeline/src/utils/getSegmentColorHex.ts b/packages/aitube-timeline/src/utils/getSegmentColorHex.ts new file mode 100644 index 00000000..296fc4df --- /dev/null +++ b/packages/aitube-timeline/src/utils/getSegmentColorHex.ts @@ -0,0 +1,56 @@ +import { ClapSegment } from "@aitube/clap" +import { getSegmentColor, segmentCategories, SegmentColor } from "@aitube/colors" + +const segmentColorToBgColorHex: Record = { + blue: '#60a5fa', + red: '#f87171', + rose: '#fb7185', + green: '#4ade80', + + green2: '#a2de53', + green3: '#90aa89', + + violet: '#a78bfa', + amber: '#fbbf24', + yellow: '#facc15', + yellow2: '#facc6e', + teal: '#2dd4bf', + cyan: '#22d3ee', + orange: '#fb923c', + orange2: '#dea253', + + sky: '#38bdf8', + stone: '#a8a29e', + // stone2: '#78716c', + sand: '#c8b07c', + + zinc: '#a1a1aa', + zinc2: '#d4d4d8', + lime: '#a3e635', + indigo: '#818cf8', + purple: '#c084fc', + purple2: '#afbfcb', + pink: '#f472b6', + pink2: '#bf91b8', + pink3: '#bfa0b8', + + neutral: '#a3a3a3', + neutral2: '#969187', + gray: '#9ca3af', + gray2: '#9ca3af' +} + +/** + * + * @param segment + * @returns + */ +export function getSegmentColorHex(segment?: ClapSegment): { bg: string } { + const segmentColor: SegmentColor = getSegmentColor(segment?.category || segmentCategories.generic) + + const bg = segmentColorToBgColorHex[segmentColor] || segmentColorToBgColorHex.gray + + return { + bg + } +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/aitube-timeline/src/utils/getTextLength.ts new file mode 100644 index 00000000..175a4773 --- /dev/null +++ b/packages/aitube-timeline/src/utils/getTextLength.ts @@ -0,0 +1,114 @@ +/** + * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. + * + * @param {String} text The text to be rendered. + * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana"). + * + * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 + */ + +function getTextWidthInCanvas(text: string, font: string) { + if (typeof window === "undefined") { + return 0 + } + const canvas = document.createElement("canvas") + const context = canvas.getContext("2d") + if (!context) { return 0 } + + context.font = font + const metrics = context.measureText(text) + return metrics.width +} + + +// one option could be to pre-compute some of the width +const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()_-"+=,;:?/\\&@#'.split('') +const charLength = characters.reduce((acc, char) => ({ + ...acc, + [char]: getTextWidthInCanvas(char, "Arial") +}), {} as Record) + +const defaultCharLength = 5.561523437 // seems to be a common width when we use getTextWidthInCanvas() +const webglFontWidthFactor = 0.58 + +/** + * Compute the text of a simple Arial text in a WebGL environmment + * This actually just do a lookup + sum + * + * @param text + * @returns + */ +export function getWebGLCharWidth(char: string = ""): number { + return webglFontWidthFactor * (charLength[char] || defaultCharLength) +} + +/** + * Compute the text of a simple Arial text in a WebGL environmment + * This actually just do a lookup + sum + * + * @param text + * @returns + */ +export function getWebGLTextWidth(text: string = ""): number { + return text.split('').reduce((s, c) => (s + getWebGLCharWidth(c)), 0) +} + +/** + * Clamp a text to a given + * @param text + * @param maxWidthInPixels + * @returns + */ +export function clampWebGLText( + input: string, + maxWidthInPixels: number, + maxNbLines: number +): string[] { + let buffer = "" + let width = 0 + let lines: string[] = [] + + const text = `${input || ""}`.trim() + const characters = text.split('') + for (const c of characters) { + width += getWebGLCharWidth(c) + buffer += c + if (width >= maxWidthInPixels) { + if (lines.length >= maxNbLines) { + buffer += ".." + break + } else { + // TODO: we should do something smarter, which is to split the last sentence + const words = buffer.split(" ") + const lastWord = (words.at(-1) || "") + if (lastWord.length) { + lines.push(words.slice(0, -1).join(" ")) + buffer = lastWord + width = getWebGLTextWidth(lastWord) + } else { + lines.push(buffer) + buffer = "" + width = 0 + } + } + } + } + + if (buffer.length) { + lines.push(buffer) + } + return lines +} + +export function clampWebGLTextNaive(input: string = "", maxWidthInPixels: number = 0): string { + // this cutoff is very approximate as we should make it dependent on each character's width + // a simple heuristic can be to count the uppercase / lower case + const maxhInCharacter = Math.ceil(maxWidthInPixels / 3.4) + + const text = `${input || ""}` + + return (text.length >= maxhInCharacter) + ? `${text.slice(0, maxhInCharacter)}..` + : text + +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts new file mode 100644 index 00000000..797ac75c --- /dev/null +++ b/packages/aitube-timeline/src/utils/index.ts @@ -0,0 +1,11 @@ +export { cn } from "./cn" +export { getSegmentColorHex } from "./getSegmentColorHex" +export { + getWebGLCharWidth, + getWebGLTextWidth, + clampWebGLText, + clampWebGLTextNaive +} from "./getTextLength" +export { segmentsToCells } from "./segmentsToCells" +export { similar } from "./similar" +export { sliceSegments } from "./sliceSegments" diff --git a/packages/aitube-timeline/src/utils/segmentsToCells.ts b/packages/aitube-timeline/src/utils/segmentsToCells.ts new file mode 100644 index 00000000..6007677b --- /dev/null +++ b/packages/aitube-timeline/src/utils/segmentsToCells.ts @@ -0,0 +1,89 @@ +import * as THREE from "three" +import { ClapSegment } from "@aitube/clap" + +import { Cell } from "@/types/grid" + +import { getSegmentColorHex } from "./getSegmentColorHex" +import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" +import { sleep } from "./sleep" + +// TODO put this in a web workers for smoother operations? +export async function segmentsToCells({ + segments, + cellHeight, + cellWidth, + nbMaxTracks, + afterTimeInMs, + beforeTimeInMs, +}: { + segments: ClapSegment[] + cellHeight: number + cellWidth: number + nbMaxTracks: number + afterTimeInMs: number + beforeTimeInMs: number +}): Promise { + + const cells: Cell[] = []; + + console.log("starting segmentsToCells cellWidth = ${cellWidth}`") + // const maxWidth = nbMaxShots * cellWidth + // const maxHeight = nbTracks * cellHeight + + // TODO: we should take our time, to not do this too quickly + // we want to let it "breath" + + let i = 0 + + let addAsyncDelayEveryItems = 100 + let addAsyncDelayInMs = 50 + + console.log(`segmentsToCell(): slicing [${afterTimeInMs}:${beforeTimeInMs}] of ${segments.length} segments`) + // TODO: we should probably try to keep the existing structure if possible + + // since the for loop is a blocker, we turn it into an async thing + for (const segment of segments) { + + // this helps spliting the segment scanning work, even if we have a huge number of segments + const reachedMilestone = !(++i % addAsyncDelayEveryItems) + if (reachedMilestone) { + // console.log("reached milestone") + await sleep(addAsyncDelayInMs) + } + + // we only keep segments within a given range + // those are not necessarily visible (there is a security margin) + if ( + segment.startTimeInMs < afterTimeInMs || + segment.endTimeInMs > beforeTimeInMs + ) { continue } + + const colors = getSegmentColorHex(segment) + + // TODO: put this somewhere else, in a separate function + // that way we will be able to dynamically adjust it + const startTimeInSteps = segment.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP + const durationInSteps = (segment.endTimeInMs - segment.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP + + const cell: Cell = { + position: new THREE.Vector3( + (startTimeInSteps * cellWidth) + cellWidth, + + // we are negative here as the reference point is in top left + -segment.track * cellHeight + cellHeight, + 1 + ), + + // TODO use segment data to determine the cell height and width + width: (durationInSteps * cellWidth) - 0.2, // tiny padding + height: cellHeight - 0.2, // tiny padding + + color: colors.bg + }; + + cells.push(cell) + } + // console.log("segmentsToCells ended!") + + return cells +} diff --git a/packages/aitube-timeline/src/utils/similar.ts b/packages/aitube-timeline/src/utils/similar.ts new file mode 100644 index 00000000..2525e894 --- /dev/null +++ b/packages/aitube-timeline/src/utils/similar.ts @@ -0,0 +1,6 @@ +import { Vector3 } from "three" + +export function similar(v1: Vector3, v2: Vector3, epsilon = Number.EPSILON) { + + return ( ( Math.abs( v1.x - v2.x) < epsilon ) && ( Math.abs( v1.y - v2.y ) < epsilon ) && ( Math.abs( v1.z - v2.z ) < epsilon) ); +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/sleep.ts b/packages/aitube-timeline/src/utils/sleep.ts new file mode 100644 index 00000000..2885c6e7 --- /dev/null +++ b/packages/aitube-timeline/src/utils/sleep.ts @@ -0,0 +1,6 @@ +export const sleep = async (durationInMs: number) => + new Promise((resolve) => { + setTimeout(() => { + resolve(true) + }, durationInMs) + }) \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/sliceSegments.ts b/packages/aitube-timeline/src/utils/sliceSegments.ts new file mode 100644 index 00000000..236c090a --- /dev/null +++ b/packages/aitube-timeline/src/utils/sliceSegments.ts @@ -0,0 +1,19 @@ +import { ClapSegment } from "@aitube/clap" + + +// TODO put this in a web workers for smoother operations? +export function sliceSegments({ + segments, + afterTimeInMs, + beforeTimeInMs, + visibleSegments, +}: { + segments: ClapSegment[] + afterTimeInMs: number + beforeTimeInMs: number + visibleSegments: ClapSegment[] +}): ClapSegment[] { + console.log(`sliceSegments(): slicing [${afterTimeInMs}:${beforeTimeInMs}] of ${segments.length} segments`) + + return segments.filter(s => afterTimeInMs <= s.startTimeInMs && s.endTimeInMs <= beforeTimeInMs) +} \ No newline at end of file diff --git a/packages/aitube-timeline/tailwind.config.js b/packages/aitube-timeline/tailwind.config.js new file mode 100644 index 00000000..61a3a63f --- /dev/null +++ b/packages/aitube-timeline/tailwind.config.js @@ -0,0 +1,33 @@ +/** @type {import("tailwindcss").Config} */ +module.exports = { + darkMode: ["class"], + content: [ + "./src/components/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}" + ], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + fontSize: { + "5xs": "8px", + "4xs": "9px", + "3xs": "10px", + "2xs": "11px" + }, + containers: { + "6xs": "2rem", + "5xs": "4rem", + "4xs": "8rem", + "3xs": "12rem", + "2xs": "16rem", + }, + }, + }, + plugins: [] +} \ No newline at end of file diff --git a/packages/aitube-timeline/test/test.tsx b/packages/aitube-timeline/test/test.tsx new file mode 100644 index 00000000..e69de29b diff --git a/packages/aitube-timeline/tsconfig.json b/packages/aitube-timeline/tsconfig.json new file mode 100644 index 00000000..fe8d3130 --- /dev/null +++ b/packages/aitube-timeline/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["dom", "dom.iterable", "esnext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/packages/aitube-timeline/tsconfig.types.json b/packages/aitube-timeline/tsconfig.types.json new file mode 100644 index 00000000..6c2a648a --- /dev/null +++ b/packages/aitube-timeline/tsconfig.types.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx" + ] +} From b66d03418cc15333b9cd5126696e1c13c4305f9d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 29 May 2024 11:08:14 +0200 Subject: [PATCH 089/346] 0.0.2 --- packages/aitube-colors/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 523d7bf1..f329401d 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,10 +4,10 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.1", + "version": "0.0.2", "description": "Various color settings and utilities for AiTube", "scripts": { - "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", + "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" From 9b66b7f5b42bb8f56abd8dedb381bfd3a90975e2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 29 May 2024 11:11:56 +0200 Subject: [PATCH 090/346] 0.0.23 --- packages/aitube-clap/README.md | 4 ++-- packages/aitube-clap/bun.lockb | Bin 16901 -> 16869 bytes packages/aitube-clap/package.json | 11 +++++------ 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 81bd9ec4..766afad9 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -10,10 +10,10 @@ This library is the reference implementation of [OpenClap](https://github.com/jb ## Installation -To install the package, run the following command: +To install the package, run the following command (`yaml` is a peer dependency): ```bash -npm install @aitube/clap +npm install @aitube/clap yaml ``` ## Getting Started diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index 59517e51e3b3cbe9688abb12f3019429ad941109..c8cd3d24089225b001dce19241bc2e09f56f12eb 100755 GIT binary patch delta 3454 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 diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 40dcd3bc..8b49d27e 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,12 +4,12 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.22", + "version": "0.0.23", "description": "Types and helpers to manipulate .clap files", "scripts": { - "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", - "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" }, "devDependencies": { @@ -19,11 +19,10 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "typescript": "^5.4.5" + "yaml": "^2.4.2" }, "dependencies": { - "pure-uuid": "^1.8.1", - "yaml": "^2.4.2" + "pure-uuid": "^1.8.1" }, "repository": { "type": "git", From 1da35f5b2e76c2ef665334dfb20a7363c6cb8ead Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 29 May 2024 11:14:35 +0200 Subject: [PATCH 091/346] 0.0.3 --- packages/aitube-colors/bun.lockb | Bin 17292 -> 17236 bytes packages/aitube-colors/package.json | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index a9d26ac81fe057d436db8e17a23a50a72a5df79a..832eb697ad8f4d2eb3a0ba56198854a095136f5a 100755 GIT binary patch delta 1211 zcmb`GJ!n%=6vyAQA12WxFD5pvRhwGVTJzN=eW4;1iGxmBQIJ?DaZ+#;7eO8osY`{z zQ>ow}h+7;alhDB-P8Purq@#AII0-J2F7^M*2NZD%J@Cu_-h0lwx#!+<79W^j7R;se zaAne2^8Mbt`u6tL^80(QjK1W_8`nR?uRWW4aXFAJ)@rXWJoTGV_hQ$WYX$B*J%(Wb zhMJd{p+h&s_|IPKi)3ZQ5}dH z-~smu9+>)I&U(Zxr@}LR8sSN{R(aM#f~btZM~U}~ZqY84-5L+LA5&)>BHDWrLDA#{ zm%$F~NMW%HUwMRA_yl!)OmJpP(10{0=R7VFf+h=#{errolsPRu5jTwU#z756L`=|N zG!+R)1nJR@q(pbpsiZQ{n&V^L!%1ap?)P-UwKA(-51Gnl-Jh9LX0BS8810Ez=6p6i ll~#(+?WX&i?LM&!%HREJ7ra)!xw=vv&d=@DS9c3R^Di=xW(EKN delta 1254 zcmcJO%WD%+6vk&#qp2n{Nyny1<0C;+Z6-5G(@s}fYfVL{MT#Q$APXP3s6rQRq}Ykj z7?2>9i-HSjkqUO9D5Fr_`5!2_upq=jH(e+SSrlx+?@Oo9MHgMv13$jG_nvd-oO|#2 zdS9-TGHBtoOgU^8kPP{9KfjDGXfew4A6fMph4~W!v58l@-Q?Mxt^a>(4_7=>TL!oET%8M{iqbn(eKl5jH#T|4lMZxT{`g|{ znm%`|ycGR@Zm#Fi?Zx*44;1~z?_1@R@z+1AEe+T51EYzVyN}QR`7rcyq&Vy(f^U-txM$?;int%!xUN0Gp7F$+xTnX2nL^4Z=VLCNKc|0yUcW@#9AH^NW(=!{`Akm?X}cK} zC%o0_&DPQzpPV(bW-jN%vu$3}BNuXJmkGZE2trlG$z(CDm#$w4$^{E6mLz=xv`DwO aX!VIHtGDr#+ekHM(YoZ9b54JsD*ppOW_6zc diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index f329401d..d2949a80 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -13,14 +13,13 @@ "publish": "npm publish --access public" }, "devDependencies": { - "@aitube/clap": "0.0.22", "bun-types": "latest", "prettier": "^3.2.5", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.22" + "@aitube/clap": "0.0.23" }, "repository": { "type": "git", From b601bb32669c160b7f7eab556022436ddea88b04 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 29 May 2024 11:20:01 +0200 Subject: [PATCH 092/346] 0.0.11 --- packages/broadway/bun.lockb | Bin 32858 -> 32802 bytes packages/broadway/package.json | 9 ++++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 9e64148b705ef3c6903e66c0b5482df93c20c983..0ff01dbb30226bc46a2c7a4b916513e9a5541450 100755 GIT binary patch delta 1806 zcmd^72OmSbfI;VMi&_v1Q}h05!L_yZo-JJyXk@7`JeYW&w0-|@B5r* zDv@<7k#*Ts9MdS@PB;zYpJy6(E0e{u4}zmF4Evv$TbnoC{E#2JbLC!(*&>Dt+~S%= zFPp@KX0;f%G%2}~BoP_t(wYa&0*e4GQyI4ya9j^)naXhk(12xtamxWMQyFKLBt>1= zq7F+El@p56&(s{?01JQ>o>Q~9D=z!!OeBz6>;+S#dN1EX@*2EeF|Y4t&ARKBGF@LL4|EmJu!1gLv~B)V)J zvLvilQyqO#`e0GDO)1wr2&i$uxI=)Zs<7HkVxwKFFye^nPc_U0!WsV{8x(a_rUe&7 zI;i^ZvSHt!>7echY4KlXgGSAUWZ1sFNO?DQ_3Q9dZsf?zz_N?ATPGbKdxuLCch734 ze!RVv*w#4veB#;B`s)`T@9(%&;qMfl!QJpQa`mrropEmF?)QN&g{CEa=DJtY!_BR8j*s4l zhMG4~ZDeiu$+zXxFGES6@3u+SiuZerzWGeuj(0PGc$b*9JjV_|UpAOesGaCDhPBBm z)&-0{8+wf39vQt56a)J907h#;Dd4R6o5+<*L|?!tuM`7;dRZ0|0h_Y}-ot?Rx*qWU zuLrD;tf9Pn4Pt39q+um6h~q({!dhAYqM#k{?z8$-0`9vI@Pe>Du$;vJcfkr&4Qc?( z<$gex`uGd^(iJ+g#8w5ojbzG5^bKA8|Th9CG@h}<#tsjMYvIyRVj&)1BE50 z+PgYAuj+gLqtL*;h+d9(TvaX{-pd2PPKt`SpT9y9-SLLpp|ra{ITpWe5xaWrVzfsq M&L{@8KcbBM2F7~G?*IS* delta 1858 zcmds%ZEQ4^?G|*K>1MnRWKEi?>ainrAldoBs6CqhnhQYo1N%_;~+%sl_Va={@qe)u?33 zC#kvev9(xD7eWvP3`}SSR0j-zk*v%c3^+anFp`zyLqRGq1Lj!(BUzbe6+(@@ctmVi z2r4Jo6Zh2qU^M6loPZN^0fWl^@w`DKEAw1{ngKy1YT&r5zXABd!+(%{`V^!56a+Z+?Gs{yu}N?$bI;^Y{thGull(4PT1q@65j3 zc(kJX*5XSWw1%kPf6lDv<=ddi-|JxkJe_sTFGoM)7g_+=mjZgrY9ZRpp-*K=Z@J0u zK#Lh%BeMs9QGk6x!0a?I4saI#Qs(Kw7`eOLq~yq>0lZ_h5LjTjj@29$X|j7$%D%PS-=5!4D?!V-6^v}rXjqe8`pD9h+(oQ z7zv@&1msXa}_ zT71MC-58#euJZ}GziNbhTw|P|Qdi57wRMNcw diff --git a/packages/broadway/package.json b/packages/broadway/package.json index a1469eab..3f39768a 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,17 +4,15 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.10", + "version": "0.0.11", "description": "Convert a script to a clap file", "scripts": { - "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", + "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" }, "devDependencies": { - "@aitube/clap": "0.0.22", - "@aitube/colors": "0.0.1", "@aitube/io": "0.0.1", "bun-types": "latest", "prettier": "^3.2.5", @@ -22,7 +20,8 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.22" + "@aitube/clap": "0.0.23", + "@aitube/colors": "0.0.3" }, "repository": { "type": "git", From 645782dad77c1bb050f0e09f6bfcf44ec1e75d9f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 29 May 2024 11:25:14 +0200 Subject: [PATCH 093/346] 0.0.14 --- packages/aitube-engine/bun.lockb | Bin 17292 -> 17236 bytes packages/aitube-engine/package.json | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 374cc13b9c213007b1c49d48116eb6369fe0791a..d4b37a4e80f894c2ad1e2b8eff9e87e4fc100c8d 100755 GIT binary patch delta 2653 zcmb_e4@^~M6u;m51MdO~2!c0M{wfLb;J!aR4D}H?GzgO<>Cr?;6bMNStkfY-Gs>+$ zxDT6{Ay#ZP=nuWj>9i64sU~Ix7SMD;n;IgfD-|ZQ-?^8kuDP{2zwO*}f9ITgzH`p^ zedm5}zRtR8SgkRHjvU$cWLC8g z69jKTaF&(4P*Pq{QLzMA1lEr6=^8=s1>OKY9(+Vl^?_PJ@B{V)9|tbzRCy<`7jQE$ z@kU@D@Y#An2nLtIX}&_}!Kuh2-5ZO^3 zY%GXN-gdDH^)f-Gp`66e?;yn52b8AjfGj9ss_F~qB_OJv;+cKJ>wWD0*C0!V422bl zym*#2n){9GX2I&)_$}2)Um&7Eoa~UO@{SE7U?0+kQ^wt#?65%cBMd~2B0(gN0?{B&@@N7W_u>@T3`MJQ zvY$z3f*i$>g1_Y(Tum=VdSDQz&k{gng?+1VtdBB?lis4j+nnHi*0oxh-~kl&KI^*p zK^68tb)7>sx$nBV9R5)(rPtO}le;hAjpEBSFJ`+c&uo65ZO<-k(iX`X*;Vr|^;{?o z{qkDN&gPD9xBd0~X2bcdnN=sB2>h*M?|_;03~rC)hbEM#eEf$iBZpil<&tGMoyTY0K?ZAQ`FVrzl#)U?SbYAsE@!lj<|8(K3i?k-x^^>wMM zEMSs%N@IxhQ}F2I)aFx(`^(b8vWHrxrj;$s`L1rksL%8Huk9?bcBe;<-dxwPlwUrx z@5;sWu76r@el&SvQ2&MSov)^U;5s@rjHL`$v^W;%N<&RG`J49VAN5aKzoV}6oCmYs ziuDQ@KG!s|{c=cf;HFu>^ta4kG#qh0>7ajNcfKJn&T-`Wr2dW^*R(L3)^9nw0uH*f z44gVLm%|tFTCI+^MH&pBK{F;SB%v!QDomW=KCsiVD0B{J6HfrqCZ{t(nB;+cQ(VBD zAiR-g=9rYW_7o6V#e+yk$9xh9{r2{8K^GJx{&U=8)nwuJNfvZ)%plqjf+V?r^r4#mysV+2a_DCn6O0yt7svr(o(;CBjt`HQ zgSE1-gg-9Fipx+xMBtpxt7Iv}eKp9*>dIVt^@l!qfPb37lefwe3*^UT$=ZnZql>`k zD)vQr#JpZuSykVMp`i$GjBF@wf2OWU!&)Gr%R(pLZI(i=0-=b`LdW6u2H!@#hMk54 zrF9BC(b@}LvR%KYUEfXXK=Hwg`=;YKmiW{_`tTq$2}aC- zEy^#!zw$k6=iwF!w~=IvnPv0UmP{7S4_TT6{U{m>tzn~8*&M=ID}UFTitW#TwWf-G qiK_IVD?HJQX)Q*X$J>r^|5;(KiAl>ujhx_G`=}>lW>;0JFZ&mVBHKRz delta 2715 zcmb_ec}$c?6#r(~h5f+g6ybBL0wN&DvIooJ0gFdztD%a5id7Vas8#G5>xr`4MvGNr z(Xmyka@ZQRN=seaC~7=tO+7+tOB3*3O{2!6YCUMFZGUgS-Dne%`iGOe@Ati9-n@A; z^JZE;U~4K^r7n6&fbtjP&DQF@30rMV8#;oQG?Xt0i<+}~uFyF6*De*C{#rLO*RElL z5FiMS(wTE++KT4Q8wXwluk>KNLJ)$$F9ikyI|NxD?js1n;MG74kSS$(3wVFO#%U5K$u}JA^DC6||KEq?)#(yFHI&hn02PV<)&9A=!t@ ztQ*N^B#2g93!;9nfT#iOZbdJd7oJBli~QB6Zwm^wldBYusxzdn1`yd{UEF8_QX?c+X~dv;k^WyWw|27qPm*b%myp~S%=&%dbW+eKVI?k6(4>$)RvW7eQD^8rKc4kth6ZV zjRlGwwlkZzjCru@`sG9GvkQkmt|{y`t#Q)++u9%E4B_G9)>?LyZD<}aY1wNNAvFd#*PfTf0=3k5c zytMtmtxx(5Ki{&uZez}rh3|cN=Kh)MmCo;bMzO5g%k|}J_LbKxR`k;tCN^&0U!2rt zt!S4n|FEJql%2$&dC{tG|NABP=GNGd(s+?CU+WaaeuYz_iK3K(uImJv_<7 z`FqJ>8MsZ{ntni%QhDeJqF!`ls26Q_34}T;=s_f-QqrBDO&)3|OX^8l>P-hH6-2$s zntIdWq8_M;bT87B=-zUlXNrkp4gpaiqT)p7ISE8jQPJrN>IR~-qXQ*_s5W4Zi9!$j zP~nIMQK5+f(S*Z6G(DVO(xY&ZGw? zUFZ$pFlX+~U_&UaWTB-_#c zXW5M7<2P(quzE=7NzuZWnI!G+;4o!JaY57Z>Y!Scf?a|HnRGCoWR$c$vC8yNG5FuV zm6+XCsbKz)V0j!Re6mq8cQSISoDuJnrbmpc_fawC0Afm$XS0Xb!?X8Aa=Um!{>4E@ zhe4k%>od5^D6tma0W0r2XX@P8jI4m5bXXZFqk=G>rd-az6V>4XqW$2ha8VYm>x`{4~C9Th_$?!GANCQcWzM=cMMa1im?S zx6U0+D&@I1_7I)hnm&$xNh?aG2Ga_p>db=B3ZfR7#wVDE@LF@0_`2tAdFZ@p_Ge0L hp)~$D?F2Kd&* Date: Wed, 29 May 2024 11:42:15 +0200 Subject: [PATCH 094/346] 0.0.32 --- packages/aitube-client/bun.lockb | Bin 18764 -> 18740 bytes packages/aitube-client/package.json | 9 ++++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index a68b23bb63786242b92976ccf99e6b693696f80f..aa8ca0bc4797a0825f2abf57bd7e7480da4a881e 100755 GIT binary patch delta 2733 zcmb_eX-rgC6n^*3#$yqX&2dmRck93m%mSiA(V&Im(qMIng2W9J1Ra}#7H49?*#2n6 ztBF{|CDK|YZS6>nsZoK{HjRx-H7(Q{v1uf-sF9))Y5JX+dDUNSLwYi2zIT?poO8Ex zc@I0ihwawKmF0fyNPOSbJ2T*Tmx)?o&qX|Q;^_3&l(jf1NrkKN((FG^(vdxioUGSX?UE*!k%%h+Qw429skw5 z9{<;P2mT|tR%2tO+^(@npCQaNwD99yYKycP!I7llT?&hI22wgCH9rE|uuoEv#8P>^ zpH2D*NqG|<3XlIINVC0tDJ(3J+a;T7E3%Wx52|OfOT0s}Ng|^6j#s3#Na>Jh1Pv#t z(kFSxI}IrVHWkGpiCA0eTjFsTJ%if=Y^;XY2iT-GSmwimIjAgBEV4v?O6rjnaC@Ll z`UW~9bfPE5Cod$#I2GB<^4cK111Zzn7o_u$D4U+1nVNS5*+OSyPt1glVMU1jd7Wai zd(o&G=0x-YF*Y3SL=XKFdYZ!vd8LIFuy#TynCN9BztLdAFfb7z`A3id0y;f|>mbks z#)GLr448VvlkmE^U{+64aZ{@6ODK-@akI#z!VRuSXr_k52b=#?& zom9+jh`ie!ci`RZqwc1-d&-cLxFGOzwcw8~X5N~xh+kDG z`NK(meuDu%WzmGyq;wZgz9UVQkL5I^leQ^sre-1j~m4SE(?Lw;JX!#+fn9Nr%D$ro%(+=(3@9<&8K?7*DLS5)a-SKw z&7>`npYMxfC#t_LTzN-i1<87Y9-+$*evEjxU~zwc1uUuhBt4QQmj({??&?+h(<))H zc-zRuLv6_N($X5%0E=*h~4Y&KIz|V-jk&Jd8Y}T6O zBBJrco}S2v>$R|3VaKfGGUIsFpXJGib+0N}0oob#NkTVYVbLcKEtBb z$@Ne^YxpJW$stOw$(w>IUS!eY5#9zbxq2EG-<5Dtia!f4v)8MPe{Rv5J`a~T7;;Q2c^y73(_*B<33G; hyFTp=QIVoI@CWIa__f)w?whj;CDD-NHqDC?{{q;q;^F`R delta 2680 zcmcImdr*{B6#u?`z<#dCLjl(Xc?OEQvcR&-A}xx8X_1Jc;si))1C8i9O!*+)wUNeh za**Ss6o^(1HflPqHEK`-jiphRSra;h=uG5j<_jffaQdBZza5>)DgUrLd%m;3bMHO( zJnlXB9%>}9%+c+-p9hkRxGPK=6Dn?obD$07ERmM!#X;HDj;)YPlBij`F4?~o2CG9C5$S*0pC%p;&j zZIzAyO#f7|Q~Zj$ zB!{F%M0f=qm1(R}77(xCFQe58@~-y@P&WFsY^|h5zFD_KF<5;v73m#f4b|h@L0x)> z6ob%kzlJr5rBpQ3A)SDXqo$I58+d?VYZ4-x>+J(t3p51?kx^TYN;Dgdm;I6x@sGHp%d9w@LQ=3k?}_HX(-pEol^vh5ZCn1uW4$LY_ZR$9c`YQebu{rlHRhN`olkWb#tNn z(Bw07b%!^eSa?uVcq!(?%7LR--WfmR{Mo&`w&g8cx&GtM8=ZZ%p4~BhnxK8yBlx*L z#fJ+twZ-M5zG~=tf=+iA8%GwF#V=-|r#$h3G}d=4lMrm)rkn^|9`a6`pkS68XoY!r z7M~POL^6n_TmWK0Jc|zo_wiYd1fe7gX&{#IMjuUW<{TG~|zwPr3?>d#05&Hl!5Ein=+1csaI7RJKaf5py;$w z!E7IFb=PWpdX|o=IjAFZ+AX8+)-;5KES(btiHcIb*FK%Ml6ADUf%a?7+fkIbjD6ShnW`Gg*XjGf`YKZz`g47 z_W4_PtHge!4Z(3o(4f^|%tSwYbuTXJXx|aIQ>zjaAVDVF(`j$I!T1soKUmB|Zd^&q z9idT)1&|LJ#S03%Cmo-P zew(+yhRUo4F@mZw%J<%RaYcMqwm#5?Q7IfzL1?7|R)fX&o_T&^`}>Ad9V6sb Date: Wed, 29 May 2024 11:43:10 +0200 Subject: [PATCH 095/346] 0.0.32 --- packages/aitube-client/bun.lockb | Bin 18740 -> 18708 bytes packages/aitube-client/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index aa8ca0bc4797a0825f2abf57bd7e7480da4a881e..3479c5fb5dd2e2910b390f41dd8e871b484595c9 100755 GIT binary patch delta 247 zcmdloiE+v##tC|gT&eRG-u*l4d}Qp^2h(2MyTW3dusC~BRNC(uD{oz|txIaz=zo)s zQGD`5X7$Yh{9hP(nHU%tEPxmUEH(!UR-+5u6new&@UwVLqz6m3yir?1)3f z{ERO)KQv-z{crLy zicOx#tiCyb{|h58GXn#IB@lyv<>o-aYILESLT~sT7TjN3*R!Q=ekGF*uVKutr8`oz zZ`!y2kh~Le({5tP%dOsBeA?+Ba@)0ZfAj1R{*nE~#k*Q@W$o0kk2?cb6f|USW>vn; z&-iBZLnC%ZURI!03MOD18D35PXsj*+V)Fqp4+BHP1lIfabEH}~2rwGx8R!`qZ8k9J zW7TD1j5E?R(KBLTPzI{w0;-#@+MuJ|nwliQ7-tHUF=b$|umYLGz)&&yqNVF(2`dNA V6;P2mn-i@T^D-K3X7%7_1OU-_Uj_gG diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index eaf97834..3a8e8383 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -19,7 +19,7 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.22" + "@aitube/clap": "0.0.23" }, "repository": { "type": "git", From a88f8ceef64fa3d0dad08cf5fa023ef95a902ea7 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 30 May 2024 12:18:47 +0200 Subject: [PATCH 096/346] fix positionning --- packages/aitube-timeline/README.md | 12 +++-- packages/aitube-timeline/bun.lockb | Bin 84885 -> 159226 bytes packages/aitube-timeline/package.json | 17 +++++-- packages/aitube-timeline/src/ClapTimeline.tsx | 35 +++++++++++-- .../components/controls/TimelineControls.tsx | 16 ++++-- .../src/components/grid/TimelineGrid.tsx | 32 +++++++++--- .../src/hooks/useTimelineState.ts | 46 ++++++++---------- .../src/hooks/useVisibleSegments.ts | 12 ++++- packages/aitube-timeline/src/types/index.ts | 10 ++++ .../aitube-timeline/src/types/timeline.ts | 14 ++++-- .../src/utils/getDefaultState.ts | 31 ++++++++++++ .../src/utils/getTextLength.ts | 3 +- .../src/utils/segmentsToCells.ts | 18 ++++++- .../src/utils/sliceSegments.ts | 7 ++- packages/aitube-timeline/tsconfig.node.json | 11 +++++ packages/aitube-timeline/vite.config.js | 7 +++ 16 files changed, 212 insertions(+), 59 deletions(-) create mode 100644 packages/aitube-timeline/src/types/index.ts create mode 100644 packages/aitube-timeline/src/utils/getDefaultState.ts create mode 100644 packages/aitube-timeline/tsconfig.node.json create mode 100644 packages/aitube-timeline/vite.config.js diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index a938a2bd..32622898 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -12,8 +12,14 @@ More instructions will be provided until we can do more with it. ## Installation -Install the peer-dependencies: +```bash +npm i @aitube/react-timeline +``` + +Depending on your project configuration and package manager, you my need to install some additional packages manually, such as React, Radix, Tailwind, Three.js, Zustand etc: ```bash -npm i @aitube/clap @aitube/colors @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei" @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand -``` \ No newline at end of file +npm i @aitube/clap @aitube/colors @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand +``` + +This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. However if there is demand (eg. more than one person asking for it) it might evolve to become more modular in the future. \ No newline at end of file diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 115aabef06efeadfc12ef44f3fb7cdf8c123ced0..32040ebd0601f99557c4c77960c99c17e3c822f0 100755 GIT binary patch literal 159226 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 z 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 diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index b6e3e788..0ed80318 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -7,24 +7,31 @@ "version": "0.0.0", "description": "React component to display an OpenClap timeline", "scripts": { - "build": "bun build --target=node ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @aitube/colors --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", + "build": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @aitube/colors --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public", - "dev": "bunx --bun vite", + "dev": "vite", "serve": "vite preview" }, "devDependencies": { "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", "bun-types": "latest", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", "prettier": "^3.2.5", "rimraf": "^5.0.7", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "vite": "^5.2.0" }, "peerDependencies": { - "@aitube/clap": "0.0.22", - "@aitube/colors": "0.0.0", + "@aitube/clap": "0.0.23", + "@aitube/colors": "0.0.3", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index 8eed31ee..b1adeef2 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -7,23 +7,50 @@ import { VerticalScroller, TimelineGrid } from "@/components" +import { ClapProject } from "@aitube/clap" + + +export const DEFAULT_MIN_ZOOM = 1 +export const DEFAULT_MAX_ZOOM = 5 +export const DEFAULT_ZOOM_SPEED = 2.2 // high = faster +export const DEFAULT_SHOW_FPS = false export function ClapTimeline({ - showFPS + clap, + + minZoom = DEFAULT_MIN_ZOOM, + maxZoom = DEFAULT_MAX_ZOOM, + zoomSpeed = DEFAULT_ZOOM_SPEED, + showFPS = DEFAULT_SHOW_FPS }: { + clap?: ClapProject + minZoom?: number + maxZoom?: number + zoomSpeed?: number showFPS?: false } = { - showFPS: false + clap: undefined, + + minZoom: DEFAULT_MIN_ZOOM, + maxZoom: DEFAULT_MAX_ZOOM, + zoomSpeed: DEFAULT_ZOOM_SPEED, + showFPS: DEFAULT_SHOW_FPS }) { return ( -
+
- + {showFPS && } diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index cc68c569..aa6c9a09 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -1,6 +1,14 @@ import { MapControls } from "@react-three/drei" -export function TimelineControls() { +export function TimelineControls({ + minZoom, + maxZoom, + zoomSpeed +}:{ + minZoom: number + maxZoom: number + zoomSpeed: number +}) { // TODO: we should create a new class extending from MapControls // and add some custom code to put limits, to avoid going out of bounds @@ -13,8 +21,8 @@ export function TimelineControls() { // enabled // minDistance={10} // maxDistance={10} - minZoom={1} - maxZoom={5} + minZoom={minZoom} + maxZoom={maxZoom} // minPolarAngle: number; // maxPolarAngle: number; // minAzimuthAngle: number; @@ -23,7 +31,7 @@ export function TimelineControls() { dampingFactor={0.3} // low : delay, high : faster/snappier enableZoom - zoomSpeed={2.5} // high = faster + zoomSpeed={zoomSpeed} enableRotate={false} // rotateSpeed={0} diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx index d732e3e9..f0b9a9d5 100644 --- a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx +++ b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx @@ -17,19 +17,22 @@ import { export function TimelineGrid() { const { size, viewport } = useThree() - const previewCellHeight = usePreviewTrackHeight() + // const previewCellHeight = usePreviewTrackHeight() const cellHeight = useStandardTrackHeight() // cellHeight const cellWidth = useCellWidth() // 10 const nbMaxShots = ((3 * 60 * 60) / 2) // 3 hours converted to seconds, and divided by 2 (a shot is about 2 sec) const nbMaxTracks = DEFAULT_NB_TRACKS - const [scale, setScale] = useState(50) + // refresh rate for the grid (high value == delay before we see the "hidden" cells) + // this should be a fact of the number of segments, + // as this puts a strain on the rendering FPS + const refreshRateInMs = 250 - const aspect = size.width / viewport.width; + // const aspect = size.width / viewport.width; - const controls = useThree((state) => state.controls) - const camera = useThree((state) => state.camera) + // const controls = useThree((state) => state.controls) + // const camera = useThree((state) => state.camera) const width = nbMaxShots * cellWidth const height = nbMaxTracks * cellHeight @@ -49,6 +52,7 @@ export function TimelineGrid() { cellHeight, cellWidth, nbMaxTracks, + refreshRateInMs, }); const [hovered, setHovered] = useState("") @@ -119,9 +123,14 @@ export function TimelineGrid() { // this depends on the current row height const maxNbLines = 2 - const durationInSteps = (s.endTimeInMs - s.startTimeInMs) * DEFAULT_DURATION_IN_MS_PER_STEP + const durationInSteps = ( + (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP + ) + + const startTimeInSteps = ( + s.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP + ) - const startTimeInSteps = s.startTimeInMs * DEFAULT_DURATION_IN_MS_PER_STEP // note: an alternative could be to create a small fade or blur effect, // but I think it might be expensive @@ -136,7 +145,13 @@ export function TimelineGrid() { ((set, get) => ({ - segments: [], - segmentsChanged: 0, - visibleSegments: [], - - position: new THREE.Vector3(), - scale: new THREE.Vector3(), - initialized: false, - beforeSteps: 0, - afterSteps: 0, - timeout: 0 as unknown as NodeJS.Timeout, - - minHorizontalZoomLevel: 25, - maxHorizontalZoomLevel: 150, - horizontalZoomLevel: 20, // 80, - - cellHeight: PROMPT_STEP_HEIGHT_IN_PX, - cellWidth: 20, - nbMaxTracks: DEFAULT_NB_TRACKS, - +export const useTimelineState = create((set, get) => ({ + ...getDefaultState(), + setClap: (clap?: ClapProject) => { + if (!clap || !Array.isArray(clap?.segments)) { + console.log(`useTimelineState: empty clap, so resetting`) + set({ + ...getDefaultState() + }) + return + } + console.log(`useTimelineState: setting the clap to`, clap) + set({ + ...getDefaultState(), + clap, + segments: clap.segments, + visibleSegments: clap.segments, + }) + }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { const { minHorizontalZoomLevel, maxHorizontalZoomLevel } = get() const horizontalZoomLevel = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 8b6a6ead..42b1df4f 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -12,10 +12,12 @@ export const useVisibleSegments = ({ cellHeight, cellWidth, nbMaxTracks, + refreshRateInMs, }: { cellHeight: number cellWidth: number nbMaxTracks: number + refreshRateInMs: number }) => { // to make it react to screen width change // however, this doesn't seem to work well @@ -69,6 +71,7 @@ export const useVisibleSegments = ({ stateRef.current.cellWidth = cellWidth stateRef.current.nbMaxTracks = nbMaxTracks + // DO we still need this? useEffect(() => { stateRef.current.segments = [...segments] console.log("TODO: force a re-rendering") @@ -212,13 +215,18 @@ export const useVisibleSegments = ({ state.initialized = true - const refreshRateInMs = 500 - // we could also use useInterval, but we need something async-friendly const fn = async () => { + // TODO: monitor how long it takes to sync try { await sync(false) } catch (err) {} // console.log("setting a new timeout") + // refresh rate for the grid (high value == delay before we see the "hidden" cells) + // this should be a fact of the number of segments, + // as this puts a strain on the rendering FPS + // one thing that could be done is to compute how long the last sync operation lasted, + // and adjust the refreshRateInMs based on this + state.timeout = setTimeout(fn, refreshRateInMs) as any } fn() diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts new file mode 100644 index 00000000..76400a34 --- /dev/null +++ b/packages/aitube-timeline/src/types/index.ts @@ -0,0 +1,10 @@ + +export { + Cell +} from "./grid" + +export { + TimelineStore, + TimelineStoreState, + TimelineStoreModifiers +} from "./timeline" \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 0c39948d..d1bc1c36 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,7 +1,9 @@ import * as THREE from "three" -import { ClapSegment } from "@aitube/clap" +import { ClapProject, ClapSegment } from "@aitube/clap" + +export type TimelineStoreState = { + clap?: ClapProject -export type TimelineState = { segments: ClapSegment[] segmentsChanged: number visibleSegments: ClapSegment[] @@ -19,8 +21,14 @@ export type TimelineState = { cellHeight: number cellWidth: number nbMaxTracks: number +} + +export type TimelineStoreModifiers = { setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: ClapSegment[]) => void setVisibleSegments: (visibleSegments?: ClapSegment[]) => void -} \ No newline at end of file +} + + +export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts new file mode 100644 index 00000000..26185c8f --- /dev/null +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -0,0 +1,31 @@ + +import * as THREE from "three" + + +import { DEFAULT_NB_TRACKS, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" +import { TimelineStoreState } from "@/types/timeline" + +export function getDefaultState(): TimelineStoreState { + + return { + clap: undefined, + segments: [], + segmentsChanged: 0, + visibleSegments: [], + + position: new THREE.Vector3(), + scale: new THREE.Vector3(), + initialized: false, + beforeSteps: 0, + afterSteps: 0, + timeout: 0 as unknown as NodeJS.Timeout, + + minHorizontalZoomLevel: 25, + maxHorizontalZoomLevel: 150, + horizontalZoomLevel: 20, // 80, + + cellHeight: PROMPT_STEP_HEIGHT_IN_PX, + cellWidth: 20, + nbMaxTracks: DEFAULT_NB_TRACKS, + } +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/aitube-timeline/src/utils/getTextLength.ts index 175a4773..cdbca360 100644 --- a/packages/aitube-timeline/src/utils/getTextLength.ts +++ b/packages/aitube-timeline/src/utils/getTextLength.ts @@ -29,7 +29,7 @@ const charLength = characters.reduce((acc, char) => ({ }), {} as Record) const defaultCharLength = 5.561523437 // seems to be a common width when we use getTextWidthInCanvas() -const webglFontWidthFactor = 0.58 +const webglFontWidthFactor = 0.64 /** * Compute the text of a simple Arial text in a WebGL environmment @@ -75,6 +75,7 @@ export function clampWebGLText( buffer += c if (width >= maxWidthInPixels) { if (lines.length >= maxNbLines) { + buffer = buffer.trim() // to avoid writing "and .." buffer += ".." break } else { diff --git a/packages/aitube-timeline/src/utils/segmentsToCells.ts b/packages/aitube-timeline/src/utils/segmentsToCells.ts index 6007677b..c14590c6 100644 --- a/packages/aitube-timeline/src/utils/segmentsToCells.ts +++ b/packages/aitube-timeline/src/utils/segmentsToCells.ts @@ -23,10 +23,11 @@ export async function segmentsToCells({ afterTimeInMs: number beforeTimeInMs: number }): Promise { + throw new Error(`this function seems to be unused`) const cells: Cell[] = []; - console.log("starting segmentsToCells cellWidth = ${cellWidth}`") + console.log(`starting segmentsToCells cellWidth = ${cellWidth}`) // const maxWidth = nbMaxShots * cellWidth // const maxHeight = nbTracks * cellHeight @@ -38,7 +39,7 @@ export async function segmentsToCells({ let addAsyncDelayEveryItems = 100 let addAsyncDelayInMs = 50 - console.log(`segmentsToCell(): slicing [${afterTimeInMs}:${beforeTimeInMs}] of ${segments.length} segments`) + console.log(`segmentsToCell(): converting slice [${afterTimeInMs}:${beforeTimeInMs}] (${segments.length} segments)`) // TODO: we should probably try to keep the existing structure if possible // since the for loop is a blocker, we turn it into an async thing @@ -65,6 +66,19 @@ export async function segmentsToCells({ const startTimeInSteps = segment.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP const durationInSteps = (segment.endTimeInMs - segment.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP + console.log(`details: `, { + DEFAULT_DURATION_IN_MS_PER_STEP, + cellWidth, + + startTimeInMs: segment.startTimeInMs, + startTimeInSteps, + + endTimeInMs: segment.endTimeInMs, + durationInSteps, + + x1: (startTimeInSteps * cellWidth) + cellWidth, + x2: (durationInSteps * cellWidth) - 0.2, + }) const cell: Cell = { position: new THREE.Vector3( (startTimeInSteps * cellWidth) + cellWidth, diff --git a/packages/aitube-timeline/src/utils/sliceSegments.ts b/packages/aitube-timeline/src/utils/sliceSegments.ts index 236c090a..1072f7ad 100644 --- a/packages/aitube-timeline/src/utils/sliceSegments.ts +++ b/packages/aitube-timeline/src/utils/sliceSegments.ts @@ -13,7 +13,10 @@ export function sliceSegments({ beforeTimeInMs: number visibleSegments: ClapSegment[] }): ClapSegment[] { - console.log(`sliceSegments(): slicing [${afterTimeInMs}:${beforeTimeInMs}] of ${segments.length} segments`) + // console.log(`sliceSegments(): extracting [${afterTimeInMs}:${beforeTimeInMs}] out of ${segments.length} segments`) - return segments.filter(s => afterTimeInMs <= s.startTimeInMs && s.endTimeInMs <= beforeTimeInMs) + const result = segments.filter(s => afterTimeInMs <= s.startTimeInMs && s.endTimeInMs <= beforeTimeInMs) + // console.log(`sliceSegments(): extracted ${result.length} segments`) + + return result } \ No newline at end of file diff --git a/packages/aitube-timeline/tsconfig.node.json b/packages/aitube-timeline/tsconfig.node.json new file mode 100644 index 00000000..97ede7ee --- /dev/null +++ b/packages/aitube-timeline/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/aitube-timeline/vite.config.js b/packages/aitube-timeline/vite.config.js new file mode 100644 index 00000000..2dea53a3 --- /dev/null +++ b/packages/aitube-timeline/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) \ No newline at end of file From 8cc3164bd048ff4ed87ba11b886008e1dedd6eee Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 30 May 2024 19:27:33 +0200 Subject: [PATCH 097/346] various improvements - will need to fix colors --- packages/aitube-timeline/src/ClapTimeline.tsx | 45 ++-- .../src/components/cells/Cell.tsx | 76 +++++++ .../src/components/cells/ImageCell.tsx | 32 +++ .../src/components/cells/TextCell.tsx | 124 +++++++++++ .../src/components/cells/VideoCell.tsx | 51 +++++ .../src/components/cells/index.tsx | 5 + .../src/components/cells/types.ts | 13 ++ .../components/controls/TimelineControls.tsx | 6 +- .../src/components/grid/TimelineGrid.tsx | 198 ++++-------------- .../aitube-timeline/src/constants/defaults.ts | 8 + packages/aitube-timeline/src/hooks/index.ts | 1 - .../aitube-timeline/src/hooks/useCellWidth.ts | 6 - .../aitube-timeline/src/hooks/useGridLines.ts | 27 +-- .../src/hooks/usePreviewTrackHeight.ts | 8 +- .../src/hooks/useTimelineState.ts | 93 +++++++- .../src/hooks/useVisibleSegments.ts | 66 +++--- packages/aitube-timeline/src/index.tsx | 1 - .../aitube-timeline/src/types/timeline.ts | 5 + .../src/utils/getDefaultState.ts | 15 +- .../src/utils/removeFinalVideo.ts | 36 ++++ 20 files changed, 588 insertions(+), 228 deletions(-) create mode 100644 packages/aitube-timeline/src/components/cells/Cell.tsx create mode 100644 packages/aitube-timeline/src/components/cells/ImageCell.tsx create mode 100644 packages/aitube-timeline/src/components/cells/TextCell.tsx create mode 100644 packages/aitube-timeline/src/components/cells/VideoCell.tsx create mode 100644 packages/aitube-timeline/src/components/cells/index.tsx create mode 100644 packages/aitube-timeline/src/components/cells/types.ts create mode 100644 packages/aitube-timeline/src/constants/defaults.ts delete mode 100644 packages/aitube-timeline/src/hooks/useCellWidth.ts create mode 100644 packages/aitube-timeline/src/utils/removeFinalVideo.ts diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index b1adeef2..dac661d1 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -8,12 +8,7 @@ import { TimelineGrid } from "@/components" import { ClapProject } from "@aitube/clap" - - -export const DEFAULT_MIN_ZOOM = 1 -export const DEFAULT_MAX_ZOOM = 5 -export const DEFAULT_ZOOM_SPEED = 2.2 // high = faster -export const DEFAULT_SHOW_FPS = false +import { DEFAULT_BACKGROUND_COLOR, DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM, DEFAULT_SHOW_FPS, DEFAULT_ZOOM_DAMPING_FACTOR, DEFAULT_ZOOM_SPEED } from "./constants/defaults" export function ClapTimeline({ clap, @@ -21,35 +16,59 @@ export function ClapTimeline({ minZoom = DEFAULT_MIN_ZOOM, maxZoom = DEFAULT_MAX_ZOOM, zoomSpeed = DEFAULT_ZOOM_SPEED, - showFPS = DEFAULT_SHOW_FPS + zoomDampingFactor = DEFAULT_ZOOM_DAMPING_FACTOR, + showFPS = DEFAULT_SHOW_FPS, + backgroundColor = DEFAULT_BACKGROUND_COLOR }: { clap?: ClapProject minZoom?: number maxZoom?: number zoomSpeed?: number - showFPS?: false + zoomDampingFactor?: number + showFPS?: boolean + backgroundColor?: string } = { clap: undefined, minZoom: DEFAULT_MIN_ZOOM, maxZoom: DEFAULT_MAX_ZOOM, zoomSpeed: DEFAULT_ZOOM_SPEED, - showFPS: DEFAULT_SHOW_FPS + zoomDampingFactor: DEFAULT_ZOOM_DAMPING_FACTOR, + showFPS: DEFAULT_SHOW_FPS, + backgroundColor: DEFAULT_BACKGROUND_COLOR }) { return ( -
+
+ + frameloop="always" + + // those must stay ON otherwise colors will be washed out + flat + linear + + // doesn't work in our case since we need to display videos + // frameloop="demand" + + + style={{ + width: "100%", + height: "100%", + background: backgroundColor + }} + > {showFPS && } diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx new file mode 100644 index 00000000..fca3a621 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -0,0 +1,76 @@ +import { a } from "@react-spring/three" +import { ClapSegment } from "@aitube/clap" + +import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" +import { getSegmentColorHex } from "@/utils" + +import { ImageCell } from "./ImageCell" +import { VideoCell } from "./VideoCell" +import { TextCell } from "./TextCell" +import { useTimelineState } from "@/hooks" +import { DEFAULT_BACKGROUND_COLOR } from "@/constants/defaults" + +export function Cell({ + segment: s, + setHovered +}: { + segment: ClapSegment + setHovered: (id: string) => void +}) { + + const baseSegmentColor = getSegmentColorHex(s) + + const cellWidth = useTimelineState((s) => s.horizontalZoomLevel) + const getCellHeight = useTimelineState((s) => s.getCellHeight) + const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) + + const cellHeight = getCellHeight(s.track) + const verticalCellPosition = getVerticalCellPosition(0, s.track) + + const durationInSteps = ( + (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP + ) + + const startTimeInSteps = ( + s.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP + ) + + const SpecializedCell = + s.assetUrl.startsWith("data:image/") + ? ImageCell + : s.assetUrl.startsWith("data:video/") + ? VideoCell + : TextCell + + return ( + + + + + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/aitube-timeline/src/components/cells/ImageCell.tsx new file mode 100644 index 00000000..c8e220da --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/ImageCell.tsx @@ -0,0 +1,32 @@ +import { Image } from "@react-three/drei" +import { useThree } from "@react-three/fiber" +import { useSpring, a, animated, config } from "@react-spring/three" + +import { SpecializedCellProps } from "./types" + +export function ImageCell({ + segment: s, + cellWidth, + cellHeight, + setHovered, + durationInSteps, + startTimeInSteps, + baseSegmentColor, +}: SpecializedCellProps) { + return ( + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx new file mode 100644 index 00000000..5293a2c0 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -0,0 +1,124 @@ +import { RoundedBox, Text } from "@react-three/drei" +import { useSpring, a, animated, config } from "@react-spring/three" + +import { clampWebGLText } from "@/utils" + +import { SpecializedCellProps } from "./types" + +export function TextCell({ + segment: s, + cellWidth, + cellHeight, + setHovered, + durationInSteps, + startTimeInSteps, + baseSegmentColor, +}: SpecializedCellProps) { + + // this depends on the current row height + const maxNbLines = 2 + + // note: an alternative could be to create a small fade or blur effect, + // but I think it might be expensive + const lines = clampWebGLText( + s.label || s.prompt, + durationInSteps * cellWidth, + maxNbLines + ) + // const label = clampWebGLTextNaive(s.label, durationInSteps * cellWidth) + + const padding = 1 + + return ( + console.log('click')} + onContextMenu={(e) => console.log('context menu')} + onDoubleClick={(e) => console.log('double click')} + // onWheel={(e) => console.log('wheel spins')} + // onPointerUp={(e) => console.log('up')} + // onPointerDown={(e) => console.log('down')} + // onPointerOver={(e) => console.log('over')} + // onPointerOut={(e) => console.log('out')} + onPointerEnter={(e) => { + console.log('enter') + setHovered(s.id) + }} + onPointerLeave={(e) => { + console.log('leave') + setHovered(s.id) + }} + // onPointerMove={(e) => console.log('move')} + // onPointerMissed={() => console.log('missed')} + // onUpdate={(self) => console.log('props have been updated')} + > + + {/* + number[]} // Override default positioning function. (default=undefined) [ignored in transform mode] + // occlude={[ref]} // Can be true or a Ref[], true occludes the entire scene (default: undefined) + // onOcclude={(visible) => null} // Callback when the visibility changes (default: undefined) + // {...groupProps} // All THREE.Group props are valid + // {...divProps} // All HTMLDivElement props are valid + > +
+ {s.label || ""} +
+ + */} + + + {lines.join("\n")} + + + +
+ ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/VideoCell.tsx b/packages/aitube-timeline/src/components/cells/VideoCell.tsx new file mode 100644 index 00000000..1512e150 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/VideoCell.tsx @@ -0,0 +1,51 @@ +import { useState } from "react" +import * as THREE from "three" +import { useSpring, a, animated, config } from "@react-spring/three" + +import { SpecializedCellProps } from "./types" + +export function VideoCell({ + segment: s, + cellWidth, + cellHeight, + setHovered, + durationInSteps, + startTimeInSteps, + baseSegmentColor, +}: SpecializedCellProps) { + + const [video] = useState(() => { + const vid = document.createElement("video"); + vid.src = s.assetUrl; + vid.crossOrigin = "Anonymous"; + vid.loop = true; + vid.muted = true; + vid.playsInline = true; + vid.play(); + return vid; + }) + + return ( + + + + + + + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/index.tsx b/packages/aitube-timeline/src/components/cells/index.tsx new file mode 100644 index 00000000..3e7baa72 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/index.tsx @@ -0,0 +1,5 @@ +export { Cell } from "./Cell" +export { ImageCell } from "./ImageCell" +export { VideoCell } from "./VideoCell" +export { TextCell } from "./TextCell" +export { SpecializedCellProps } from "./types" diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts new file mode 100644 index 00000000..5f624107 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -0,0 +1,13 @@ +import { ClapSegment } from "@aitube/clap" + +export type SpecializedCellProps = { + segment: ClapSegment + cellWidth: number + cellHeight: number + setHovered: (id: string) => void + durationInSteps: number + startTimeInSteps: number + baseSegmentColor: { + bg: string; + } +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index aa6c9a09..5242baaf 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -3,11 +3,13 @@ import { MapControls } from "@react-three/drei" export function TimelineControls({ minZoom, maxZoom, - zoomSpeed + zoomSpeed, + zoomDampingFactor, }:{ minZoom: number maxZoom: number zoomSpeed: number + zoomDampingFactor: number }) { // TODO: we should create a new class extending from MapControls @@ -28,7 +30,7 @@ export function TimelineControls({ // minAzimuthAngle: number; // maxAzimuthAngle: number; enableDamping - dampingFactor={0.3} // low : delay, high : faster/snappier + dampingFactor={zoomDampingFactor} enableZoom zoomSpeed={zoomSpeed} diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx index f0b9a9d5..487750dc 100644 --- a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx +++ b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx @@ -1,33 +1,37 @@ -import React, { useEffect, useRef, useState } from "react" -import { GradientTexture, Plane, Text, RoundedBox, Center, Billboard, Html, MeshPortalMaterial } from "@react-three/drei" +import React, { useEffect, useState } from "react" +import { Plane } from "@react-three/drei" import { useThree } from "@react-three/fiber" import { useSpring, a, animated, config } from "@react-spring/three" -import { DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS } from "@/constants" -import { clampWebGLText, getSegmentColorHex } from "@/utils" +import { DEFAULT_NB_TRACKS } from "@/constants" import { - usePreviewTrackHeight, - useCellWidth, - useStandardTrackHeight, useVisibleSegments, useAxis, - useGridLines + useGridLines, + useTimelineState } from "@/hooks" +import { Cell } from "@/components/cells" + export function TimelineGrid() { const { size, viewport } = useThree() - // const previewCellHeight = usePreviewTrackHeight() - const cellHeight = useStandardTrackHeight() // cellHeight - const cellWidth = useCellWidth() // 10 + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const getCellHeight = useTimelineState(s => s.getCellHeight) + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const baseCellHeight = getCellHeight() + const nbMaxShots = ((3 * 60 * 60) / 2) // 3 hours converted to seconds, and divided by 2 (a shot is about 2 sec) const nbMaxTracks = DEFAULT_NB_TRACKS // refresh rate for the grid (high value == delay before we see the "hidden" cells) // this should be a fact of the number of segments, // as this puts a strain on the rendering FPS - const refreshRateInMs = 250 + // + // another solution can also consist in rendering more hidden cells, + // to avoid having to re-compute + const refreshRateInMs = 500 // const aspect = size.width / viewport.width; @@ -35,13 +39,11 @@ export function TimelineGrid() { // const camera = useThree((state) => state.camera) const width = nbMaxShots * cellWidth - const height = nbMaxTracks * cellHeight + const height = getVerticalCellPosition(0, nbMaxTracks) const axis = useAxis(width, height) + const gridlines = useGridLines({ - cellHeight, - cellWidth, - nbMaxTracks, nbMaxShots, }); @@ -49,8 +51,6 @@ export function TimelineGrid() { // we could cheat by detecting the cell width change and apply it // faster on the current geometries const visibleSegments = useVisibleSegments({ - cellHeight, - cellWidth, nbMaxTracks, refreshRateInMs, }); @@ -76,12 +76,17 @@ export function TimelineGrid() { // the three one - feel free to fix this // {...dragSpring as any} // {...bindDrag()} + position={[0,0,0]} > {/* background */} - - - + + {gridlines.map((lineGeometry, idx) => ( + {/**/} ))} - + {axis.map((lineGeometry, idx) => ( @@ -115,141 +125,17 @@ export function TimelineGrid() { 0, // height/2 is to shift the group above, to make it centered // cellHeight/2 is to also take into account the height of a cell - (height / 2) - (cellHeight / 2), + // (baseCellHeight / 2) - (baseCellHeight / 2), + height / 2, -1 ]}> - {visibleSegments.map((s) => { - - // this depends on the current row height - const maxNbLines = 2 - - const durationInSteps = ( - (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP - ) - - const startTimeInSteps = ( - s.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP - ) - - - // note: an alternative could be to create a small fade or blur effect, - // but I think it might be expensive - const lines = clampWebGLText( - s.label, - durationInSteps * cellWidth, - maxNbLines - ) - // const label = clampWebGLTextNaive(s.label, durationInSteps * cellWidth) - - return ( - + - console.log('click')} - onContextMenu={(e) => console.log('context menu')} - onDoubleClick={(e) => console.log('double click')} - // onWheel={(e) => console.log('wheel spins')} - // onPointerUp={(e) => console.log('up')} - // onPointerDown={(e) => console.log('down')} - // onPointerOver={(e) => console.log('over')} - // onPointerOut={(e) => console.log('out')} - onPointerEnter={(e) => { - console.log('enter') - setHovered(s.id) - }} - onPointerLeave={(e) => { - console.log('leave') - setHovered(s.id) - }} - // onPointerMove={(e) => console.log('move')} - // onPointerMissed={() => console.log('missed')} - // onUpdate={(self) => console.log('props have been updated')} - > - - {/* - number[]} // Override default positioning function. (default=undefined) [ignored in transform mode] - // occlude={[ref]} // Can be true or a Ref[], true occludes the entire scene (default: undefined) - // onOcclude={(visible) => null} // Callback when the visibility changes (default: undefined) - // {...groupProps} // All THREE.Group props are valid - // {...divProps} // All HTMLDivElement props are valid - > -
- {s.label || ""} -
- - */} - - - - {lines.join("\n")} - - - -
-
- ) - })} + segment={s} + setHovered={setHovered} + /> + )}
diff --git a/packages/aitube-timeline/src/constants/defaults.ts b/packages/aitube-timeline/src/constants/defaults.ts new file mode 100644 index 00000000..ede43376 --- /dev/null +++ b/packages/aitube-timeline/src/constants/defaults.ts @@ -0,0 +1,8 @@ + + +export const DEFAULT_MIN_ZOOM = 0.5 +export const DEFAULT_MAX_ZOOM = 7 +export const DEFAULT_ZOOM_SPEED = 1.7 // high = faster +export const DEFAULT_ZOOM_DAMPING_FACTOR = 0.1 // low : delay, high : faster/snappier +export const DEFAULT_SHOW_FPS = false +export const DEFAULT_BACKGROUND_COLOR = "#27272A" diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/aitube-timeline/src/hooks/index.ts index 6b194459..fd5c91d9 100644 --- a/packages/aitube-timeline/src/hooks/index.ts +++ b/packages/aitube-timeline/src/hooks/index.ts @@ -1,5 +1,4 @@ export { useAxis } from "./useAxis" -export { useCellWidth } from "./useCellWidth" export { useGridLines } from "./useGridLines" export { usePreviewTrackHeight } from "./usePreviewTrackHeight" export { useStandardTrackHeight } from "./useStandardTrackHeight" diff --git a/packages/aitube-timeline/src/hooks/useCellWidth.ts b/packages/aitube-timeline/src/hooks/useCellWidth.ts deleted file mode 100644 index f7ec8b54..00000000 --- a/packages/aitube-timeline/src/hooks/useCellWidth.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useTimelineState } from "./useTimelineState" - -export function useCellWidth() { - const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) - return horizontalZoomLevel -} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useGridLines.ts b/packages/aitube-timeline/src/hooks/useGridLines.ts index a3158e8b..f10dd790 100644 --- a/packages/aitube-timeline/src/hooks/useGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useGridLines.ts @@ -1,22 +1,23 @@ import { useEffect, useState } from "react" - import * as THREE from "three" +import { useTimelineState } from "./useTimelineState" + export const useGridLines = ({ - cellHeight, - cellWidth, - nbMaxTracks, nbMaxShots, }: { - cellHeight: number, - cellWidth: number, - nbMaxTracks: number, - nbMaxShots: number, + nbMaxShots: number }) => { + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const getCellHeight = useTimelineState(s => s.getCellHeight) + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + + const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) + const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); const maxWidth = nbMaxShots * cellWidth - const maxHeight = nbMaxTracks * cellHeight + const maxHeight = getVerticalCellPosition(0, nbIdentifiedTracks) useEffect(() => { @@ -33,10 +34,10 @@ export const useGridLines = ({ thisLines.push(verticalLineGeometry); } - for (let i = 0; i < nbMaxTracks; i++) { + for (let i = 0; i < nbIdentifiedTracks; i++) { const horizontalLinePoints = [ - new THREE.Vector3(0, -i * cellHeight, 1), - new THREE.Vector3(maxWidth, -i * cellHeight, 1) + new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), + new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 1) ]; const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); @@ -44,7 +45,7 @@ export const useGridLines = ({ } setGridLines(thisLines); - }, [maxWidth, maxHeight, cellHeight, cellWidth, nbMaxTracks, nbMaxShots]); + }, [maxWidth, maxHeight, cellWidth, nbIdentifiedTracks, nbMaxShots]); return gridlines; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts b/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts index e48b827b..e0e1fe8d 100644 --- a/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts +++ b/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts @@ -1,17 +1,17 @@ import { DEFAULT_COLUMNS_PER_SLICE } from "@/constants/grid" -import { useCellWidth } from "./useCellWidth" +import { useTimelineState } from "./useTimelineState" export function usePreviewTrackHeight() { - const cellWidth = useCellWidth() + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const imageRatio = 0.5625 // 0.6 - const previewWidth = Math.round( + const previewHeight = Math.round( // (horizontalZoomLevel / 40) * imageRatio * DEFAULT_COLUMNS_PER_SLICE // typically 4, but this might change in the future * cellWidth) - return previewWidth + return previewHeight } \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 5ff124b2..73d97d7f 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -1,8 +1,10 @@ import { create } from "zustand" -import { ClapProject, ClapSegment } from "@aitube/clap" +import { ClapMediaOrientation, ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" import { TimelineStore } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" +import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" +import { removeFinalVideos } from "@/utils/removeFinalVideo" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), @@ -15,11 +17,62 @@ export const useTimelineState = create((set, get) => ({ return } console.log(`useTimelineState: setting the clap to`, clap) + + // we remove the big/long video + const segments = removeFinalVideos(clap) + const cellWidth = get().horizontalZoomLevel + + let typicalSegmentDurationInSteps = DEFAULT_COLUMNS_PER_SLICE * DEFAULT_DURATION_IN_MS_PER_STEP + + // TODO: should be done by the Clap parser and/or serializer + // send a demand to Julian (@flngr) to get it fixed + let nbIdentifiedTracks = 0 + for (const s of segments) { + if (s.track > nbIdentifiedTracks) { + nbIdentifiedTracks = s.track + } + + if (s.category === ClapSegmentCategory.CAMERA) { + const durationInSteps = ( + (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP + ) + typicalSegmentDurationInSteps = durationInSteps + } + } + + const typicalSegmentLengthInPixels = cellWidth * typicalSegmentDurationInSteps + + // TODO: compute the exact image ratio instead of using the media orientation, + // since it might not match the actual assets + const ratio = clap.meta.width / clap.meta.height + + // also storyboards and videos might have different sizes / ratios + const previewHeight = Math.round( + typicalSegmentLengthInPixels / ratio + ) + + console.log('DEBUG:', { + orientation: clap.meta.orientation, + typicalSegmentDurationInSteps, + ratio, + previewHeight + }) + + const trackToCellHeight: Record = { + // VIDEO + 0: previewHeight, + + // STORYBOARD + 1: previewHeight + } + set({ ...getDefaultState(), clap, - segments: clap.segments, - visibleSegments: clap.segments, + segments, + visibleSegments: segments, + nbIdentifiedTracks, + trackToCellHeight, }) }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { @@ -32,4 +85,38 @@ export const useTimelineState = create((set, get) => ({ set({ segments, visibleSegments: segments }) }, setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, + + getCellHeight: (segmentOrTrackNumber?: number | ClapSegment): number => { + const { trackToCellHeight } = get() + const defaultCellHeight = PROMPT_STEP_HEIGHT_IN_PX + let cellHeight = defaultCellHeight + + if (typeof segmentOrTrackNumber === "number" && !isNaN(segmentOrTrackNumber) && isFinite(segmentOrTrackNumber)) { + const trackNumber = segmentOrTrackNumber + const value = trackToCellHeight[trackNumber] + if (typeof value === "number" && !isNaN(value) && isFinite(value)) { + cellHeight = value + } + } else if (typeof segmentOrTrackNumber === "object") { + if (typeof segmentOrTrackNumber.track === "number" && !isNaN(segmentOrTrackNumber.track) && isFinite(segmentOrTrackNumber.track)) { + const value = trackToCellHeight[segmentOrTrackNumber.track] + if (typeof value === "number" && !isNaN(value) && isFinite(value)) { + cellHeight = value + } + } + } + + return cellHeight + }, + + + getVerticalCellPosition: (start: number, end: number): number => { + const { getCellHeight } = get() + + let height = 0 + for (let i = start; i < end; i++) { + height += getCellHeight(i) + } + return height + }, })) diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 42b1df4f..7d4bee53 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -9,13 +9,9 @@ import { similar, sliceSegments } from "@/utils" import { useTimelineState } from "./useTimelineState" export const useVisibleSegments = ({ - cellHeight, - cellWidth, nbMaxTracks, refreshRateInMs, }: { - cellHeight: number - cellWidth: number nbMaxTracks: number refreshRateInMs: number }) => { @@ -36,6 +32,12 @@ export const useVisibleSegments = ({ const controls = useThree((state) => state.controls) const camera = useThree((state) => state.camera) + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const getCellHeight = useTimelineState(s => s.getCellHeight) + // const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + // note: only the average height change will be detected + const cellHeight = getCellHeight() + // TODO: maybe refactor this, put it inside the Zustand state const stateRef = useRef<{ @@ -47,8 +49,6 @@ export const useVisibleSegments = ({ timeout: NodeJS.Timeout segments: ClapSegment[] visibleSegments: ClapSegment[] - cellHeight: number - cellWidth: number nbMaxTracks: number }>({ position: new THREE.Vector3(), @@ -59,16 +59,12 @@ export const useVisibleSegments = ({ timeout: 0 as unknown as NodeJS.Timeout, segments: [], visibleSegments: [], - cellHeight, - cellWidth, nbMaxTracks, }) // make sure the state reflects the latest params stateRef.current.segments = [...segments] - stateRef.current.cellHeight = cellHeight - stateRef.current.cellWidth = cellWidth stateRef.current.nbMaxTracks = nbMaxTracks // DO we still need this? @@ -145,14 +141,21 @@ export const useVisibleSegments = ({ // instead, but it doesn't work for some reason.. const sync = async (forceRerendering?: boolean) => { if (!stateRef.current) { return } + + // TODO: replace our usage of stateRef.current + // by useTimelineState.getState() const state = stateRef.current + const cellWidth = useTimelineState.getState().horizontalZoomLevel // we can adjust this threshold to only re compute the geometry // when a significant shift has been done by the user - const epsilonPaneThreshold = 5 + // high value (eg 5) == less sensitive + // low value (e 2) == super sensitive + const epsilonPaneThreshold = 3 // now the zoom is tricky because it may be equivalent to a large paning, // if we are in a zoom out + // which is why we are more sensitive here const epsilonZoomThreshold = 1 const cameraDidntPaneALot = similar(state.position, camera.position, epsilonPaneThreshold) @@ -163,13 +166,12 @@ export const useVisibleSegments = ({ state.position.copy(camera.position) state.scale.copy(camera.scale) - // TODO: compute the visible cell X and Y - // then we are going to be a bit generous and also display items on the left and right of it - // determine, based on the current zoom level, and screen width, // how many horizontal cell columns could be visible at a time - const maxPossibleNumberOfVisibleHorizontalCells = - Math.ceil(size.width / state.cellWidth / camera.zoom) + // + // note that is only useful for *horizontal* scrolling + // this doesn't prevent loading delay caused by zooming out + const maxPossibleNumberOfVisibleHorizontalCells = Math.ceil(size.width / cellWidth / camera.zoom) const cellWidthInPixelBasedOnZoom = size.width / maxPossibleNumberOfVisibleHorizontalCells @@ -187,7 +189,17 @@ export const useVisibleSegments = ({ const cellIndex = Math.max(0, pixelX / cellWidthInPixelBasedOnZoom) - const securityMargin = maxPossibleNumberOfVisibleHorizontalCells + const securityMargin = + // this is useful for horizontal scroll only + maxPossibleNumberOfVisibleHorizontalCells + + + // if the camera is already zoomed-out a lot, it means we only need + // to take horizontal scroll into account + // + // but if the camera is zoomed-in, then a quick scroll wheel could + // send us asking for x2, x5 etc.. more cells instantly, so we need + // to take that into account too. + (camera.zoom * 8) // 8 because 4 on left and 4 on right // we only keep segments within a given range // those are not necessarily visible (there is a security margin) @@ -217,16 +229,18 @@ export const useVisibleSegments = ({ // we could also use useInterval, but we need something async-friendly const fn = async () => { - // TODO: monitor how long it takes to sync + // we want a relatively "high" refresh rate in order to get smooth camera movement + // eg a rate of 500ms + // + // ideally I would say we should also debounce the call, to defer + // the sync to until we have finished the zoom animation and don't have user action, + // (with a time limit anyway) + // + // we can also try to optimize this further by adapting it to the compute load, + // either by calculating the FPS or by monitoring the time it takes + // to run the sync() function try { await sync(false) } catch (err) {} - // console.log("setting a new timeout") - // refresh rate for the grid (high value == delay before we see the "hidden" cells) - // this should be a fact of the number of segments, - // as this puts a strain on the rendering FPS - // one thing that could be done is to compute how long the last sync operation lasted, - // and adjust the refreshRateInMs based on this - state.timeout = setTimeout(fn, refreshRateInMs) as any } fn() @@ -239,5 +253,5 @@ export const useVisibleSegments = ({ fn() }, [cellHeight, cellWidth]) - return visibleSegments; + return visibleSegments }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 97c29578..30a16e79 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -7,7 +7,6 @@ export { export { useAxis, - useCellWidth, useGridLines, usePreviewTrackHeight, useStandardTrackHeight, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index d1bc1c36..86da9c0e 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -7,6 +7,7 @@ export type TimelineStoreState = { segments: ClapSegment[] segmentsChanged: number visibleSegments: ClapSegment[] + nbIdentifiedTracks: number minHorizontalZoomLevel: number maxHorizontalZoomLevel: number @@ -21,6 +22,8 @@ export type TimelineStoreState = { cellHeight: number cellWidth: number nbMaxTracks: number + + trackToCellHeight: Record } @@ -28,6 +31,8 @@ export type TimelineStoreModifiers = { setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: ClapSegment[]) => void setVisibleSegments: (visibleSegments?: ClapSegment[]) => void + getCellHeight: (segmentOrTrackNumber?: number | ClapSegment) => number + getVerticalCellPosition: (start: number,end: number) => number } diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 26185c8f..82569742 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -12,6 +12,7 @@ export function getDefaultState(): TimelineStoreState { segments: [], segmentsChanged: 0, visibleSegments: [], + nbIdentifiedTracks: 0, position: new THREE.Vector3(), scale: new THREE.Vector3(), @@ -20,12 +21,20 @@ export function getDefaultState(): TimelineStoreState { afterSteps: 0, timeout: 0 as unknown as NodeJS.Timeout, - minHorizontalZoomLevel: 25, - maxHorizontalZoomLevel: 150, - horizontalZoomLevel: 20, // 80, + minHorizontalZoomLevel: 2, + maxHorizontalZoomLevel: 100, + horizontalZoomLevel: 8, // 80, cellHeight: PROMPT_STEP_HEIGHT_IN_PX, cellWidth: 20, nbMaxTracks: DEFAULT_NB_TRACKS, + + trackToCellHeight: { + // VIDEO + 0: PROMPT_STEP_HEIGHT_IN_PX * 3, + + // STORYBOARD + 1: PROMPT_STEP_HEIGHT_IN_PX * 3, + }, } } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/removeFinalVideo.ts b/packages/aitube-timeline/src/utils/removeFinalVideo.ts new file mode 100644 index 00000000..e6c68e96 --- /dev/null +++ b/packages/aitube-timeline/src/utils/removeFinalVideo.ts @@ -0,0 +1,36 @@ +import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" + +export function removeFinalVideos(clap: ClapProject): ClapSegment[] { + const alreadyAnEmbeddedFinalVideo = clap.segments.filter(s => + s.category === ClapSegmentCategory.VIDEO && + s.status === "completed" && + s.startTimeInMs === 0 && + s.endTimeInMs === clap.meta.durationInMs && + s.assetUrl).at(0) + + let ignoreThisVideoSegmentId = "" + + if (alreadyAnEmbeddedFinalVideo) { + ignoreThisVideoSegmentId = alreadyAnEmbeddedFinalVideo?.id || "" + + /* + you know what.. let's just ignore it, and re-generate fresh content + because most probably the user made an honest mistake + + const outputFilePath = await writeBase64ToFile( + alreadyAnEmbeddedFinalVideo.assetUrl, + join(outputDir, `existing_final_video`) + ) + + return { + tmpWorkDir: outputDir, + outputFilePath + } + */ + } + + // we remove the final video from the full list of segments + const allCategoriesOfSegments = clap.segments.filter(s => s.id !== ignoreThisVideoSegmentId) + + return allCategoriesOfSegments +} \ No newline at end of file From c82338ad5df9906bdafe03fa01829218219497c2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 12:32:30 +0200 Subject: [PATCH 098/346] various improvements --- packages/aitube-timeline/README.md | 8 +- .../src/components/cells/Cell.tsx | 15 ++- .../src/components/cells/ImageCell.tsx | 2 +- .../src/components/cells/TextCell.tsx | 64 +++++++---- .../src/components/cells/VideoCell.tsx | 4 +- .../src/components/cells/types.ts | 7 +- .../components/controls/TimelineControls.tsx | 4 + .../src/components/grid/TimelineGrid.tsx | 17 ++- .../aitube-timeline/src/components/index.ts | 9 ++ .../aitube-timeline/src/constants/colors.ts | 1 - .../aitube-timeline/src/constants/defaults.ts | 22 +++- .../aitube-timeline/src/constants/grid.ts | 2 +- .../aitube-timeline/src/constants/index.ts | 11 +- .../aitube-timeline/src/constants/themes.ts | 43 ++++++++ .../src/hooks/useTimelineState.ts | 98 +++++++++++++---- .../src/hooks/useVisibleSegments.ts | 7 +- packages/aitube-timeline/src/index.tsx | 22 +++- packages/aitube-timeline/src/types/grid.ts | 2 +- packages/aitube-timeline/src/types/index.ts | 10 +- packages/aitube-timeline/src/types/theme.ts | 25 +++++ .../aitube-timeline/src/types/timeline.ts | 11 +- .../src/utils/getDefaultState.ts | 18 ++- .../src/utils/getSegmentColorHex.ts | 56 ---------- .../src/utils/getTextLength.ts | 40 ++++++- .../aitube-timeline/src/utils/hslToHex.ts | 28 +++++ packages/aitube-timeline/src/utils/index.ts | 3 +- .../src/utils/segmentsToCells.ts | 103 ------------------ 27 files changed, 387 insertions(+), 245 deletions(-) delete mode 100644 packages/aitube-timeline/src/constants/colors.ts create mode 100644 packages/aitube-timeline/src/constants/themes.ts create mode 100644 packages/aitube-timeline/src/types/theme.ts delete mode 100644 packages/aitube-timeline/src/utils/getSegmentColorHex.ts create mode 100644 packages/aitube-timeline/src/utils/hslToHex.ts delete mode 100644 packages/aitube-timeline/src/utils/segmentsToCells.ts diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index 32622898..b6b99e38 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -22,4 +22,10 @@ Depending on your project configuration and package manager, you my need to inst npm i @aitube/clap @aitube/colors @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand ``` -This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. However if there is demand (eg. more than one person asking for it) it might evolve to become more modular in the future. \ No newline at end of file +This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. However if there is demand (eg. more than one person asking for it) it might evolve to become more modular in the future. + +## TODO + +### Performance optimization + +[ ] The timeline is slow when we are zooming out over large amounts of text -> we need to hide the text when it is very small \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index fca3a621..ded804a8 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -2,7 +2,6 @@ import { a } from "@react-spring/three" import { ClapSegment } from "@aitube/clap" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" -import { getSegmentColorHex } from "@/utils" import { ImageCell } from "./ImageCell" import { VideoCell } from "./VideoCell" @@ -18,7 +17,8 @@ export function Cell({ setHovered: (id: string) => void }) { - const baseSegmentColor = getSegmentColorHex(s) + const getSegmentColorScheme = useTimelineState(s => s.getSegmentColorScheme) + const colorScheme = getSegmentColorScheme(s) const cellWidth = useTimelineState((s) => s.horizontalZoomLevel) const getCellHeight = useTimelineState((s) => s.getCellHeight) @@ -35,6 +35,13 @@ export function Cell({ s.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP ) + const widthInPx = durationInSteps * cellWidth + + const currentZoomLevel = useTimelineState(s => s.currentZoomLevel) + + // we need to round this one to avoid *too* many re-renders + const widthInPxAfterZoom = Math.round(currentZoomLevel * durationInSteps * cellWidth) + const SpecializedCell = s.assetUrl.startsWith("data:image/") ? ImageCell @@ -69,7 +76,9 @@ export function Cell({ setHovered={setHovered} durationInSteps={durationInSteps} startTimeInSteps={startTimeInSteps} - baseSegmentColor={baseSegmentColor} + colorScheme={colorScheme} + widthInPx={widthInPx} + widthInPxAfterZoom={widthInPxAfterZoom} /> ) diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/aitube-timeline/src/components/cells/ImageCell.tsx index c8e220da..2d643262 100644 --- a/packages/aitube-timeline/src/components/cells/ImageCell.tsx +++ b/packages/aitube-timeline/src/components/cells/ImageCell.tsx @@ -11,7 +11,7 @@ export function ImageCell({ setHovered, durationInSteps, startTimeInSteps, - baseSegmentColor, + colorScheme, }: SpecializedCellProps) { return ( console.log('over')} // onPointerOut={(e) => console.log('out')} onPointerEnter={(e) => { - console.log('enter') + // console.log('enter') setHovered(s.id) }} onPointerLeave={(e) => { - console.log('leave') + // console.log('leave') setHovered(s.id) }} // onPointerMove={(e) => console.log('move')} // onPointerMissed={() => console.log('missed')} // onUpdate={(self) => console.log('props have been updated')} > - + {/* */} - {lines.join("\n")} - - + } + ) diff --git a/packages/aitube-timeline/src/components/cells/VideoCell.tsx b/packages/aitube-timeline/src/components/cells/VideoCell.tsx index 1512e150..3c89a8b6 100644 --- a/packages/aitube-timeline/src/components/cells/VideoCell.tsx +++ b/packages/aitube-timeline/src/components/cells/VideoCell.tsx @@ -11,7 +11,7 @@ export function VideoCell({ setHovered, durationInSteps, startTimeInSteps, - baseSegmentColor, + colorScheme, }: SpecializedCellProps) { const [video] = useState(() => { @@ -21,7 +21,7 @@ export function VideoCell({ vid.loop = true; vid.muted = true; vid.playsInline = true; - vid.play(); + // vid.play(); return vid; }) diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts index 5f624107..a9577c63 100644 --- a/packages/aitube-timeline/src/components/cells/types.ts +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -1,3 +1,4 @@ +import { ClapSegmentColorScheme } from "@/types" import { ClapSegment } from "@aitube/clap" export type SpecializedCellProps = { @@ -7,7 +8,7 @@ export type SpecializedCellProps = { setHovered: (id: string) => void durationInSteps: number startTimeInSteps: number - baseSegmentColor: { - bg: string; - } + colorScheme: ClapSegmentColorScheme + widthInPx: number + widthInPxAfterZoom: number } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index 5242baaf..1e3d88b5 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -1,5 +1,8 @@ import { MapControls } from "@react-three/drei" +// for doc see: +// https://threejs.org/docs/index.html?q=controls#examples/en/controls/MapControls + export function TimelineControls({ minZoom, maxZoom, @@ -25,6 +28,7 @@ export function TimelineControls({ // maxDistance={10} minZoom={minZoom} maxZoom={maxZoom} + // minPolarAngle: number; // maxPolarAngle: number; // minAzimuthAngle: number; diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx index 487750dc..9c890600 100644 --- a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx +++ b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from "react" +import * as THREE from "three" import { Plane } from "@react-three/drei" import { useThree } from "@react-three/fiber" import { useSpring, a, animated, config } from "@react-spring/three" @@ -12,10 +13,12 @@ import { } from "@/hooks" import { Cell } from "@/components/cells" +import { hslToHex } from "@/utils" export function TimelineGrid() { const { size, viewport } = useThree() + const typicalSegmentDurationInSteps = useTimelineState(s => s.typicalSegmentDurationInSteps) const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const getCellHeight = useTimelineState(s => s.getCellHeight) const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) @@ -78,7 +81,11 @@ export function TimelineGrid() { // {...bindDrag()} position={[0,0,0]} > - + {/* background */} {/**/} diff --git a/packages/aitube-timeline/src/components/index.ts b/packages/aitube-timeline/src/components/index.ts index 29b46ec3..cbb4faa9 100644 --- a/packages/aitube-timeline/src/components/index.ts +++ b/packages/aitube-timeline/src/components/index.ts @@ -1,3 +1,12 @@ + +export { + Cell, + ImageCell, + VideoCell, + TextCell, + SpecializedCellProps +} from "./cells" + export { TimelineControls } from "./controls" export { HorizontalScroller, VerticalScroller } from "./scroller" export { TimelineGrid } from "./grid" \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/colors.ts b/packages/aitube-timeline/src/constants/colors.ts deleted file mode 100644 index 31f0d18f..00000000 --- a/packages/aitube-timeline/src/constants/colors.ts +++ /dev/null @@ -1 +0,0 @@ -export const colors = ["blue", "red", "hotpink", "green", "orange", "yellow"]; \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/defaults.ts b/packages/aitube-timeline/src/constants/defaults.ts index ede43376..0eef8887 100644 --- a/packages/aitube-timeline/src/constants/defaults.ts +++ b/packages/aitube-timeline/src/constants/defaults.ts @@ -1,8 +1,26 @@ +import { ClapTimelineTheme } from "@/types" +import { ClapSegmentCategory } from "@aitube/clap" +import { baseClapSegmentCategoryHues } from "./themes" -export const DEFAULT_MIN_ZOOM = 0.5 +export const DEFAULT_MIN_ZOOM = 0.2 export const DEFAULT_MAX_ZOOM = 7 export const DEFAULT_ZOOM_SPEED = 1.7 // high = faster -export const DEFAULT_ZOOM_DAMPING_FACTOR = 0.1 // low : delay, high : faster/snappier +export const DEFAULT_ZOOM_DAMPING_FACTOR = 0.3 // low : delay, high : faster/snappier export const DEFAULT_SHOW_FPS = false export const DEFAULT_BACKGROUND_COLOR = "#27272A" + +export const pastel: ClapTimelineTheme = { + grid: { + backgroundColor: "#27272A", + }, + cell: { + saturation: 20.3, + lightness: 71.4, + hues: baseClapSegmentCategoryHues, + } +} + +export const DEFAULT_THEMES: Record = { + pastel, +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/grid.ts b/packages/aitube-timeline/src/constants/grid.ts index 6adcd158..e378098e 100644 --- a/packages/aitube-timeline/src/constants/grid.ts +++ b/packages/aitube-timeline/src/constants/grid.ts @@ -7,5 +7,5 @@ export const DEFAULT_NB_TRACKS = 24 // lasts for 2 seconds (500ms * 4) export const DEFAULT_COLUMNS_PER_SLICE = 4 -export const PROMPT_STEP_HEIGHT_IN_PX = 24 +export const PROMPT_STEP_HEIGHT_IN_PX = 48 export const PREVIEW_STEP_HEIGHT_IN_PX = 3 * PROMPT_STEP_HEIGHT_IN_PX diff --git a/packages/aitube-timeline/src/constants/index.ts b/packages/aitube-timeline/src/constants/index.ts index 4ab12c51..6e5955dc 100644 --- a/packages/aitube-timeline/src/constants/index.ts +++ b/packages/aitube-timeline/src/constants/index.ts @@ -1,6 +1,3 @@ -export { - colors -} from "./colors" export { DEFAULT_DURATION_IN_MS_PER_STEP, @@ -8,4 +5,10 @@ export { DEFAULT_COLUMNS_PER_SLICE, PROMPT_STEP_HEIGHT_IN_PX, PREVIEW_STEP_HEIGHT_IN_PX -} from "./grid" \ No newline at end of file +} from "./grid" + +export { + baseClapSegmentCategoryHues, + pastel, + DEFAULT_THEMES +} from "./themes" \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/aitube-timeline/src/constants/themes.ts new file mode 100644 index 00000000..7b1b8513 --- /dev/null +++ b/packages/aitube-timeline/src/constants/themes.ts @@ -0,0 +1,43 @@ +import { ClapTimelineTheme } from "@/types" +import { ClapSegmentCategoryHues } from "@/types/theme" +import { ClapSegmentCategory } from "@aitube/clap" + +export const baseClapSegmentCategoryHues: ClapSegmentCategoryHues = { + [ClapSegmentCategory.SPLAT]: 347, + [ClapSegmentCategory.MESH]: 32, + [ClapSegmentCategory.DEPTH]: 242, + [ClapSegmentCategory.EVENT]: 270, + [ClapSegmentCategory.INTERFACE]: 216, + [ClapSegmentCategory.PHENOMENON]: 270, + [ClapSegmentCategory.VIDEO]: 65, + [ClapSegmentCategory.STORYBOARD]: 65, + [ClapSegmentCategory.TRANSITION]: 65, + [ClapSegmentCategory.CHARACTER]: 285.8, + [ClapSegmentCategory.LOCATION]: 80.9, + [ClapSegmentCategory.TIME]: 91, + [ClapSegmentCategory.ERA]: 91, + [ClapSegmentCategory.LIGHTING]: 50, + [ClapSegmentCategory.WEATHER]: 197.2, + [ClapSegmentCategory.ACTION]: 3, + [ClapSegmentCategory.MUSIC]: 90, + [ClapSegmentCategory.SOUND]: 63, + [ClapSegmentCategory.DIALOGUE]: 23, + [ClapSegmentCategory.STYLE]: 285, + [ClapSegmentCategory.CAMERA]: 1, + [ClapSegmentCategory.GENERIC]: 67, +} + +export const pastel: ClapTimelineTheme = { + grid: { + backgroundColor: "#27272A", + }, + cell: { + saturation: 29, // 20.3, + lightness: 77, // 71.4, + hues: baseClapSegmentCategoryHues + } +} + +export const DEFAULT_THEMES: Record = { + pastel, +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 73d97d7f..c34863de 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -1,10 +1,12 @@ import { create } from "zustand" -import { ClapMediaOrientation, ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" +import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" import { TimelineStore } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideo" +import { hslToHex } from "@/utils/hslToHex" +import { ClapSegmentCategoryHues, ClapSegmentColorScheme } from "@/types" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), @@ -51,13 +53,6 @@ export const useTimelineState = create((set, get) => ({ typicalSegmentLengthInPixels / ratio ) - console.log('DEBUG:', { - orientation: clap.meta.orientation, - typicalSegmentDurationInSteps, - ratio, - previewHeight - }) - const trackToCellHeight: Record = { // VIDEO 0: previewHeight, @@ -73,6 +68,7 @@ export const useTimelineState = create((set, get) => ({ visibleSegments: segments, nbIdentifiedTracks, trackToCellHeight, + typicalSegmentDurationInSteps, }) }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { @@ -86,22 +82,41 @@ export const useTimelineState = create((set, get) => ({ }, setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, - getCellHeight: (segmentOrTrackNumber?: number | ClapSegment): number => { - const { trackToCellHeight } = get() + getCellHeight: (trackNumber?: number): number => { const defaultCellHeight = PROMPT_STEP_HEIGHT_IN_PX let cellHeight = defaultCellHeight + + const { + clap, + trackToCellHeight, + horizontalZoomLevel, + originalHorizontalZoomLevel, + typicalSegmentDurationInSteps + } = get() + + if (!clap) { return cellHeight } - if (typeof segmentOrTrackNumber === "number" && !isNaN(segmentOrTrackNumber) && isFinite(segmentOrTrackNumber)) { - const trackNumber = segmentOrTrackNumber - const value = trackToCellHeight[trackNumber] - if (typeof value === "number" && !isNaN(value) && isFinite(value)) { - cellHeight = value - } - } else if (typeof segmentOrTrackNumber === "object") { - if (typeof segmentOrTrackNumber.track === "number" && !isNaN(segmentOrTrackNumber.track) && isFinite(segmentOrTrackNumber.track)) { - const value = trackToCellHeight[segmentOrTrackNumber.track] - if (typeof value === "number" && !isNaN(value) && isFinite(value)) { - cellHeight = value + const cellWidth = horizontalZoomLevel + + const typicalSegmentLengthInPixels = cellWidth * typicalSegmentDurationInSteps + + // TODO: compute the exact image ratio instead of using the media orientation, + // since it might not match the actual assets + const ratio = clap.meta.width / clap.meta.height + + // also storyboards and videos might have different sizes / ratios + const previewHeight = Math.round( + typicalSegmentLengthInPixels / ratio + ) + + + if (typeof trackNumber === "number" && !isNaN(trackNumber) && isFinite(trackNumber)) { + if (trackNumber === 0 || trackNumber === 1) { + // DISABLED + // cellHeight = previewHeight + + if (trackToCellHeight[trackNumber]) { + cellHeight = trackToCellHeight[trackNumber] } } } @@ -119,4 +134,45 @@ export const useTimelineState = create((set, get) => ({ } return height }, + getSegmentColorScheme: (segment?: ClapSegment): ClapSegmentColorScheme => { + + const { theme } = get() + + let baseHue = 0 + let baseSaturation = theme.cell.saturation + let baseLightness = theme.cell.lightness + + let colorScheme: ClapSegmentColorScheme = { + baseHue, + baseSaturation, + baseLightness, + + backgroundColor: hslToHex(baseHue, baseSaturation, baseLightness), + foregroundColor: hslToHex(baseHue, baseSaturation, baseLightness), + borderColor: hslToHex(baseHue, baseSaturation, baseLightness), + textColor: hslToHex(baseHue, baseSaturation, baseLightness), + } + + if (!segment) { return colorScheme } + + const clapSegmentCategoryHues: ClapSegmentCategoryHues = theme.cell.hues + + const candidateHue = clapSegmentCategoryHues[segment.category] + if (!candidateHue) { return colorScheme } + + baseHue = candidateHue + + colorScheme = { + baseHue, + baseSaturation, + baseLightness, + + backgroundColor: hslToHex(baseHue, baseSaturation, baseLightness), + foregroundColor: hslToHex(baseHue, baseSaturation, baseLightness), + borderColor: hslToHex(baseHue, baseSaturation, baseLightness), + textColor: hslToHex(baseHue, baseSaturation + 40, 30), + } + + return colorScheme + } })) diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 7d4bee53..59b6a26f 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -30,7 +30,12 @@ export const useVisibleSegments = ({ const setVisibleSegments = useTimelineState((s) => s.setVisibleSegments) const controls = useThree((state) => state.controls) - const camera = useThree((state) => state.camera) + + // we do a little trick here, to put the camera zoom inside our Zustand store + const camera = useThree(({ camera }) => { + useTimelineState.setState({ currentZoomLevel: camera.zoom }) + return camera + }) const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const getCellHeight = useTimelineState(s => s.getCellHeight) diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 30a16e79..24ec1404 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -2,7 +2,12 @@ export { TimelineControls, HorizontalScroller, VerticalScroller, - TimelineGrid + TimelineGrid, + Cell, + ImageCell, + VideoCell, + TextCell, + SpecializedCellProps } from "./components" export { @@ -16,14 +21,23 @@ export { export { cn, - getSegmentColorHex, getWebGLCharWidth, getWebGLTextWidth, clampWebGLText, clampWebGLTextNaive, - segmentsToCells, similar, sliceSegments } from "./utils" -export { ClapTimeline } from "./ClapTimeline" \ No newline at end of file +export { + RenderedCell, + TimelineStore, + TimelineStoreState, + TimelineStoreModifiers, + ClapTimelineTheme, + ClapSegmentCategoryHues, + ClapSegmentColorScheme, +} from "./types" + +export { ClapTimeline } from "./ClapTimeline" + diff --git a/packages/aitube-timeline/src/types/grid.ts b/packages/aitube-timeline/src/types/grid.ts index 9e1ce797..2cb6208c 100644 --- a/packages/aitube-timeline/src/types/grid.ts +++ b/packages/aitube-timeline/src/types/grid.ts @@ -1,6 +1,6 @@ import { Vector3 } from "three" -export type Cell = { +export type RenderedCell = { position: Vector3 width: number height: number diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index 76400a34..89385925 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -1,10 +1,16 @@ export { - Cell + RenderedCell } from "./grid" export { TimelineStore, TimelineStoreState, TimelineStoreModifiers -} from "./timeline" \ No newline at end of file +} from "./timeline" + +export { + ClapTimelineTheme, + ClapSegmentCategoryHues, + ClapSegmentColorScheme +} from "./theme" \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/aitube-timeline/src/types/theme.ts new file mode 100644 index 00000000..62032c78 --- /dev/null +++ b/packages/aitube-timeline/src/types/theme.ts @@ -0,0 +1,25 @@ +import { ClapSegmentCategory } from "@aitube/clap" + +export type ClapSegmentCategoryHues = Record + +export type ClapTimelineTheme = { + grid: { + backgroundColor: string + }, + cell: { + saturation: number + lightness: number + hues: ClapSegmentCategoryHues + } +} + +export type ClapSegmentColorScheme = { + baseHue: number + baseSaturation: number + baseLightness: number + + backgroundColor: string + foregroundColor: string + borderColor: string + textColor: string +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 86da9c0e..f58b3b36 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,8 +1,10 @@ import * as THREE from "three" import { ClapProject, ClapSegment } from "@aitube/clap" +import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" export type TimelineStoreState = { clap?: ClapProject + theme: ClapTimelineTheme segments: ClapSegment[] segmentsChanged: number @@ -12,6 +14,7 @@ export type TimelineStoreState = { minHorizontalZoomLevel: number maxHorizontalZoomLevel: number horizontalZoomLevel: number + originalHorizontalZoomLevel: number position: THREE.Vector3 scale: THREE.Vector3 @@ -24,6 +27,11 @@ export type TimelineStoreState = { nbMaxTracks: number trackToCellHeight: Record + typicalSegmentDurationInSteps: number + + // note: this is a mirror value of + // it might change rapidly (many times per seconds), so use with care! + currentZoomLevel: number } @@ -31,8 +39,9 @@ export type TimelineStoreModifiers = { setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: ClapSegment[]) => void setVisibleSegments: (visibleSegments?: ClapSegment[]) => void - getCellHeight: (segmentOrTrackNumber?: number | ClapSegment) => number + getCellHeight: (trackNumber?: number) => number getVerticalCellPosition: (start: number,end: number) => number + getSegmentColorScheme: (segment?: ClapSegment) => ClapSegmentColorScheme } diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 82569742..8fef484a 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -2,13 +2,14 @@ import * as THREE from "three" -import { DEFAULT_NB_TRACKS, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" +import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { TimelineStoreState } from "@/types/timeline" export function getDefaultState(): TimelineStoreState { return { clap: undefined, + theme: pastel, segments: [], segmentsChanged: 0, visibleSegments: [], @@ -23,10 +24,18 @@ export function getDefaultState(): TimelineStoreState { minHorizontalZoomLevel: 2, maxHorizontalZoomLevel: 100, - horizontalZoomLevel: 8, // 80, + + // horizontalZoomLevel is the WIDTH of a grid cell, in pixels + // by initializing it with PROMPT_STEP_HEIGHT_IN_PX (the default grid cell HEIGHT in pixels) + // we can achieve a square shape + horizontalZoomLevel: PROMPT_STEP_HEIGHT_IN_PX, + originalHorizontalZoomLevel: PROMPT_STEP_HEIGHT_IN_PX, cellHeight: PROMPT_STEP_HEIGHT_IN_PX, - cellWidth: 20, + + // @deprecated + cellWidth: PROMPT_STEP_HEIGHT_IN_PX, + nbMaxTracks: DEFAULT_NB_TRACKS, trackToCellHeight: { @@ -36,5 +45,8 @@ export function getDefaultState(): TimelineStoreState { // STORYBOARD 1: PROMPT_STEP_HEIGHT_IN_PX * 3, }, + typicalSegmentDurationInSteps: 4, + + currentZoomLevel: 1.0, } } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getSegmentColorHex.ts b/packages/aitube-timeline/src/utils/getSegmentColorHex.ts deleted file mode 100644 index 296fc4df..00000000 --- a/packages/aitube-timeline/src/utils/getSegmentColorHex.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { ClapSegment } from "@aitube/clap" -import { getSegmentColor, segmentCategories, SegmentColor } from "@aitube/colors" - -const segmentColorToBgColorHex: Record = { - blue: '#60a5fa', - red: '#f87171', - rose: '#fb7185', - green: '#4ade80', - - green2: '#a2de53', - green3: '#90aa89', - - violet: '#a78bfa', - amber: '#fbbf24', - yellow: '#facc15', - yellow2: '#facc6e', - teal: '#2dd4bf', - cyan: '#22d3ee', - orange: '#fb923c', - orange2: '#dea253', - - sky: '#38bdf8', - stone: '#a8a29e', - // stone2: '#78716c', - sand: '#c8b07c', - - zinc: '#a1a1aa', - zinc2: '#d4d4d8', - lime: '#a3e635', - indigo: '#818cf8', - purple: '#c084fc', - purple2: '#afbfcb', - pink: '#f472b6', - pink2: '#bf91b8', - pink3: '#bfa0b8', - - neutral: '#a3a3a3', - neutral2: '#969187', - gray: '#9ca3af', - gray2: '#9ca3af' -} - -/** - * - * @param segment - * @returns - */ -export function getSegmentColorHex(segment?: ClapSegment): { bg: string } { - const segmentColor: SegmentColor = getSegmentColor(segment?.category || segmentCategories.generic) - - const bg = segmentColorToBgColorHex[segmentColor] || segmentColorToBgColorHex.gray - - return { - bg - } -} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/aitube-timeline/src/utils/getTextLength.ts index cdbca360..94e7ea4e 100644 --- a/packages/aitube-timeline/src/utils/getTextLength.ts +++ b/packages/aitube-timeline/src/utils/getTextLength.ts @@ -7,6 +7,8 @@ * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 */ +import { useTimelineState } from ".." + function getTextWidthInCanvas(text: string, font: string) { if (typeof window === "undefined") { return 0 @@ -25,11 +27,12 @@ function getTextWidthInCanvas(text: string, font: string) { const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()_-"+=,;:?/\\&@#'.split('') const charLength = characters.reduce((acc, char) => ({ ...acc, - [char]: getTextWidthInCanvas(char, "Arial") + [char]: getTextWidthInCanvas(char, "bold Arial") }), {} as Record) +let defaultCharLength = 5.561523437 -const defaultCharLength = 5.561523437 // seems to be a common width when we use getTextWidthInCanvas() -const webglFontWidthFactor = 0.64 +// change this whenever you modify the font size +const webglFontWidthFactor = 1.7 /** * Compute the text of a simple Arial text in a WebGL environmment @@ -39,7 +42,32 @@ const webglFontWidthFactor = 0.64 * @returns */ export function getWebGLCharWidth(char: string = ""): number { - return webglFontWidthFactor * (charLength[char] || defaultCharLength) + + const cellWidthInPixels = useTimelineState.getState().horizontalZoomLevel + + let responsiveHack = 1.5 + + if (cellWidthInPixels < 16) { + responsiveHack = 1.20 + } else if (cellWidthInPixels < 20) { + responsiveHack = 1.10 + } else if (cellWidthInPixels < 24) { + responsiveHack = 1.05 + } else if (cellWidthInPixels < 28) { + responsiveHack = 1 + } else if (cellWidthInPixels < 32) { + responsiveHack = 0.9 + } else if (cellWidthInPixels < 48) { + responsiveHack = 0.8 + } else if (cellWidthInPixels < 64) { + responsiveHack = 0.75 + } else if (cellWidthInPixels < 128) { + responsiveHack = 0.65 + } else { + responsiveHack = 0.55 + } + + return responsiveHack * webglFontWidthFactor * (charLength[char] || defaultCharLength) } /** @@ -68,13 +96,13 @@ export function clampWebGLText( let width = 0 let lines: string[] = [] - const text = `${input || ""}`.trim() + const text = `${input || ""}`.replace('\n', ' ').trim() const characters = text.split('') for (const c of characters) { width += getWebGLCharWidth(c) buffer += c if (width >= maxWidthInPixels) { - if (lines.length >= maxNbLines) { + if (lines.length >= (maxNbLines - 1)) { buffer = buffer.trim() // to avoid writing "and .." buffer += ".." break diff --git a/packages/aitube-timeline/src/utils/hslToHex.ts b/packages/aitube-timeline/src/utils/hslToHex.ts new file mode 100644 index 00000000..facd8868 --- /dev/null +++ b/packages/aitube-timeline/src/utils/hslToHex.ts @@ -0,0 +1,28 @@ +export function hslToHex(h: number, s: number, l: number): string { + h /= 360; + s /= 100; + l /= 100; + let r, g, b; + if (s === 0) { + r = g = b = l; // achromatic + } else { + const hue2rgb = (p: number, q: number, t: number) => { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + const toHex = (x: number) => { + const hex = Math.round(x * 255).toString(16); + return hex.length === 1 ? '0' + hex : hex; + }; + return `#${toHex(r)}${toHex(g)}${toHex(b)}`; +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts index 797ac75c..296e8ffb 100644 --- a/packages/aitube-timeline/src/utils/index.ts +++ b/packages/aitube-timeline/src/utils/index.ts @@ -1,11 +1,10 @@ export { cn } from "./cn" -export { getSegmentColorHex } from "./getSegmentColorHex" export { getWebGLCharWidth, getWebGLTextWidth, clampWebGLText, clampWebGLTextNaive } from "./getTextLength" -export { segmentsToCells } from "./segmentsToCells" +export { hslToHex } from "./hslToHex" export { similar } from "./similar" export { sliceSegments } from "./sliceSegments" diff --git a/packages/aitube-timeline/src/utils/segmentsToCells.ts b/packages/aitube-timeline/src/utils/segmentsToCells.ts deleted file mode 100644 index c14590c6..00000000 --- a/packages/aitube-timeline/src/utils/segmentsToCells.ts +++ /dev/null @@ -1,103 +0,0 @@ -import * as THREE from "three" -import { ClapSegment } from "@aitube/clap" - -import { Cell } from "@/types/grid" - -import { getSegmentColorHex } from "./getSegmentColorHex" -import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" -import { sleep } from "./sleep" - -// TODO put this in a web workers for smoother operations? -export async function segmentsToCells({ - segments, - cellHeight, - cellWidth, - nbMaxTracks, - afterTimeInMs, - beforeTimeInMs, -}: { - segments: ClapSegment[] - cellHeight: number - cellWidth: number - nbMaxTracks: number - afterTimeInMs: number - beforeTimeInMs: number -}): Promise { - throw new Error(`this function seems to be unused`) - - const cells: Cell[] = []; - - console.log(`starting segmentsToCells cellWidth = ${cellWidth}`) - // const maxWidth = nbMaxShots * cellWidth - // const maxHeight = nbTracks * cellHeight - - // TODO: we should take our time, to not do this too quickly - // we want to let it "breath" - - let i = 0 - - let addAsyncDelayEveryItems = 100 - let addAsyncDelayInMs = 50 - - console.log(`segmentsToCell(): converting slice [${afterTimeInMs}:${beforeTimeInMs}] (${segments.length} segments)`) - // TODO: we should probably try to keep the existing structure if possible - - // since the for loop is a blocker, we turn it into an async thing - for (const segment of segments) { - - // this helps spliting the segment scanning work, even if we have a huge number of segments - const reachedMilestone = !(++i % addAsyncDelayEveryItems) - if (reachedMilestone) { - // console.log("reached milestone") - await sleep(addAsyncDelayInMs) - } - - // we only keep segments within a given range - // those are not necessarily visible (there is a security margin) - if ( - segment.startTimeInMs < afterTimeInMs || - segment.endTimeInMs > beforeTimeInMs - ) { continue } - - const colors = getSegmentColorHex(segment) - - // TODO: put this somewhere else, in a separate function - // that way we will be able to dynamically adjust it - const startTimeInSteps = segment.startTimeInMs / DEFAULT_DURATION_IN_MS_PER_STEP - const durationInSteps = (segment.endTimeInMs - segment.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP - - console.log(`details: `, { - DEFAULT_DURATION_IN_MS_PER_STEP, - cellWidth, - - startTimeInMs: segment.startTimeInMs, - startTimeInSteps, - - endTimeInMs: segment.endTimeInMs, - durationInSteps, - - x1: (startTimeInSteps * cellWidth) + cellWidth, - x2: (durationInSteps * cellWidth) - 0.2, - }) - const cell: Cell = { - position: new THREE.Vector3( - (startTimeInSteps * cellWidth) + cellWidth, - - // we are negative here as the reference point is in top left - -segment.track * cellHeight + cellHeight, - 1 - ), - - // TODO use segment data to determine the cell height and width - width: (durationInSteps * cellWidth) - 0.2, // tiny padding - height: cellHeight - 0.2, // tiny padding - - color: colors.bg - }; - - cells.push(cell) - } - // console.log("segmentsToCells ended!") - - return cells -} From 1cb82c707a5f64a27ce183de43f20a27fad167da Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 12:55:27 +0200 Subject: [PATCH 099/346] 0.0.0 --- packages/aitube-timeline/README.md | 30 +++++++++++++++----------- packages/aitube-timeline/bun.lockb | Bin 159226 -> 159333 bytes packages/aitube-timeline/package.json | 7 +++--- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index b6b99e38..bf5479e1 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -1,31 +1,37 @@ -# @aitube/react-timeline +# @aitube/timeline -*React component to display a .clap timeline* +*React component to display an OpenClap timeline* ## Introduction -This is a work in progress project. +This library is not ready for public use yet. -For the moment the component is read-only, and can only display text. +This is a "build in public" project so code is open and provided for convenience and discussion, +but there is no official release yet (documentation will be written once the library is useable). -More instructions will be provided until we can do more with it. +Thanks for your patience! ## Installation +Note: as warned before, this library is not ready for public use yet. + +I cannot provide support until the basic features have been implemented and some critical bugs fixed. + ```bash -npm i @aitube/react-timeline +npm i @aitube/timeline ``` -Depending on your project configuration and package manager, you my need to install some additional packages manually, such as React, Radix, Tailwind, Three.js, Zustand etc: +Depending on your project configuration and package manager, you may need to install some additional packages manually, such as React, Radix, Tailwind, Three.js, Zustand etc: ```bash -npm i @aitube/clap @aitube/colors @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand +npm i @aitube/clap @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand ``` -This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. However if there is demand (eg. more than one person asking for it) it might evolve to become more modular in the future. +This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. In the future it may be split into sub-libraries to facilitate support for alternative frameworks. ## TODO -### Performance optimization - -[ ] The timeline is slow when we are zooming out over large amounts of text -> we need to hide the text when it is very small \ No newline at end of file +[ ] BUG: When zooming in an area, large segments (such as music) become invisible due to the way we compute ranges +[ ] FEATURE: Add edit callbacks +[ ] CLEAN: Write doc +[ ] BUG: Fix the Vite previewer diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 32040ebd0601f99557c4c77960c99c17e3c822f0..e069f816ed1a1964b05f70e84a4c9efdf204e555 100755 GIT binary patch delta 27125 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 QKQ?|MXAnd)GUO-!2P@Cj`Tzg` diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 0ed80318..b07b9af1 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -1,5 +1,5 @@ { - "name": "@aitube/react-timeline", + "name": "@aitube/timeline", "module": "index.tsx", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -7,7 +7,7 @@ "version": "0.0.0", "description": "React component to display an OpenClap timeline", "scripts": { - "build": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @aitube/colors --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", + "build": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public", @@ -31,7 +31,6 @@ }, "peerDependencies": { "@aitube/clap": "0.0.23", - "@aitube/colors": "0.0.3", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", @@ -51,7 +50,7 @@ "dependencies": {}, "repository": { "type": "git", - "url": "https://github.com/jbilcke-hf/aitube-react-timeline.git" + "url": "https://github.com/jbilcke-hf/aitube-timeline.git" }, "keywords": [ "OpenClap", From f825a18a3767ac221235bb3a9fcbc3e7a1f0c846 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 13:06:39 +0200 Subject: [PATCH 100/346] 0.0.1 --- packages/aitube-timeline/bun.lockb | Bin 159333 -> 159277 bytes packages/aitube-timeline/package.json | 12 +++++------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index e069f816ed1a1964b05f70e84a4c9efdf204e555..0d6de0956b525ffa4bd0c8037038ca3c8421e759 100755 GIT binary patch delta 8371 zcmeI1d30699mn4Uf_VX3fS%Co7nir@;a$$<6(mG?Re}Y9K%jacFf~8CF{X{1SMX&_Pv@qGyT-=5 z?1IeL*Rw)(i4awx0XS#~N|9QLaueTLw#MU2H~)2L$ggr875>lh#r^wtUW2B)*%N$Y zYW$2|;SmD*Jd9NM$KE779!(_WP;|PkhcIE{wOF(Wj_wG zp8%x@4P7zlnLhJNr8S7{jM=4Xu*k|%HGIy>k*c^qng7qI%73-;-%!1@i+t~Xy2w>O z=gXi5b5CRGtwr2gRPC%YdxSpfkKqP$l%=ZpHhy)u8P!;CvG_=pX)6~Oem*C@9)-X* ziz-W_!Z*)M3~9jks1CZN2>1SD0aDynI5;eYf$}Om{e3DoR*sy zQggqvW`1wYNN>S@-s~4p#r@O#QkB0l|7BDE-myoj9w&;6s#Y?sjLKdm%BB!9{<^K6 ztfaD34cv)eA5BAxi&Xg=VV5>Gzf|Mc!pi@xHibnx)IdwCAXPaTRmb<3y*yRO54dQA z?zMQS+DSuYYQshC-S7VsqKpN!mzN|}g$GPKpmKH8#Z*uBh?S-4u$z^o>Y$g|`=E05 zGaZ1c{m?*JN#&_J8fFzUQT;4NqUvxo%A!0l)$G&FKErgj+2>gK1ypm3S8NXj7MWwQ z=@QeWsOF7TsP6O)(>GE60&8@!R2LPRSQ>!h8-h}#>V`|N`+5J7h8tY?`yHkG*X!Ik z==-~&ieFRjde{B__y0|75cEpQSoatI{`%O^Nfp@F^ja7G!!14&Rg&smk5GXWscQc} z>;B^Y|JQ~8jj#Kye}6-uJG-%kf9Z9;o_M7$B&pi{x^;j3$PIu3D;EC#cvUR?1A&T# ze=@%a{U|CH{>7__u?&X(*{xXkGYAz6|3JmUKXN0WUq;2k{~8zmsW-mxFX%o0j~5zi zAFZTA2F=mhlmvMN%1`2=vUWfwZHZQQ@z7f zi=IVxws$GlC53XxdawW%!XkJP@?bH%3`^h@(ATH8q0zq`PSEQLp5-~vDL@C%X@ia; zG<)fcqzN>G=5QD2oFxgq3-xtK6HP{^Kst5P4ndph#;}?4d+2Xg32L3_1!9I`4MRH3;2Gz9#g5e-U#Dz5;FdPr?^) z0(8*+34912!N;&44!}g11e0Mm{04TyF4zDCunyLMc1EwkFMw@SlfY6k%U}fzhwktr z=n1_b9ooVDUXkZoN9$ansn>kI>lxCiOMmDNI{Ik~?I0CegU+pVu9ym~;amZMA}q1;K%hrM( z`0m5`edt5}A#8WRCh{ux2F-i#paUTT9)rQ48S8G)ER{t$6Mh0?;BgoYnv#Y=GBNu9 z1o>*}qTmz^@9Q^2n(pN-bgc_NUFcTE1~)7#Hm>z@m$@C@+~uxWlD;1$y^kQXLU!%e z7c*ycA6ng&c&2+Nmb(Nu&--$@OL0s>`7R|TpYUpg*Qr@Q?y011yJN0|>*HoxoH}#U z@&mOe?r(O*@+v5;*^~t6uo%CoU(dI4oiPG550|-q2}ovcS7^ikr;#TAp?(-nUM=I>nyO zrNygp>S~X-^NOi-Ggno;s-g8?xZ!1Y{_+{uCFsxN3`oE`f5xTjU%Y_V>Z}{cXf8PG wUJAC*98b#i(u>?H-sK{fTjT! zmbvrIt49+*Ihy!%XSaV%mz~ZPq{<%$@{b1Qdc_S3&u!AP}fsWW-h_u7ikBbcJs@IpI4q*QevrEydI85RP}YBq4UizmH!RX z0@Dqsid6B9pj)!p>Tl^PbxqqrMXJPiRG~zx2HX+$MpSt_t$r<4-Y(0N>I8OMeRrUI zWWYVgO0J|07V5%70wmn6ZE>m01P<~iq2EVSo1URjuwczf`^7W%X#)XsyjJRbB?F+jcLi(0!)uQQf}IF3=_% z=%Oe^ssX#9>ae@{uc@I?Gm|sbx+mEhwil{l`=bfyFqFT*a2-q)A7k}s)oG2#uYM+2 zTzaF$7I#eEFD6dLdoGdWGXea(furg{sL8B^G&l+{sId)D9@{MmFmiuTHbS} zIi}BBzO)i~ucPW`y$jrrgpGfzI@(|jVyPOwNnCkbP~GZn$`5@#D>;0T+pV?Kg^p!c z3w4~Gkg0Y%ED}p~v;UwL=swdz%a^MC2WV;Zi20+nMCjP;YT?^?+@jw_m3o4M^kZu$ z)m43B{*&gHGUo*@ng24Xyss^e2Ez`Wt9;HhPUlXER=G-AJl?bvDu03wrnjOstR71> z&K<<{zSM~eU%w1$VMpXd>QYx?J@ZR-ADdeJyQtcyS-w>DW~c^kVg44uA|r;%)slm5 z+1(bGs-xDZTp1kH;ZIdDRs3G7OI5$mv^}a&2OTIu8M?BcnM0}pAF{es1N1U~A5@`! zrg}{^zyLYFMK#WFYc~?*KOz_ygP{S(qGiz;kw9Rk`RAC7EoX=)?b2 z#S8lIYjMTGUW>jv^^Tb8e>{32FTd)VG>RAW#S8l41$}rbDPGVQFX;cf1w9jKUf#ot zE__u-J2xs5nO-#mYbq|o{44u$4ytPrS;0U0j4R*jwEPt9Ey&cz$_n#6VLp9w=bBG@ z4>I*_vDR-@7kw=>-9q|`&}Np(4D)>tyJ)%lr1@^b*V>nRmM-+6sFQliLfWSqjIE2A zX+C`=-Gr?&%Y5aqZ}FMxqG%&@j)n9E-V-#kHcHg80`vlvUz)EXc3rx2`fYz*e(oQT>9YK&E#gx)^||W(x`FM^B&S1I@PxAAfr9Eq7TBgermR>mof!&D(ItjAPj;;Nb*~=UF-B)F{{FDpgj(~I-kO4a0br9 z1^67a1*Lni)Hhh*x+Si~%meSAS>UQQ(IeF(>;=6+Z;;-Yzrj~<2`Cd@FKhfzXrX3x+}NA?V$afSGbmWpznKa5@`O> zCWCe=>Op;I2#ugIXbYvLzMpGh)P~Za4Ib^Kt);df&j)lkI9nkjKCeS|IIw+*yf#?wDYk5~ISRT6qRDxvC-sC^X`6uW#(Wm^U za28I$5jYAT!a+C$@52W$2_{1pXkot>cENkF0oK8K$b&VolK+~(Z!uOuF1!q{zzFCL zJ>X&J1#SIB?^?!p!+g-EFLFJC8JKNA`zigQJ7`m<4cr5FK`YRX)HW_fi^W!OH)uES z7)$`|0B#3uyN-a-P#0Q2d$=DuKu5@cHqci4Z|yMdfvS)SaZnPpoqrzw2*=>ohOXWaDfKLVGQhmHy{%< zLukI%HuYQBTVN|}gSVjo#=~Rqb9fgt&!@sE+I$QhuscF0=nR@><6xI&@ke1jXr8SM zJ?Wqw!5>2(>`wT80GqH??+u#yHlqVzAPj;bpgF4vXr7uteI$&6aiGnCv7kw5I5ZS6H1$Q@U-;TkbdIx-?hdzd-(D{Df~DzbMk!_juWzaRvEp zf8+L5M=S1f6HB@*zxSX^@wt0kXP1?KagS@2=)7Nf6ko@KZbl^D30LYNx3?%e>9i}G zU+J*Rj&nYr+!cvLx}J0?ZkFGAnzQu2$r+dC3s1T#M7}uXI$bILz^SVve(ve8D@Hey zKf5~ls@_N#7V8YACpJGDd2G%7#xpKs;aS(;t@4>?-Lk}C=OU5aKJlD;vFcC8PkLnV ixJF|KXAT@6Z8sP+W|Uuf&NcNzGvcb`mp|{SO#2t6-%ySK diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index b07b9af1..7628d488 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "React component to display an OpenClap timeline", "scripts": { "build": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -15,8 +15,8 @@ "serve": "vite preview" }, "devDependencies": { - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", + "@types/react": "*", + "@types/react-dom": "*", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", @@ -36,11 +36,9 @@ "@react-spring/types": "^9.7.3", "@react-three/drei": "^9.105.4", "@react-three/fiber": "^8.16.2", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", "clsx": "^2.0.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "*", + "react-dom": "*", "tailwind-merge": "^2.3.0", "tailwindcss": "^3.4.3", "three": "^0.164.1", From 04cd8c840c0396f732052e837e826b05a96480bd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 13:53:59 +0200 Subject: [PATCH 101/346] clean-up --- packages/aitube-timeline/README.md | 15 +++++++++++++ packages/aitube-timeline/src/ClapTimeline.tsx | 21 ++++++++++--------- .../src/components/grid/TimelineGrid.tsx | 2 -- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index bf5479e1..4411843e 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -27,6 +27,21 @@ Depending on your project configuration and package manager, you may need to ins npm i @aitube/clap @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand ``` +If you forget some dependencies you might get weird errors, +such as this one: + +``` +TypeError: (0 , g.jsxDEV) is not a function + at eX (page-e7081404c9d62d4d.js:1:35643) + + children: [(0, g.jsxDEV)(z.i, { + makeDefault: !0, + position: [0, 0, 1] + } +``` + +## Future extensions + This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. In the future it may be split into sub-libraries to facilitate support for alternative frameworks. ## TODO diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index dac661d1..ba2d83aa 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -9,6 +9,7 @@ import { } from "@/components" import { ClapProject } from "@aitube/clap" import { DEFAULT_BACKGROUND_COLOR, DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM, DEFAULT_SHOW_FPS, DEFAULT_ZOOM_DAMPING_FACTOR, DEFAULT_ZOOM_SPEED } from "./constants/defaults" +import { cn } from "./utils" export function ClapTimeline({ clap, @@ -62,17 +63,17 @@ export function ClapTimeline({ background: backgroundColor }} > - - + - - {showFPS && } -
+ minZoom={minZoom} + maxZoom={maxZoom} + zoomSpeed={zoomSpeed} + zoomDampingFactor={zoomDampingFactor} + /> + + +
diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx index 9c890600..6cb6c8e5 100644 --- a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx +++ b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx @@ -108,7 +108,6 @@ export function TimelineGrid() { } linewidth={1} /> - {/**/} ))} @@ -146,7 +145,6 @@ export function TimelineGrid() { /> )} - ); From 3f1963b09e67cfebfaeb6b7d90ee1155f673da0b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 14:12:28 +0200 Subject: [PATCH 102/346] let's go --- packages/aitube-timeline/README.md | 13 +++---------- packages/aitube-timeline/package.json | 5 +++-- .../aitube-timeline/src/hooks/useVisibleSegments.ts | 11 ++++++----- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index 4411843e..c8422325 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -27,18 +27,11 @@ Depending on your project configuration and package manager, you may need to ins npm i @aitube/clap @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand ``` -If you forget some dependencies you might get weird errors, -such as this one: +If you forget some dependencies you might get weird errors -``` -TypeError: (0 , g.jsxDEV) is not a function - at eX (page-e7081404c9d62d4d.js:1:35643) +## Building - children: [(0, g.jsxDEV)(z.i, { - makeDefault: !0, - position: [0, 0, 1] - } -``` +You can see in the package.json that I set `NODE_ENV=production` while building, that's because of a weirdness with Bun: https://github.com/oven-sh/bun/issues/3768 ## Future extensions diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 7628d488..a1c2949f 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,10 +4,11 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.1", + "version": "0.0.2", "description": "React component to display an OpenClap timeline", "scripts": { - "build": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", + "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", + "build:dev": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public", diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 59b6a26f..27b7855a 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -32,11 +32,8 @@ export const useVisibleSegments = ({ const controls = useThree((state) => state.controls) // we do a little trick here, to put the camera zoom inside our Zustand store - const camera = useThree(({ camera }) => { - useTimelineState.setState({ currentZoomLevel: camera.zoom }) - return camera - }) - + const camera = useThree(({ camera }) => camera) + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const getCellHeight = useTimelineState(s => s.getCellHeight) // const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) @@ -45,6 +42,10 @@ export const useVisibleSegments = ({ // TODO: maybe refactor this, put it inside the Zustand state + useEffect(() => { + useTimelineState.setState({ currentZoomLevel: camera.zoom }) + }, [camera]) + const stateRef = useRef<{ position: THREE.Vector3 scale: THREE.Vector3 From c1d18a6101c0cd62bd3541c9b2bf6d8bae9eb0da Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 16:42:08 +0200 Subject: [PATCH 103/346] 0.0.3 --- packages/aitube-timeline/README.md | 15 +++++++ packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/ClapTimeline.tsx | 33 ++++++++------ .../src/components/cells/Cell.tsx | 41 +++++++++++++----- .../src/components/cells/ImageCell.tsx | 5 ++- .../src/components/cells/TextCell.tsx | 43 ++++++++----------- .../src/components/cells/VideoCell.tsx | 19 ++++++-- .../src/components/cells/types.ts | 3 +- .../src/components/grid/TimelineGrid.tsx | 37 +++++++++++++--- .../aitube-timeline/src/constants/defaults.ts | 2 +- packages/aitube-timeline/src/hooks/index.ts | 3 +- packages/aitube-timeline/src/hooks/useAxis.ts | 21 +++++++-- .../src/hooks/useHorizontalGridLines.ts | 38 ++++++++++++++++ .../src/hooks/useTimelineState.ts | 34 +++++++++++---- ...seGridLines.ts => useVerticalGridLines.ts} | 22 +++------- packages/aitube-timeline/src/index.tsx | 1 - packages/aitube-timeline/src/types/theme.ts | 2 + .../aitube-timeline/src/types/timeline.ts | 3 ++ .../src/utils/getDefaultState.ts | 2 + 19 files changed, 234 insertions(+), 92 deletions(-) create mode 100644 packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts rename packages/aitube-timeline/src/hooks/{useGridLines.ts => useVerticalGridLines.ts} (63%) diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index c8422325..113dff5c 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -33,6 +33,21 @@ If you forget some dependencies you might get weird errors You can see in the package.json that I set `NODE_ENV=production` while building, that's because of a weirdness with Bun: https://github.com/oven-sh/bun/issues/3768 +If you are developping the timeline, I recommend to use: + +```bash +bun run build:dev +``` + +to build with the jsxDEV enabled. + +You will also want to use a path like this to test the module directly dependency: + +```json + "@aitube/timeline": "file:/path/to/aitube-timeline", +``` + + ## Future extensions This project is currently not designed to be used with other tools such as Svelte, Vue, or other state manager. In the future it may be split into sub-libraries to facilitate support for alternative frameworks. diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index a1c2949f..361e3dc0 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index ba2d83aa..797d9518 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -8,26 +8,37 @@ import { TimelineGrid } from "@/components" import { ClapProject } from "@aitube/clap" -import { DEFAULT_BACKGROUND_COLOR, DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM, DEFAULT_SHOW_FPS, DEFAULT_ZOOM_DAMPING_FACTOR, DEFAULT_ZOOM_SPEED } from "./constants/defaults" +import { + DEFAULT_FRAMELOOP, + DEFAULT_MAX_ZOOM, + DEFAULT_MIN_ZOOM, + DEFAULT_SHOW_FPS, + DEFAULT_ZOOM_DAMPING_FACTOR, + DEFAULT_ZOOM_SPEED +} from "./constants/defaults" import { cn } from "./utils" export function ClapTimeline({ clap, - + className = "", minZoom = DEFAULT_MIN_ZOOM, maxZoom = DEFAULT_MAX_ZOOM, zoomSpeed = DEFAULT_ZOOM_SPEED, zoomDampingFactor = DEFAULT_ZOOM_DAMPING_FACTOR, showFPS = DEFAULT_SHOW_FPS, - backgroundColor = DEFAULT_BACKGROUND_COLOR + frameloop = DEFAULT_FRAMELOOP, }: { clap?: ClapProject + className?: string minZoom?: number maxZoom?: number zoomSpeed?: number zoomDampingFactor?: number showFPS?: boolean - backgroundColor?: string + + // demand is less CPU intensive, but you will have to manually + // trigger state changes + frameloop?: "demand" | "always" | "never" } = { clap: undefined, @@ -36,19 +47,19 @@ export function ClapTimeline({ zoomSpeed: DEFAULT_ZOOM_SPEED, zoomDampingFactor: DEFAULT_ZOOM_DAMPING_FACTOR, showFPS: DEFAULT_SHOW_FPS, - backgroundColor: DEFAULT_BACKGROUND_COLOR + frameloop: DEFAULT_FRAMELOOP }) { return (
void + setHoveredSegment: (hoveredSegment?: ClapSegment) => void }) { const getSegmentColorScheme = useTimelineState(s => s.getSegmentColorScheme) @@ -42,6 +41,9 @@ export function Cell({ // we need to round this one to avoid *too* many re-renders const widthInPxAfterZoom = Math.round(currentZoomLevel * durationInSteps * cellWidth) + const hoveredSegment = useTimelineState(s => s.hoveredSegment) + const isHovered = hoveredSegment?.id === s.id + const SpecializedCell = s.assetUrl.startsWith("data:image/") ? ImageCell @@ -60,20 +62,39 @@ export function Cell({ // to the right, exactly one half of the RoundedBox's width + ((durationInSteps * cellWidth) / 2), - -verticalCellPosition + (cellHeight / 2), + -verticalCellPosition + (cellHeight / 2), 1 ]} + + onPointerEnter={(e) => { + // console.log('enter') + setHoveredSegment(s) + }} + onPointerLeave={(e) => { + // console.log('leave') + setHoveredSegment(undefined) + }} + + + onClick={(e) => console.log('click')} + onContextMenu={(e) => console.log('context menu')} + onDoubleClick={(e) => console.log('double click')} + // onWheel={(e) => console.log('wheel spins')} + // onPointerUp={(e) => console.log('up')} + // onPointerDown={(e) => console.log('down')} + // onPointerOver={(e) => console.log('over')} + // onPointerOut={(e) => console.log('out')} + + // onPointerMove={(e) => console.log('move')} + // onPointerMissed={() => console.log('missed')} + // onUpdate={(self) => console.log('props have been updated')} > - - console.log('click')} - onContextMenu={(e) => console.log('context menu')} - onDoubleClick={(e) => console.log('double click')} - // onWheel={(e) => console.log('wheel spins')} - // onPointerUp={(e) => console.log('up')} - // onPointerDown={(e) => console.log('down')} - // onPointerOver={(e) => console.log('over')} - // onPointerOut={(e) => console.log('out')} - onPointerEnter={(e) => { - // console.log('enter') - setHovered(s.id) - }} - onPointerLeave={(e) => { - // console.log('leave') - setHovered(s.id) - }} - // onPointerMove={(e) => console.log('move')} - // onPointerMissed={() => console.log('missed')} - // onUpdate={(self) => console.log('props have been updated')} > - + {/* { + if (isHovered && video) { + if (video.paused) { + video.play() + } + } else { + if (!video.paused) { + video.pause() + } + } + }, [isHovered]) + return ( diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts index a9577c63..e5004366 100644 --- a/packages/aitube-timeline/src/components/cells/types.ts +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -5,7 +5,8 @@ export type SpecializedCellProps = { segment: ClapSegment cellWidth: number cellHeight: number - setHovered: (id: string) => void + isHovered: boolean + setHoveredSegment: (hoveredSegment?: ClapSegment) => void durationInSteps: number startTimeInSteps: number colorScheme: ClapSegmentColorScheme diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx index 6cb6c8e5..345c7730 100644 --- a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx +++ b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx @@ -8,7 +8,8 @@ import { DEFAULT_NB_TRACKS } from "@/constants" import { useVisibleSegments, useAxis, - useGridLines, + useVerticalGridLines, + useHorizontalGridLines, useTimelineState } from "@/hooks" @@ -46,7 +47,11 @@ export function TimelineGrid() { const axis = useAxis(width, height) - const gridlines = useGridLines({ + const verticalGridLines = useVerticalGridLines({ + nbMaxShots, + }); + + const horizontalGridLines = useHorizontalGridLines({ nbMaxShots, }); @@ -58,13 +63,14 @@ export function TimelineGrid() { refreshRateInMs, }); - const [hovered, setHovered] = useState("") + const hoveredSegment = useTimelineState(s => s.hoveredSegment) + const setHoveredSegment = useTimelineState(s => s.setHoveredSegment) useEffect(() => { - document.body.style.cursor = hovered ? 'pointer' : 'auto' + document.body.style.cursor = hoveredSegment ? 'pointer' : 'auto' return () => { document.body.style.cursor = 'auto' } - }, [hovered]) + }, [hoveredSegment]) const [props, set] = useSpring(() => ({ pos: [0, 0, 0], @@ -94,7 +100,7 @@ export function TimelineGrid() { /> - {gridlines.map((lineGeometry, idx) => ( + {verticalGridLines.map((lineGeometry, idx) => ( + + {horizontalGridLines.map((lineGeometry, idx) => ( + + + + ))} + + {axis.map((lineGeometry, idx) => ( )} diff --git a/packages/aitube-timeline/src/constants/defaults.ts b/packages/aitube-timeline/src/constants/defaults.ts index 0eef8887..dbeec388 100644 --- a/packages/aitube-timeline/src/constants/defaults.ts +++ b/packages/aitube-timeline/src/constants/defaults.ts @@ -8,7 +8,7 @@ export const DEFAULT_MAX_ZOOM = 7 export const DEFAULT_ZOOM_SPEED = 1.7 // high = faster export const DEFAULT_ZOOM_DAMPING_FACTOR = 0.3 // low : delay, high : faster/snappier export const DEFAULT_SHOW_FPS = false -export const DEFAULT_BACKGROUND_COLOR = "#27272A" +export const DEFAULT_FRAMELOOP = "demand" export const pastel: ClapTimelineTheme = { grid: { diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/aitube-timeline/src/hooks/index.ts index fd5c91d9..8d8d0210 100644 --- a/packages/aitube-timeline/src/hooks/index.ts +++ b/packages/aitube-timeline/src/hooks/index.ts @@ -1,5 +1,6 @@ export { useAxis } from "./useAxis" -export { useGridLines } from "./useGridLines" +export { useVerticalGridLines } from "./useVerticalGridLines" +export { useHorizontalGridLines } from "./useHorizontalGridLines" export { usePreviewTrackHeight } from "./usePreviewTrackHeight" export { useStandardTrackHeight } from "./useStandardTrackHeight" export { useTimelineState } from "./useTimelineState" diff --git a/packages/aitube-timeline/src/hooks/useAxis.ts b/packages/aitube-timeline/src/hooks/useAxis.ts index ae7902dd..e1aef816 100644 --- a/packages/aitube-timeline/src/hooks/useAxis.ts +++ b/packages/aitube-timeline/src/hooks/useAxis.ts @@ -1,21 +1,34 @@ import { useEffect, useState } from "react" import * as THREE from "three" +import { useTimelineState } from "./useTimelineState"; export const useAxis = (width: number, height: number) => { const [axis, setAxis] = useState([] as THREE.BufferGeometry[]); + const getCellHeight = useTimelineState(s => s.getCellHeight) + const cellHeight = getCellHeight() + + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) + const maxHeight = cellHeight + getVerticalCellPosition(0, nbIdentifiedTracks) + useEffect(() => { - const OX = new THREE.BufferGeometry().setFromPoints([ + const horizontalTop = new THREE.BufferGeometry().setFromPoints([ new THREE.Vector3(0, 0, 1), new THREE.Vector3(width, 0, 1) ]); - const OY = new THREE.BufferGeometry().setFromPoints([ + const vertical = new THREE.BufferGeometry().setFromPoints([ new THREE.Vector3(0, 0, 1), - new THREE.Vector3(0, -height, 1) + new THREE.Vector3(0, -maxHeight, 1) + ]); + + const horizontalBottom = new THREE.BufferGeometry().setFromPoints([ + new THREE.Vector3(0, -maxHeight, 1), + new THREE.Vector3(width, -maxHeight, 1) ]); - setAxis([OY, OX]); + setAxis([horizontalTop, vertical, horizontalBottom]); }, [width, height]); return axis; diff --git a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts new file mode 100644 index 00000000..acec6a33 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts @@ -0,0 +1,38 @@ +import { useEffect, useState } from "react" +import * as THREE from "three" + +import { useTimelineState } from "./useTimelineState" + +export const useHorizontalGridLines = ({ + nbMaxShots, +}: { + nbMaxShots: number +}) => { + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + + const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) + + const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); + + const maxWidth = nbMaxShots * cellWidth + + useEffect(() => { + + const thisLines = [] as THREE.BufferGeometry[]; + + for (let i = 0; i <= nbIdentifiedTracks; i++) { + const horizontalLinePoints = [ + new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), + new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 1) + ]; + const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); + + thisLines.push(horizontalLineGeometry); + } + + setGridLines(thisLines); + }, [maxWidth, cellWidth, nbIdentifiedTracks, nbMaxShots]); + + return gridlines; +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index c34863de..c98cd2a7 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -26,10 +26,21 @@ export const useTimelineState = create((set, get) => ({ let typicalSegmentDurationInSteps = DEFAULT_COLUMNS_PER_SLICE * DEFAULT_DURATION_IN_MS_PER_STEP - // TODO: should be done by the Clap parser and/or serializer - // send a demand to Julian (@flngr) to get it fixed + // TODO: many of those checks about average duration, nb of tracks, collisions... + // should be done by the Clap parser and/or serializer + // send a demand to Julian (@flngr) to get it fixed! + + let idCollisionDetector = new Set() + let nbIdentifiedTracks = 0 for (const s of segments) { + + if (idCollisionDetector.has(s.id)) { + console.log(`collision detected! there is already a segment with id ${s.id}`) + continue + } + idCollisionDetector.add(s.id) + if (s.track > nbIdentifiedTracks) { nbIdentifiedTracks = s.track } @@ -148,9 +159,11 @@ export const useTimelineState = create((set, get) => ({ baseLightness, backgroundColor: hslToHex(baseHue, baseSaturation, baseLightness), + backgroundColorHover: hslToHex(baseHue, baseSaturation + 10, baseLightness + 1), foregroundColor: hslToHex(baseHue, baseSaturation, baseLightness), - borderColor: hslToHex(baseHue, baseSaturation, baseLightness), - textColor: hslToHex(baseHue, baseSaturation, baseLightness), + borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), + textColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), + textColorHover: hslToHex(baseHue, baseSaturation + 40, baseLightness + 2), } if (!segment) { return colorScheme } @@ -167,12 +180,17 @@ export const useTimelineState = create((set, get) => ({ baseSaturation, baseLightness, - backgroundColor: hslToHex(baseHue, baseSaturation, baseLightness), - foregroundColor: hslToHex(baseHue, baseSaturation, baseLightness), - borderColor: hslToHex(baseHue, baseSaturation, baseLightness), - textColor: hslToHex(baseHue, baseSaturation + 40, 30), + backgroundColor: hslToHex(baseHue, baseSaturation + 10, baseLightness), + backgroundColorHover: hslToHex(baseHue, baseSaturation + 20, baseLightness + 1), + foregroundColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), + borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), + textColor: hslToHex(baseHue, baseSaturation + 50, baseLightness - 40), + textColorHover: hslToHex(baseHue, baseSaturation + 50, baseLightness - 38), } return colorScheme + }, + setHoveredSegment: (hoveredSegment?: ClapSegment) =>  { + set({ hoveredSegment }) } })) diff --git a/packages/aitube-timeline/src/hooks/useGridLines.ts b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts similarity index 63% rename from packages/aitube-timeline/src/hooks/useGridLines.ts rename to packages/aitube-timeline/src/hooks/useVerticalGridLines.ts index f10dd790..ab7b7f3c 100644 --- a/packages/aitube-timeline/src/hooks/useGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts @@ -3,27 +3,27 @@ import * as THREE from "three" import { useTimelineState } from "./useTimelineState" -export const useGridLines = ({ +export const useVerticalGridLines = ({ nbMaxShots, }: { nbMaxShots: number }) => { const cellWidth = useTimelineState(s => s.horizontalZoomLevel) - const getCellHeight = useTimelineState(s => s.getCellHeight) const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const getCellHeight = useTimelineState(s => s.getCellHeight) + const cellHeight = getCellHeight() + const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const maxWidth = nbMaxShots * cellWidth - const maxHeight = getVerticalCellPosition(0, nbIdentifiedTracks) + const maxHeight = cellHeight + getVerticalCellPosition(0, nbIdentifiedTracks) useEffect(() => { const thisLines = [] as THREE.BufferGeometry[]; - // TODO: this is a for (let i = 0; i < nbMaxShots; i++) { const verticalLinePoints = [ new THREE.Vector3(i * cellWidth, 0, 1), @@ -34,18 +34,8 @@ export const useGridLines = ({ thisLines.push(verticalLineGeometry); } - for (let i = 0; i < nbIdentifiedTracks; i++) { - const horizontalLinePoints = [ - new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), - new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 1) - ]; - const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); - - thisLines.push(horizontalLineGeometry); - } - setGridLines(thisLines); - }, [maxWidth, maxHeight, cellWidth, nbIdentifiedTracks, nbMaxShots]); + }, [maxHeight, cellWidth, nbMaxShots]); return gridlines; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 24ec1404..023b7820 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -12,7 +12,6 @@ export { export { useAxis, - useGridLines, usePreviewTrackHeight, useStandardTrackHeight, useTimelineState, diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/aitube-timeline/src/types/theme.ts index 62032c78..8d7fb0b8 100644 --- a/packages/aitube-timeline/src/types/theme.ts +++ b/packages/aitube-timeline/src/types/theme.ts @@ -19,7 +19,9 @@ export type ClapSegmentColorScheme = { baseLightness: number backgroundColor: string + backgroundColorHover: string foregroundColor: string borderColor: string textColor: string + textColorHover: string } \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index f58b3b36..e5b9732f 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -32,6 +32,8 @@ export type TimelineStoreState = { // note: this is a mirror value of // it might change rapidly (many times per seconds), so use with care! currentZoomLevel: number + + hoveredSegment?: ClapSegment } @@ -42,6 +44,7 @@ export type TimelineStoreModifiers = { getCellHeight: (trackNumber?: number) => number getVerticalCellPosition: (start: number,end: number) => number getSegmentColorScheme: (segment?: ClapSegment) => ClapSegmentColorScheme + setHoveredSegment: (hoveredSegment?: ClapSegment) => void } diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 8fef484a..71abc797 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -48,5 +48,7 @@ export function getDefaultState(): TimelineStoreState { typicalSegmentDurationInSteps: 4, currentZoomLevel: 1.0, + + hoveredSegment: undefined, } } \ No newline at end of file From 164e7a8f9b97f9a8134da00d7f0049d7c5b064ef Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 31 May 2024 16:44:27 +0200 Subject: [PATCH 104/346] make sure we never publish something that has jsxDev --- packages/aitube-timeline/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 361e3dc0..b797d633 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -11,7 +11,7 @@ "build:dev": "bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm publish --access public", + "publish": "bun run build && npm publish --access public", "dev": "vite", "serve": "vite preview" }, From 075181dde4e11219e58062e71ec430ec4a653023 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 1 Jun 2024 21:03:28 +0200 Subject: [PATCH 105/346] 0.0.4 --- packages/aitube-timeline/bun.lockb | Bin 159277 -> 159613 bytes packages/aitube-timeline/index.html | 5 +- packages/aitube-timeline/package.json | 4 +- packages/aitube-timeline/src/ClapTimeline.tsx | 31 +++- .../src/components/camera/TimelineCamera.tsx | 18 ++ .../src/components/camera/index.ts | 2 + .../src/components/camera/types.tsx | 3 + .../src/components/cells/Cell.tsx | 2 +- .../src/components/cells/TextCell.tsx | 7 +- .../components/controls/TimelineControls.tsx | 79 +++++++- .../src/components/controls/types.ts | 3 + .../src/components/grid/TimelineGrid.tsx | 174 ------------------ .../src/components/grid/index.ts | 1 - .../aitube-timeline/src/components/index.ts | 2 +- .../scroller/HorizontalScroller.tsx | 32 +++- .../components/scroller/VerticalScroller.tsx | 39 ++-- .../src/components/timeline/Cells.tsx | 74 ++++++++ .../src/components/timeline/Grid.tsx | 95 ++++++++++ .../components/timeline/LeftBarTrackScale.tsx | 145 +++++++++++++++ .../src/components/timeline/Timeline.tsx | 64 +++++++ .../components/timeline/TopBarTimeScale.tsx | 155 ++++++++++++++++ .../src/components/timeline/index.ts | 5 + .../aitube-timeline/src/constants/defaults.ts | 4 +- .../aitube-timeline/src/constants/grid.ts | 2 + .../aitube-timeline/src/constants/themes.ts | 28 +-- packages/aitube-timeline/src/demo.tsx | 4 +- packages/aitube-timeline/src/hooks/useAxis.ts | 7 +- .../aitube-timeline/src/hooks/useDebounce.ts | 15 ++ .../src/hooks/useHorizontalTrackLines.ts | 33 ++++ .../src/hooks/useTimeScaleGraduations.ts | 90 +++++++++ .../src/hooks/useTimelineState.ts | 115 +++++++++--- .../src/hooks/useVerticalGridLines.ts | 8 +- packages/aitube-timeline/src/index.tsx | 5 +- .../aitube-timeline/src/types/timeline.ts | 48 ++++- packages/aitube-timeline/src/utils/clamp.ts | 3 + .../src/utils/debounceAsync.ts | 66 +++++++ .../aitube-timeline/src/utils/debounceSync.ts | 59 ++++++ .../src/utils/formatTimestamp.ts | 41 +++++ .../src/utils/getDefaultState.ts | 18 +- .../src/utils/getTextLength.ts | 11 +- .../aitube-timeline/src/utils/throttle.ts | 24 +++ 41 files changed, 1227 insertions(+), 294 deletions(-) create mode 100644 packages/aitube-timeline/src/components/camera/TimelineCamera.tsx create mode 100644 packages/aitube-timeline/src/components/camera/index.ts create mode 100644 packages/aitube-timeline/src/components/camera/types.tsx create mode 100644 packages/aitube-timeline/src/components/controls/types.ts delete mode 100644 packages/aitube-timeline/src/components/grid/TimelineGrid.tsx delete mode 100644 packages/aitube-timeline/src/components/grid/index.ts create mode 100644 packages/aitube-timeline/src/components/timeline/Cells.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/Grid.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/Timeline.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/index.ts create mode 100644 packages/aitube-timeline/src/hooks/useDebounce.ts create mode 100644 packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts create mode 100644 packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts create mode 100644 packages/aitube-timeline/src/utils/clamp.ts create mode 100644 packages/aitube-timeline/src/utils/debounceAsync.ts create mode 100644 packages/aitube-timeline/src/utils/debounceSync.ts create mode 100644 packages/aitube-timeline/src/utils/formatTimestamp.ts create mode 100644 packages/aitube-timeline/src/utils/throttle.ts diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 0d6de0956b525ffa4bd0c8037038ca3c8421e759..a8cb1747a2606026b360bd70dd07ae11b0e4260c 100755 GIT binary patch delta 27554 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 delta 27475 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 Ue~Y!c$~84qt={{cT9)~L0IuQ6xc~qF diff --git a/packages/aitube-timeline/index.html b/packages/aitube-timeline/index.html index b708f0fa..bc23825e 100644 --- a/packages/aitube-timeline/index.html +++ b/packages/aitube-timeline/index.html @@ -3,9 +3,10 @@ Demo + - -

+ +
\ No newline at end of file diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index b797d633..8ecb68a2 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.3", + "version": "0.0.4", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -46,7 +46,7 @@ "typescript": "^5.4.5", "zustand": "4.5.2" }, - "dependencies": {}, + "dependencies": { "date-fns": "^3.6.0" }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-timeline.git" diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index 797d9518..cf256a17 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -1,11 +1,11 @@ -import { Canvas } from "@react-three/fiber" -import { OrthographicCamera, Stats } from "@react-three/drei" +import { Canvas, useFrame, useThree } from "@react-three/fiber" +import { Stats } from "@react-three/drei" import { TimelineControls, HorizontalScroller, VerticalScroller, - TimelineGrid + Timeline } from "@/components" import { ClapProject } from "@aitube/clap" import { @@ -17,6 +17,10 @@ import { DEFAULT_ZOOM_SPEED } from "./constants/defaults" import { cn } from "./utils" +import { TimelineCamera } from "./components/camera" +import { useTimelineState } from "./hooks" +import { clamp } from "./utils/clamp" +import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "./constants/themes" export function ClapTimeline({ clap, @@ -53,8 +57,8 @@ export function ClapTimeline({
-
-
+
+
{ + useTimelineState.getState().handleMouseWheel({ + deltaX: wheelEvent.deltaX, + deltaY: wheelEvent.deltaY + }) + }} > - + - - + + {showFPS && }
- + { + // + }
); diff --git a/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx b/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx new file mode 100644 index 00000000..5caf9979 --- /dev/null +++ b/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx @@ -0,0 +1,18 @@ +import { OrthographicCamera } from "@react-three/drei" + +import { useTimelineState } from "@/hooks" + +export function TimelineCamera() { + const setTimelineCamera = useTimelineState(s => s.setTimelineCamera) + return ( + { + if (ortographicCamera) { + setTimelineCamera(ortographicCamera) + } + }} + makeDefault + position={[0, 0, 1]} + /> + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/camera/index.ts b/packages/aitube-timeline/src/components/camera/index.ts new file mode 100644 index 00000000..d751da82 --- /dev/null +++ b/packages/aitube-timeline/src/components/camera/index.ts @@ -0,0 +1,2 @@ +export { TimelineCamera } from "./TimelineCamera" +export { TimelineCameraImpl } from "./types" diff --git a/packages/aitube-timeline/src/components/camera/types.tsx b/packages/aitube-timeline/src/components/camera/types.tsx new file mode 100644 index 00000000..0f24a1b5 --- /dev/null +++ b/packages/aitube-timeline/src/components/camera/types.tsx @@ -0,0 +1,3 @@ +import { OrthographicCamera as OrthographicCameraImpl } from 'three' + +export type TimelineCameraImpl = OrthographicCameraImpl diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 964ec804..346e4e9f 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -63,7 +63,7 @@ export function Cell({ + ((durationInSteps * cellWidth) / 2), -verticalCellPosition + (cellHeight / 2), - 1 + -1 ]} onPointerEnter={(e) => { diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 7ea177a6..10738c17 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -38,8 +38,8 @@ export function TextCell({ const padding = 1.2 - const fontSize = 12 - const lineHeight = 1.0 + const fontSize = 13 + const lineHeight = 1.2 return ( { + let { + scrollX, + scrollY, + timelineCamera, + timelineControls, + maxHeight, + leftBarTrackScale, + topBarTimelineScale, + } = useTimelineState.getState() + + if (!timelineCamera || !timelineControls) { return } + + const min = maxHeight * 0.5 + const max = maxHeight * 0.5 + + scrollX = Math.max(-leftBarTrackScaleWidth, scrollX) + + const availableHeight = Math.min(size.height, maxHeight) + + scrollY = clamp( + // should depend upon the current zoom level + // if we are "high" in the sky (low zoom value) + // then we need to to go further noth + // now, the problem is that depends + scrollY, // + (zoomHeight / 2), + -availableHeight / 2, // (availableHeight / 2), + availableHeight + ) + + timelineCamera.position.setX(scrollX) + timelineControls.target.setX(scrollX) + + timelineCamera.position.setY(scrollY) + timelineControls.target.setY(scrollY) + + useTimelineState.setState({ scrollX, scrollY }) + + if (topBarTimelineScale) { + topBarTimelineScale.position.y = (-topBarTimeScaleHeight + scrollY) + (size.height / 2) + } + + if (leftBarTrackScale) { + leftBarTrackScale.position.x = scrollX + } + + gl.render(scene, camera) + }, 1) + + + const setTimelineControls = useTimelineState(s => s.setTimelineControls) // TODO: we should create a new class extending from MapControls // and add some custom code to put limits, to avoid going out of bounds // I also don't like how scroll is working on macOS, because the mouse wheel @@ -22,8 +87,13 @@ export function TimelineControls({ // it it's hard to stop the zoom "in time" return ( { + if (mapControls) { + setTimelineControls(mapControls) + } + }} makeDefault - // enabled + enabled={false} // minDistance={10} // maxDistance={10} minZoom={minZoom} @@ -36,12 +106,15 @@ export function TimelineControls({ enableDamping dampingFactor={zoomDampingFactor} - enableZoom + // we don't need the zoom if we have powerful grom size control settings, + // since those provide control over the X and Y zoom + enableZoom={false} + zoomSpeed={zoomSpeed} enableRotate={false} // rotateSpeed={0} - // enablePan + enablePan // panSpeed={1.0} screenSpacePanning // keyPanSpeed: number; diff --git a/packages/aitube-timeline/src/components/controls/types.ts b/packages/aitube-timeline/src/components/controls/types.ts new file mode 100644 index 00000000..8450c4ab --- /dev/null +++ b/packages/aitube-timeline/src/components/controls/types.ts @@ -0,0 +1,3 @@ +import { MapControls as MapControlsImpl } from 'three-stdlib' + +export type TimelineControlsImpl = MapControlsImpl diff --git a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx b/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx deleted file mode 100644 index 345c7730..00000000 --- a/packages/aitube-timeline/src/components/grid/TimelineGrid.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import React, { useEffect, useState } from "react" -import * as THREE from "three" -import { Plane } from "@react-three/drei" -import { useThree } from "@react-three/fiber" -import { useSpring, a, animated, config } from "@react-spring/three" - -import { DEFAULT_NB_TRACKS } from "@/constants" -import { - useVisibleSegments, - useAxis, - useVerticalGridLines, - useHorizontalGridLines, - useTimelineState -} from "@/hooks" - -import { Cell } from "@/components/cells" -import { hslToHex } from "@/utils" - -export function TimelineGrid() { - const { size, viewport } = useThree() - - const typicalSegmentDurationInSteps = useTimelineState(s => s.typicalSegmentDurationInSteps) - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) - const getCellHeight = useTimelineState(s => s.getCellHeight) - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) - - const baseCellHeight = getCellHeight() - - const nbMaxShots = ((3 * 60 * 60) / 2) // 3 hours converted to seconds, and divided by 2 (a shot is about 2 sec) - const nbMaxTracks = DEFAULT_NB_TRACKS - - // refresh rate for the grid (high value == delay before we see the "hidden" cells) - // this should be a fact of the number of segments, - // as this puts a strain on the rendering FPS - // - // another solution can also consist in rendering more hidden cells, - // to avoid having to re-compute - const refreshRateInMs = 500 - - // const aspect = size.width / viewport.width; - - // const controls = useThree((state) => state.controls) - // const camera = useThree((state) => state.camera) - - const width = nbMaxShots * cellWidth - const height = getVerticalCellPosition(0, nbMaxTracks) - - const axis = useAxis(width, height) - - const verticalGridLines = useVerticalGridLines({ - nbMaxShots, - }); - - const horizontalGridLines = useHorizontalGridLines({ - nbMaxShots, - }); - - // note: this one is async, so it creates a delay - // we could cheat by detecting the cell width change and apply it - // faster on the current geometries - const visibleSegments = useVisibleSegments({ - nbMaxTracks, - refreshRateInMs, - }); - - const hoveredSegment = useTimelineState(s => s.hoveredSegment) - const setHoveredSegment = useTimelineState(s => s.setHoveredSegment) - - useEffect(() => { - document.body.style.cursor = hoveredSegment ? 'pointer' : 'auto' - - return () => { document.body.style.cursor = 'auto' } - }, [hoveredSegment]) - - const [props, set] = useSpring(() => ({ - pos: [0, 0, 0], - scale: [1, 1, 1], - rotation: [0, 0, 0], - config: { mass: 10, tension: 1000, friction: 300, precision: 0.00001 } - })) - - return ( - - - {/* background */} - - - {verticalGridLines.map((lineGeometry, idx) => ( - - - - ))} - - - - {horizontalGridLines.map((lineGeometry, idx) => ( - - - - ))} - - - - {axis.map((lineGeometry, idx) => ( - - - - ))} - - - - {visibleSegments.map((s) => - - )} - - - - ); -}; diff --git a/packages/aitube-timeline/src/components/grid/index.ts b/packages/aitube-timeline/src/components/grid/index.ts deleted file mode 100644 index d2b71c92..00000000 --- a/packages/aitube-timeline/src/components/grid/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { TimelineGrid } from "./TimelineGrid" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/index.ts b/packages/aitube-timeline/src/components/index.ts index cbb4faa9..273bbcb1 100644 --- a/packages/aitube-timeline/src/components/index.ts +++ b/packages/aitube-timeline/src/components/index.ts @@ -9,4 +9,4 @@ export { export { TimelineControls } from "./controls" export { HorizontalScroller, VerticalScroller } from "./scroller" -export { TimelineGrid } from "./grid" \ No newline at end of file +export { Timeline, TopBarTimeScale, Cells, Grid } from "./timeline" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx index 6199de93..4845b124 100644 --- a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -2,36 +2,52 @@ import { HorizontalSlider } from "@/components/slider" import { useTimelineState } from "@/hooks/useTimelineState" export function HorizontalScroller() { - const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) + const timelineCamera = useTimelineState(s => s.timelineCamera) + const timelineControls = useTimelineState(s => s.timelineControls) + + const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) const maxHorizontalZoomLevel = useTimelineState((s) => s.maxHorizontalZoomLevel) const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) - const handleZoomChange = (newRange: number[]) => { - setHorizontalZoomLevel(newRange[0]) + if (!timelineCamera || !timelineControls) { return null } + + const handleTimelinePositionChange = (newValue: number) => { + timelineCamera.position.setX(newValue) + timelineControls.target.setX(newValue) + } + const handleZoomChange = (newZoom: number) => { + setHorizontalZoomLevel(newZoom) + } // TODO: we want to control two things: // on mouse click & drag, we want to move horizontally inside the timeline // on mouse wheel (on hover), we want to adjust the horizontal time scale + const range = [ + timelineCamera.position.x // start of the tracker + // end of the tracker + ] + return ( <>
handleTimelinePositionChange(newRange[0])} onWheel={(e) => { console.log("HorizontalTimelineSlider: received a mouse wheel event:", { deltaX: e.deltaX, deltaY: e.deltaY, z: e.deltaZ }) + handleZoomChange(horizontalZoomLevel + e.deltaY) }} />
diff --git a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx index 566ab7c0..89da0d43 100644 --- a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx @@ -1,38 +1,39 @@ +import { useThree } from "@react-three/fiber" + import { VerticalSlider } from "@/components/slider" import { useTimelineState } from "@/hooks/useTimelineState" export function VerticalScroller() { - const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) - const maxHorizontalZoomLevel = useTimelineState((s) => s.maxHorizontalZoomLevel) + const timelineCamera = useTimelineState(s => s.timelineCamera) + const timelineControls = useTimelineState(s => s.timelineControls) + const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) - const handleZoomChange = (newRange: number[]) => { - setHorizontalZoomLevel(newRange[0]) - } - // TODO: we want to control two things: // on mouse click & drag, we want to move horizontally inside the timeline // on mouse wheel (on hover), we want to adjust the horizontal time scale + if (!timelineCamera || !timelineControls) { return null } + + const handleScrollChange = (newValue: number) => { + + } + + const value = timelineCamera.zoom ? (timelineCamera.position.y / timelineCamera.zoom) : timelineCamera.position.y + return ( <> -
+
{ - console.log("VerticalTimelineSlider: received a mouse wheel event:", { - deltaX: e.deltaX, - deltaY: e.deltaY, - z: e.deltaZ - }) - }} + value={[value]} + onValueChange={(newRange: number[]) => handleScrollChange(newRange[0])} + />
diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx new file mode 100644 index 00000000..904d7776 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -0,0 +1,74 @@ +import React, { useEffect } from "react" +import { useSpring, a, animated, config } from "@react-spring/three" + +import { DEFAULT_NB_TRACKS } from "@/constants" +import { + useVisibleSegments, + useTimelineState +} from "@/hooks" + +import { Cell } from "@/components/cells" + +export function Cells({ + width, + height +}: { + width: number + height: number +}) { + + const nbMaxTracks = DEFAULT_NB_TRACKS + + // refresh rate for the grid (high value == delay before we see the "hidden" cells) + // this should be a fact of the number of segments, + // as this puts a strain on the rendering FPS + // + // another solution can also consist in rendering more hidden cells, + // to avoid having to re-compute + const refreshRateInMs = 500 + + // note: this one is async, so it creates a delay + // we could cheat by detecting the cell width change and apply it + // faster on the current geometries + const visibleSegments = useVisibleSegments({ + nbMaxTracks, + refreshRateInMs, + }); + + const hoveredSegment = useTimelineState(s => s.hoveredSegment) + const setHoveredSegment = useTimelineState(s => s.setHoveredSegment) + + useEffect(() => { + document.body.style.cursor = hoveredSegment ? 'pointer' : 'auto' + + return () => { document.body.style.cursor = 'auto' } + }, [hoveredSegment]) + + const [props, set] = useSpring(() => ({ + pos: [0, 0, 0], + scale: [1, 1, 1], + rotation: [0, 0, 0], + config: { mass: 10, tension: 1000, friction: 300, precision: 0.00001 } + })) + + console.log(`re-rendering `) + + return ( + + {visibleSegments.map((s) => + + )} + + ); +}; diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/aitube-timeline/src/components/timeline/Grid.tsx new file mode 100644 index 00000000..7124a9e0 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/Grid.tsx @@ -0,0 +1,95 @@ +import React from "react" + +import { DEFAULT_NB_TRACKS } from "@/constants" +import { + useAxis, + useVerticalGridLines, + useHorizontalGridLines, + useTimelineState +} from "@/hooks" + +import { hslToHex } from "@/utils" +import { NB_MAX_SHOTS } from "@/constants/grid" + +export function Grid({ + width, + height +}: { + width: number + height: number +}) { + const typicalSegmentDurationInSteps = useTimelineState(s => s.typicalSegmentDurationInSteps) + + const nbMaxShots = NB_MAX_SHOTS + const nbMaxTracks = DEFAULT_NB_TRACKS + + const axis = useAxis(width, height) + + const verticalGridLines = useVerticalGridLines({ + nbMaxShots, + }); + + const horizontalGridLines = useHorizontalGridLines({ + nbMaxShots, + }); + + console.log(`re-rendering `) + + return ( + <> + + {verticalGridLines.map((lineGeometry, idx) => ( + + + + ))} + + + + {horizontalGridLines.map((lineGeometry, idx) => ( + + + + ))} + + + + {axis.map((lineGeometry, idx) => ( + + + + ))} + + + + ); +}; diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx new file mode 100644 index 00000000..02a6aa99 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx @@ -0,0 +1,145 @@ +import React from "react" +import { Plane, Text } from "@react-three/drei" + +import { +useTimelineState +} from "@/hooks" + +import { leftBarTrackScaleWidth } from "@/constants/themes" +import { useHorizontaTrackLines } from "@/hooks/useHorizontalTrackLines" +import { LineGeometry } from "three/examples/jsm/Addons.js" +import { hslToHex } from "@/utils" + +export function LeftBarTrackScale({ + width, + height +}: { + width: number + height: number +}) { + console.log(`re-rendering `) + const getCellHeight = useTimelineState((s) => s.getCellHeight) + + const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) + + const tracks = useTimelineState(s => s.tracks) + + const setLeftBarTrackScale = useTimelineState(s => s.setLeftBarTrackScale) + + + const horizontalTrackLines = useHorizontaTrackLines(); + + return ( + { + if (r) { + setLeftBarTrackScale(r) + } + }} + position={[-leftBarTrackScaleWidth, height / 2, -2]} + > + + {horizontalTrackLines.map((lineGeometry, idx) => ( + + + + ))} + + + {tracks.map(track => ( + + { + + } + + Track { + track.id + } + + + { + track.name + } + + + ))} + + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/timeline/Timeline.tsx b/packages/aitube-timeline/src/components/timeline/Timeline.tsx new file mode 100644 index 00000000..6555c3e5 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/Timeline.tsx @@ -0,0 +1,64 @@ +import React, { useEffect } from "react" +import { Plane } from "@react-three/drei" +import { useFrame, useThree } from "@react-three/fiber" + +import { DEFAULT_NB_TRACKS } from "@/constants" +import { + useTimelineState +} from "@/hooks" + + +import { NB_MAX_SHOTS } from "@/constants/grid" +import { Grid } from "./Grid" +import { Cells } from "./Cells" +import { TopBarTimeScale } from "./TopBarTimeScale" +import { clamp } from "@/utils/clamp" +import { LeftBarTrackScale } from "./LeftBarTrackScale" + +export function Timeline() { + const { size } = useThree() + + // careful, this will update everytime the horizontal zoom level changes + // which can be intensive + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + + const nbMaxShots = NB_MAX_SHOTS + const nbMaxTracks = DEFAULT_NB_TRACKS + + // const aspect = size.width / viewport.width; + + const width = nbMaxShots * cellWidth + const height = getVerticalCellPosition(0, nbMaxTracks) + + console.log(`re-rendering `) + return ( + + + {/* background */} + + + + + + + + ); +}; diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx new file mode 100644 index 00000000..da107fd3 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -0,0 +1,155 @@ +import React, { useRef } from "react" + +import { Plane, Text } from "@react-three/drei" + +import { +useTimelineState +} from "@/hooks" + +import { hslToHex } from "@/utils" +import { useTimeScaleGraduations } from "@/hooks/useTimeScaleGraduations" +import { DEFAULT_DURATION_IN_MS_PER_STEP, NB_MAX_SHOTS } from "@/constants/grid" +import { formatTimestamp } from "@/utils/formatTimestamp" +import { useFrame, useThree } from "@react-three/fiber" + +import { topBarTimeScaleHeight } from "@/constants/themes" + +export function TopBarTimeScale({ + width, + height +}: { + width: number + height: number +}) { + const { size } = useThree() + + // we use the non-reactive version + // const cellWidth = useTimelineState((s) => s.horizontalZoomLevel) + const cellWidth = useTimelineState.getState().horizontalZoomLevel + + const nbMaxShots = NB_MAX_SHOTS + + const unit = 10 + + // note: recomputing this is expensive and creates a visual delay + const timeScaleGraduations = useTimeScaleGraduations({ + nbMaxShots, + unit + }); + + let timestampInMs = 0 + + const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) + + console.log(`re-rendering `) + + const setTopBarTimelineScale = useTimelineState(s => s.setTopBarTimelineScale) + + return ( + { + if (r) { + setTopBarTimelineScale(r) + } + }} + position={[0, 0, 0]} + onWheel={(e) => { + setHorizontalZoomLevel( + useTimelineState.getState().horizontalZoomLevel + (0.5 * e.deltaY) + ) + e.stopPropagation() + }} + > + + + + + + + + {timeScaleGraduations.map((lineGeometry, idx) => ( + + + + ))} + + + {timeScaleGraduations.map((lineGeometry, idx) => ( + 40 + ? true + + // if this is too tight, we only display the coarse time ticks + : cellWidth > 4 + ? idx % unit === 0 + + : false + } + > + { + formatTimestamp( + timestampInMs += DEFAULT_DURATION_IN_MS_PER_STEP, { + hours: false, // idx % unit === 0, + minutes: idx % unit === 0, + seconds: true, + milliseconds: cellWidth > 20, + })} + + ))} + + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/timeline/index.ts b/packages/aitube-timeline/src/components/timeline/index.ts new file mode 100644 index 00000000..0fdaf385 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/index.ts @@ -0,0 +1,5 @@ +export { Timeline } from "./Timeline" +export { TopBarTimeScale } from "./TopBarTimeScale" +export { LeftBarTrackScale } from "./LeftBarTrackScale" +export { Cells } from "./Cells" +export { Grid } from "./Grid" \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/defaults.ts b/packages/aitube-timeline/src/constants/defaults.ts index dbeec388..2e218659 100644 --- a/packages/aitube-timeline/src/constants/defaults.ts +++ b/packages/aitube-timeline/src/constants/defaults.ts @@ -15,8 +15,8 @@ export const pastel: ClapTimelineTheme = { backgroundColor: "#27272A", }, cell: { - saturation: 20.3, - lightness: 71.4, + saturation: 28.4, + lightness: 78.6, hues: baseClapSegmentCategoryHues, } } diff --git a/packages/aitube-timeline/src/constants/grid.ts b/packages/aitube-timeline/src/constants/grid.ts index e378098e..8ebfa9b1 100644 --- a/packages/aitube-timeline/src/constants/grid.ts +++ b/packages/aitube-timeline/src/constants/grid.ts @@ -9,3 +9,5 @@ export const DEFAULT_COLUMNS_PER_SLICE = 4 export const PROMPT_STEP_HEIGHT_IN_PX = 48 export const PREVIEW_STEP_HEIGHT_IN_PX = 3 * PROMPT_STEP_HEIGHT_IN_PX + +export const NB_MAX_SHOTS = ((3 * 60 * 60) / 2) // 3 hours converted to seconds, and divided by 2 (a shot is about 2 sec) diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/aitube-timeline/src/constants/themes.ts index 7b1b8513..30d263ed 100644 --- a/packages/aitube-timeline/src/constants/themes.ts +++ b/packages/aitube-timeline/src/constants/themes.ts @@ -1,6 +1,10 @@ +import { ClapSegmentCategory } from "@aitube/clap" + import { ClapTimelineTheme } from "@/types" import { ClapSegmentCategoryHues } from "@/types/theme" -import { ClapSegmentCategory } from "@aitube/clap" + +export const leftBarTrackScaleWidth = 120 +export const topBarTimeScaleHeight = 40 export const baseClapSegmentCategoryHues: ClapSegmentCategoryHues = { [ClapSegmentCategory.SPLAT]: 347, @@ -9,22 +13,22 @@ export const baseClapSegmentCategoryHues: ClapSegmentCategoryHues = { [ClapSegmentCategory.EVENT]: 270, [ClapSegmentCategory.INTERFACE]: 216, [ClapSegmentCategory.PHENOMENON]: 270, - [ClapSegmentCategory.VIDEO]: 65, - [ClapSegmentCategory.STORYBOARD]: 65, - [ClapSegmentCategory.TRANSITION]: 65, + [ClapSegmentCategory.VIDEO]: 70, + [ClapSegmentCategory.STORYBOARD]: 70, + [ClapSegmentCategory.TRANSITION]: 55, [ClapSegmentCategory.CHARACTER]: 285.8, [ClapSegmentCategory.LOCATION]: 80.9, - [ClapSegmentCategory.TIME]: 91, - [ClapSegmentCategory.ERA]: 91, + [ClapSegmentCategory.TIME]: 250, + [ClapSegmentCategory.ERA]: 250, [ClapSegmentCategory.LIGHTING]: 50, [ClapSegmentCategory.WEATHER]: 197.2, [ClapSegmentCategory.ACTION]: 3, - [ClapSegmentCategory.MUSIC]: 90, - [ClapSegmentCategory.SOUND]: 63, + [ClapSegmentCategory.MUSIC]: 100, + [ClapSegmentCategory.SOUND]: 60, [ClapSegmentCategory.DIALOGUE]: 23, [ClapSegmentCategory.STYLE]: 285, - [ClapSegmentCategory.CAMERA]: 1, - [ClapSegmentCategory.GENERIC]: 67, + [ClapSegmentCategory.CAMERA]: 10, + [ClapSegmentCategory.GENERIC]: 200, } export const pastel: ClapTimelineTheme = { @@ -32,8 +36,8 @@ export const pastel: ClapTimelineTheme = { backgroundColor: "#27272A", }, cell: { - saturation: 29, // 20.3, - lightness: 77, // 71.4, + saturation: 30, + lightness: 78.6, hues: baseClapSegmentCategoryHues } } diff --git a/packages/aitube-timeline/src/demo.tsx b/packages/aitube-timeline/src/demo.tsx index 01d6398c..bcde430a 100644 --- a/packages/aitube-timeline/src/demo.tsx +++ b/packages/aitube-timeline/src/demo.tsx @@ -1,7 +1,7 @@ import React from 'react' import { createRoot } from 'react-dom/client' -import { TimelineGrid } from '.' +import { Timeline } from '.' const container = document.getElementById('root') const root = createRoot(container!) @@ -10,7 +10,7 @@ root.render(
Hello
- +
); \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useAxis.ts b/packages/aitube-timeline/src/hooks/useAxis.ts index e1aef816..cf844437 100644 --- a/packages/aitube-timeline/src/hooks/useAxis.ts +++ b/packages/aitube-timeline/src/hooks/useAxis.ts @@ -6,12 +6,7 @@ import { useTimelineState } from "./useTimelineState"; export const useAxis = (width: number, height: number) => { const [axis, setAxis] = useState([] as THREE.BufferGeometry[]); - const getCellHeight = useTimelineState(s => s.getCellHeight) - const cellHeight = getCellHeight() - - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) - const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) - const maxHeight = cellHeight + getVerticalCellPosition(0, nbIdentifiedTracks) + const maxHeight = useTimelineState(s => s.maxHeight) useEffect(() => { const horizontalTop = new THREE.BufferGeometry().setFromPoints([ diff --git a/packages/aitube-timeline/src/hooks/useDebounce.ts b/packages/aitube-timeline/src/hooks/useDebounce.ts new file mode 100644 index 00000000..0021d39e --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useDebounce.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react' + +export function useDebounce(value: T, delay?: number): T { + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect(() => { + const timer = setTimeout(() => setDebouncedValue(value), delay || 500) + + return () => { + clearTimeout(timer) + } + }, [value, delay]) + + return debouncedValue +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts new file mode 100644 index 00000000..b7fe810f --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts @@ -0,0 +1,33 @@ +import { useEffect, useState } from "react" +import * as THREE from "three" + +import { useTimelineState } from "./useTimelineState" +import { leftBarTrackScaleWidth } from "@/constants/themes" + +export const useHorizontaTrackLines = () => { + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + + const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) + + const [lines, setLines] = useState([] as THREE.BufferGeometry[]); + + useEffect(() => { + + const thisLines = [] as THREE.BufferGeometry[]; + + for (let i = 0; i <= nbIdentifiedTracks; i++) { + const horizontalLinePoints = [ + new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), + new THREE.Vector3(leftBarTrackScaleWidth, -getVerticalCellPosition(0, i), 1) + ]; + const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); + + thisLines.push(horizontalLineGeometry); + } + + setLines(thisLines); + }, [cellWidth, nbIdentifiedTracks]); + + return lines; +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts new file mode 100644 index 00000000..a70635e5 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts @@ -0,0 +1,90 @@ +import { useEffect, useState } from "react" +import * as THREE from "three" + +import { useTimelineState } from "./useTimelineState" + +// note: those bug for loop just to render graduations might not be efficient +// maybe either we pre-compute everything and we let the runtime figure out what to render on screen, +// or we implement our own code to do that.. I don't know +export const useTimeScaleGraduations = ({ + nbMaxShots, + unit +}: { + nbMaxShots: number + unit: number +}) => { + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + + const [timeScaleGraduations, setTimeScaleGraduations] = useState([] as THREE.BufferGeometry[]); + const maxHeight = useTimelineState(s => s.maxHeight) + + const bigTickHeight = 12 + const smallTickHeight = 8 + + useEffect(() => { + + const lines = [] as THREE.BufferGeometry[]; + + if (cellWidth > 32) { + for (let i = 0; i < nbMaxShots * 2; i++) { + const verticalLinePoints = [ + new THREE.Vector3(i * (cellWidth / 2), 2, 1), + new THREE.Vector3( + i * (cellWidth / 2), + i % unit === 0 ? bigTickHeight : smallTickHeight, + 1 + ) + ]; + const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); + lines.push(verticalLineGeometry); + } + } else if (cellWidth > 16) { + for (let i = 0; i < nbMaxShots; i++) { + const verticalLinePoints = [ + new THREE.Vector3(i * cellWidth, 2, 1), + new THREE.Vector3( + i * (cellWidth), + i % unit === 0 ? bigTickHeight : smallTickHeight, + 1 + ) + ]; + const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); + lines.push(verticalLineGeometry); + } + } else if (cellWidth > 8) { + for (let i = 0; i < nbMaxShots; i++) { + if (i % 10 !== 0) { continue } + const verticalLinePoints = [ + new THREE.Vector3(i * cellWidth, 2, 1), + new THREE.Vector3( + i * cellWidth, + smallTickHeight, + 1 + ) + ]; + const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); + + lines.push(verticalLineGeometry); + } + } else { + for (let i = 0; i < nbMaxShots; i++) { + if (i % 20 !== 0) { continue } + const verticalLinePoints = [ + new THREE.Vector3(i * cellWidth, 2, 1), + new THREE.Vector3( + i * cellWidth, + smallTickHeight, + 1 + ) + ]; + const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); + + lines.push(verticalLineGeometry); + } + } + + setTimeScaleGraduations(lines); + }, [maxHeight, cellWidth, nbMaxShots]); + + return timeScaleGraduations; +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index c98cd2a7..ca1f2911 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -1,12 +1,15 @@ import { create } from "zustand" +import * as THREE from "three" import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" -import { TimelineStore } from "@/types/timeline" +import { TimelineStore, Tracks } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideo" import { hslToHex } from "@/utils/hslToHex" import { ClapSegmentCategoryHues, ClapSegmentColorScheme } from "@/types" +import { TimelineControlsImpl } from "@/components/controls/types" +import { TimelineCameraImpl } from "@/components/camera/types" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), @@ -22,7 +25,8 @@ export const useTimelineState = create((set, get) => ({ // we remove the big/long video const segments = removeFinalVideos(clap) - const cellWidth = get().horizontalZoomLevel + const { horizontalZoomLevel, getCellHeight, getVerticalCellPosition } = get() + const cellWidth = horizontalZoomLevel let typicalSegmentDurationInSteps = DEFAULT_COLUMNS_PER_SLICE * DEFAULT_DURATION_IN_MS_PER_STEP @@ -32,7 +36,8 @@ export const useTimelineState = create((set, get) => ({ let idCollisionDetector = new Set() - let nbIdentifiedTracks = 0 + let tracks: Tracks = [] + for (const s of segments) { if (idCollisionDetector.has(s.id)) { @@ -41,8 +46,40 @@ export const useTimelineState = create((set, get) => ({ } idCollisionDetector.add(s.id) - if (s.track > nbIdentifiedTracks) { - nbIdentifiedTracks = s.track + if (!tracks[s.track]) { + const isPreview = + s.category === ClapSegmentCategory.STORYBOARD || + s.category === ClapSegmentCategory.VIDEO + tracks[s.track] = { + id: s.track, + // name: `Track ${s.track}`, + name: `${s.category}`, + isPreview, + height: isPreview + ? PROMPT_STEP_HEIGHT_IN_PX * 3 + : PROMPT_STEP_HEIGHT_IN_PX, + hue: 0, + occupied: true, + visible: true, + } + } else { + + const track = tracks[s.track] + const categories = track.name.split(",").map(x => x.trim()) + if (!categories.includes(s.category)) { + tracks[s.track].name = "(misc)" + + /* + if (categories.length < 2) { + categories.push(s.category) + track.name = categories.join(", ") + } else if (!track.name.includes("..")) { + track.name = track.name + ".." + } + */ + } + + } if (s.category === ClapSegmentCategory.CAMERA) { @@ -57,19 +94,28 @@ export const useTimelineState = create((set, get) => ({ // TODO: compute the exact image ratio instead of using the media orientation, // since it might not match the actual assets - const ratio = clap.meta.width / clap.meta.height + const ratio = (clap.meta?.width || 640) / (clap.meta?.height || 480) // also storyboards and videos might have different sizes / ratios const previewHeight = Math.round( typicalSegmentLengthInPixels / ratio ) - const trackToCellHeight: Record = { - // VIDEO - 0: previewHeight, - - // STORYBOARD - 1: previewHeight + const nbIdentifiedTracks = tracks.length + const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) + + for (let id = 0; id < tracks.length; id++) { + if (!tracks[id]) { + tracks[id] = { + id, + name: `(empty)`, + isPreview: false, + height: PROMPT_STEP_HEIGHT_IN_PX, + hue: 0, + occupied: false, // <-- setting this to false is the important part + visible: true, + } + } } set({ @@ -77,8 +123,9 @@ export const useTimelineState = create((set, get) => ({ clap, segments, visibleSegments: segments, + tracks, + maxHeight, nbIdentifiedTracks, - trackToCellHeight, typicalSegmentDurationInSteps, }) }, @@ -99,9 +146,8 @@ export const useTimelineState = create((set, get) => ({ const { clap, - trackToCellHeight, horizontalZoomLevel, - originalHorizontalZoomLevel, + tracks, typicalSegmentDurationInSteps } = get() @@ -119,16 +165,13 @@ export const useTimelineState = create((set, get) => ({ const previewHeight = Math.round( typicalSegmentLengthInPixels / ratio ) - if (typeof trackNumber === "number" && !isNaN(trackNumber) && isFinite(trackNumber)) { - if (trackNumber === 0 || trackNumber === 1) { - // DISABLED - // cellHeight = previewHeight - - if (trackToCellHeight[trackNumber]) { - cellHeight = trackToCellHeight[trackNumber] - } + const track = tracks[trackNumber] + if (track) { + cellHeight = track.isPreview ? previewHeight : track.height + } else { + // missing data } } @@ -184,13 +227,33 @@ export const useTimelineState = create((set, get) => ({ backgroundColorHover: hslToHex(baseHue, baseSaturation + 20, baseLightness + 1), foregroundColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), - textColor: hslToHex(baseHue, baseSaturation + 50, baseLightness - 40), - textColorHover: hslToHex(baseHue, baseSaturation + 50, baseLightness - 38), + textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), + textColorHover: hslToHex(baseHue, baseSaturation + 55, baseLightness - 50), } return colorScheme }, - setHoveredSegment: (hoveredSegment?: ClapSegment) =>  { + setHoveredSegment: (hoveredSegment?: ClapSegment) => { set({ hoveredSegment }) + }, + setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => { + set({ timelineCamera }) + }, + setTimelineControls: (timelineControls?: TimelineControlsImpl) => { + set({ timelineControls }) + }, + setTopBarTimelineScale: (topBarTimelineScale?: THREE.Group) => { + set({ topBarTimelineScale }) + }, + setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => { + set({ leftBarTrackScale }) + }, + handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number, deltaY: number }) => { + const { scrollX, scrollY } = get() + set({ + scrollX: scrollX + deltaX, + scrollY: scrollY - deltaY, + }) } + })) diff --git a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts index ab7b7f3c..77f68ba0 100644 --- a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts @@ -9,16 +9,10 @@ export const useVerticalGridLines = ({ nbMaxShots: number }) => { const cellWidth = useTimelineState(s => s.horizontalZoomLevel) - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) - - const getCellHeight = useTimelineState(s => s.getCellHeight) - const cellHeight = getCellHeight() - - const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const maxHeight = cellHeight + getVerticalCellPosition(0, nbIdentifiedTracks) + const maxHeight = useTimelineState(s => s.maxHeight) useEffect(() => { diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 023b7820..1e03bc76 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -2,7 +2,10 @@ export { TimelineControls, HorizontalScroller, VerticalScroller, - TimelineGrid, + Timeline, + TopBarTimeScale, + Cells, + Grid, Cell, ImageCell, VideoCell, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index e5b9732f..db4520bd 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,6 +1,21 @@ import * as THREE from "three" import { ClapProject, ClapSegment } from "@aitube/clap" + import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" +import { TimelineControlsImpl } from "@/components/controls/types" +import { TimelineCameraImpl } from "@/components/camera/types" + +export type Track = { + id: number + name: string + isPreview: boolean + height: number + hue: number + occupied: boolean + visible: boolean +} + +export type Tracks = Track[] export type TimelineStoreState = { clap?: ClapProject @@ -11,6 +26,8 @@ export type TimelineStoreState = { visibleSegments: ClapSegment[] nbIdentifiedTracks: number + tracks: Tracks + minHorizontalZoomLevel: number maxHorizontalZoomLevel: number horizontalZoomLevel: number @@ -26,7 +43,6 @@ export type TimelineStoreState = { cellWidth: number nbMaxTracks: number - trackToCellHeight: Record typicalSegmentDurationInSteps: number // note: this is a mirror value of @@ -34,6 +50,30 @@ export type TimelineStoreState = { currentZoomLevel: number hoveredSegment?: ClapSegment + + /** + * The timeline camera + * + * Note: there will be no update of this value in case the camera settings have changed + */ + timelineCamera?: TimelineCameraImpl + + /** + * The timeline controls + * + * Note: there will be no update of this value in case the controls settings have changed + */ + timelineControls?: TimelineControlsImpl + + // max height of the timeline + maxHeight: number + + // used to track current camera position, at zoom level 1.0 + scrollX: number + scrollY: number + + topBarTimelineScale?: THREE.Group + leftBarTrackScale?: THREE.Group } @@ -45,7 +85,11 @@ export type TimelineStoreModifiers = { getVerticalCellPosition: (start: number,end: number) => number getSegmentColorScheme: (segment?: ClapSegment) => ClapSegmentColorScheme setHoveredSegment: (hoveredSegment?: ClapSegment) => void + setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => void + setTimelineControls: (timelineControls?: TimelineControlsImpl) => void + setTopBarTimelineScale: (topBarTimelineScale?: THREE.Group) => void + setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => void + handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number, deltaY: number }) => void } - export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/clamp.ts b/packages/aitube-timeline/src/utils/clamp.ts new file mode 100644 index 00000000..25225478 --- /dev/null +++ b/packages/aitube-timeline/src/utils/clamp.ts @@ -0,0 +1,3 @@ +export function clamp(value: number, min: number, max: number) { + return Math.max(min, Math.min(max, value)) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/debounceAsync.ts b/packages/aitube-timeline/src/utils/debounceAsync.ts new file mode 100644 index 00000000..355900fd --- /dev/null +++ b/packages/aitube-timeline/src/utils/debounceAsync.ts @@ -0,0 +1,66 @@ +/* + +Here's how you can use the `debounceAsync` function: + +```typescript +async function fetchData(query: string): Promise { + // Simulating an API call + return new Promise((resolve) => { + setTimeout(() => { + resolve(`Results for ${query}`); + }, 500); + }); +} + +const debouncedFetchData = debounceAsync(fetchData, 300); + +(async () => { + try { + console.log(await debouncedFetchData("query 1")); // This will be ignored + console.log(await debouncedFetchData("query 2")); // This will be ignored + console.log(await debouncedFetchData("query 3")); // This will return "Results for query 3" + } catch (error) { + console.error(error); + } +})(); +``` + +The `debounceAsync` function takes a Promise-based function `func` and a `wait` time as its arguments. +It returns a debounced version of the given function that, when called multiple times within the specified wait time, will only execute the last call. +*/ + +type DebouncedFunction = ((...args: T) => R) & { + clear: () => void +} + +export function debounceAsync( + func: (...args: T) => Promise, + wait: number +): DebouncedFunction> { + let timeout: NodeJS.Timeout | undefined + + const debounced = (...args: T) => { + return new Promise((resolve, reject) => { + if (timeout) { + clearTimeout(timeout) + } + + timeout = setTimeout(async () => { + try { + const result = await func(...args) + resolve(result) + } catch (error) { + reject(error) + } + }, wait) as any + }) + } + + debounced.clear = () => { + if (timeout) { + clearTimeout(timeout) + } + } + + return debounced +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/debounceSync.ts b/packages/aitube-timeline/src/utils/debounceSync.ts new file mode 100644 index 00000000..0514a72d --- /dev/null +++ b/packages/aitube-timeline/src/utils/debounceSync.ts @@ -0,0 +1,59 @@ +type DebouncedFunctionSync = ((...args: T) => R) & { + clear: () => void +} + +/** + * Example usage: + * ```typescript + * function fetchDataSync(query: string): string { + * return `Results for ${query}`; + * } + * + * const debouncedFetchDataSync = debounceSync(fetchDataSync, 300); + * + * try { + * console.log(debouncedFetchDataSync("query 1")); // This will be ignored + * console.log(debouncedFetchDataSync("query 2")); // This will be ignored + * console.log(debouncedFetchDataSync("query 3")); // This will return "Results for query 3" + * } catch (error) { + * console.error(error); + * } + * ``` + * + * Note that the synchronous version of the debounce function will return + * the result of the last function call or `undefined` if the function was + * not called within the specified wait time. You should also be aware that + * this synchronous version may cause blocking if the debounced function + * takes a long time to execute. + * + * @param func + * @param wait + * @returns + */ +export function debounceSync( + func: (...args: T) => R, + wait: number +): DebouncedFunctionSync { + let timeout: NodeJS.Timeout | undefined + + const debounced = (...args: T): R | undefined => { + if (timeout) { + clearTimeout(timeout) + } + + let result: R | undefined + timeout = setTimeout(() => { + result = func(...args) + }, wait) as any + + return result + } + + debounced.clear = () => { + if (timeout) { + clearTimeout(timeout) + } + } + + return debounced +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/formatTimestamp.ts b/packages/aitube-timeline/src/utils/formatTimestamp.ts new file mode 100644 index 00000000..3386f933 --- /dev/null +++ b/packages/aitube-timeline/src/utils/formatTimestamp.ts @@ -0,0 +1,41 @@ +export function formatTimestamp(duration: number, { + hours: showHours, + minutes: showMinutes, + seconds: showSeconds, + milliseconds: showMilliseconds, +}: { + hours: boolean + minutes: boolean + seconds: boolean + milliseconds: boolean +}) { + let milliseconds = Math.floor((duration % 1000) / 100) + let seconds = Math.floor((duration / 1000) % 60) + let minutes = Math.floor((duration / (1000 * 60)) % 60) + let hours = Math.floor((duration / (1000 * 60 * 60)) % 24) + + let strHours = (hours < 10) ? "0" + hours : hours; + let strMinutes = (minutes < 10) ? "0" + minutes : minutes; + let strSeconds = (seconds < 10) ? "0" + seconds : seconds; + + // full padding gives a more "pro" look, but not sure we need it + // let strMilliseconds = String(milliseconds).padEnd(3, '0') + + let strMilliseconds = String(milliseconds) + + let result = '' + if (showHours) { + result += strHours + ((showMinutes || showSeconds || showMilliseconds) ? ":" : "") + } + if (showMinutes) { + result += strMinutes + ((showSeconds || showMilliseconds) ? ":" : "") + } + if (showSeconds) { + result += strSeconds + (showMilliseconds ? "" : "") + } + if (showMilliseconds) { + result += '.' + strMilliseconds + } + + return result +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 71abc797..7cbdcdbc 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -15,6 +15,8 @@ export function getDefaultState(): TimelineStoreState { visibleSegments: [], nbIdentifiedTracks: 0, + tracks: [], + position: new THREE.Vector3(), scale: new THREE.Vector3(), initialized: false, @@ -38,17 +40,19 @@ export function getDefaultState(): TimelineStoreState { nbMaxTracks: DEFAULT_NB_TRACKS, - trackToCellHeight: { - // VIDEO - 0: PROMPT_STEP_HEIGHT_IN_PX * 3, - - // STORYBOARD - 1: PROMPT_STEP_HEIGHT_IN_PX * 3, - }, typicalSegmentDurationInSteps: 4, currentZoomLevel: 1.0, hoveredSegment: undefined, + timelineControls: undefined, + + maxHeight: 32, + + scrollX: 0, + scrollY: 0, + + topBarTimelineScale: undefined, + leftBarTrackScale: undefined, } } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/aitube-timeline/src/utils/getTextLength.ts index 94e7ea4e..caedc9fd 100644 --- a/packages/aitube-timeline/src/utils/getTextLength.ts +++ b/packages/aitube-timeline/src/utils/getTextLength.ts @@ -56,17 +56,16 @@ export function getWebGLCharWidth(char: string = ""): number { } else if (cellWidthInPixels < 28) { responsiveHack = 1 } else if (cellWidthInPixels < 32) { - responsiveHack = 0.9 + responsiveHack = 1.0 } else if (cellWidthInPixels < 48) { - responsiveHack = 0.8 + responsiveHack = 0.9 } else if (cellWidthInPixels < 64) { - responsiveHack = 0.75 + responsiveHack = 0.9 } else if (cellWidthInPixels < 128) { - responsiveHack = 0.65 + responsiveHack = 0.8 } else { - responsiveHack = 0.55 + responsiveHack = 0.7 } - return responsiveHack * webglFontWidthFactor * (charLength[char] || defaultCharLength) } diff --git a/packages/aitube-timeline/src/utils/throttle.ts b/packages/aitube-timeline/src/utils/throttle.ts new file mode 100644 index 00000000..1be77633 --- /dev/null +++ b/packages/aitube-timeline/src/utils/throttle.ts @@ -0,0 +1,24 @@ +export function throttle(wait: number, fn: T): T { + let inThrottle: boolean + let lastFn: ReturnType + let lastTime: number + const result = function (this: any) { + const context = this + const args = arguments + if (!inThrottle) { + (fn as any).apply(context, args) + lastTime = Date.now() + inThrottle = true + } else { + clearTimeout(lastFn) + lastFn = setTimeout(() => { + if (Date.now() - lastTime >= wait) { + (fn as any).apply(context, args) + lastTime = Date.now() + } + }, Math.max(wait - (Date.now() - lastTime), 0)) + } + } + + return result as unknown as T +} \ No newline at end of file From 65752e531d82990f6e4de3d0888e5bbae3e7c82a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 2 Jun 2024 15:55:17 +0200 Subject: [PATCH 106/346] 0.0.5 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/ClapTimeline.tsx | 9 +++ .../src/components/cells/Cell.tsx | 46 +++++++++++--- .../src/components/cells/ImageCell.tsx | 6 +- .../src/components/cells/TextCell.tsx | 20 ++++-- .../src/components/cells/VideoCell.tsx | 5 ++ .../src/components/cells/types.ts | 3 + .../components/controls/TimelineControls.tsx | 20 +++++- .../src/components/timeline/Cells.tsx | 13 +--- .../src/components/timeline/Grid.tsx | 1 + .../components/timeline/LeftBarTrackScale.tsx | 55 +++++++++++++--- .../components/timeline/TopBarTimeScale.tsx | 14 +++-- packages/aitube-timeline/src/hooks/index.ts | 1 - .../src/hooks/useHorizontalGridLines.ts | 12 +++- .../src/hooks/useHorizontalTrackLines.ts | 10 ++- .../src/hooks/useHoveredSegment.ts | 20 ++++++ .../src/hooks/usePreviewTrackHeight.ts | 17 ----- .../src/hooks/useTimelineState.ts | 62 +++++++++++++++---- .../src/hooks/useVisibleSegments.ts | 7 ++- packages/aitube-timeline/src/index.tsx | 1 - packages/aitube-timeline/src/types/theme.ts | 1 + .../aitube-timeline/src/types/timeline.ts | 10 +++ .../src/utils/getDefaultState.ts | 5 ++ .../src/utils/sliceSegments.ts | 12 ++-- 24 files changed, 264 insertions(+), 88 deletions(-) create mode 100644 packages/aitube-timeline/src/hooks/useHoveredSegment.ts delete mode 100644 packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 8ecb68a2..560684aa 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index cf256a17..5bf3f8d1 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -60,6 +60,7 @@ export function ClapTimeline({
{ + // apparently we cannot stop the propagation from the scroll wheel event + // we attach to our to bar from the scroll wheel event set on the canvas + // (that makes sense, one is in DOM space, the other in WebGL space) + // + // there are probably better ways to do this, but for now here is a very + // crude fix to ignore global X-Y scroll events when we are over the timeline + if (wheelEvent.clientY <= topBarTimeScaleHeight) { return } + useTimelineState.getState().handleMouseWheel({ deltaX: wheelEvent.deltaX, deltaY: wheelEvent.deltaY diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 346e4e9f..1ff30e14 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -7,13 +7,13 @@ import { ImageCell } from "./ImageCell" import { VideoCell } from "./VideoCell" import { TextCell } from "./TextCell" import { useTimelineState } from "@/hooks" +import { useHoveredSegment } from "@/hooks/useHoveredSegment" +import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" export function Cell({ - segment: s, - setHoveredSegment + segment: s }: { segment: ClapSegment - setHoveredSegment: (hoveredSegment?: ClapSegment) => void }) { const getSegmentColorScheme = useTimelineState(s => s.getSegmentColorScheme) @@ -26,6 +26,9 @@ export function Cell({ const cellHeight = getCellHeight(s.track) const verticalCellPosition = getVerticalCellPosition(0, s.track) + // used to react to changes impacting tracks + const tracks = useTimelineState(s => s.tracks) + const durationInSteps = ( (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP ) @@ -41,8 +44,12 @@ export function Cell({ // we need to round this one to avoid *too* many re-renders const widthInPxAfterZoom = Math.round(currentZoomLevel * durationInSteps * cellWidth) - const hoveredSegment = useTimelineState(s => s.hoveredSegment) - const isHovered = hoveredSegment?.id === s.id + const isHovered = useHoveredSegment(s.id) + + // note: this is not reactive (as a general rule, we never want to be reactive in here) + // note: as a general rule, we should avoid "reactive" state updates like this + const isResizing = useTimelineState(s => s.isResizing) + // const isResizing = useTimelineState.getState().isResizing const SpecializedCell = s.assetUrl.startsWith("data:image/") @@ -51,6 +58,12 @@ export function Cell({ ? VideoCell : TextCell + const setHoveredSegment = useTimelineState(s => s.setHoveredSegment) + + // cells are rendered often (eg. whenever we mouse the mouse from one cell to another) + // because we need to handle their color change on hover / transition + // console.log(`re-rendering a `) + return ( { + // crude code to ignore the event when we are over the left column or the top row + if (e.clientX < leftBarTrackScaleWidth || e.clientY < topBarTimeScaleHeight) { + setHoveredSegment(undefined) + } else { + setHoveredSegment(s) + } + }} + + /* onPointerEnter={(e) => { - // console.log('enter') - setHoveredSegment(s) + // crude code to ignore the event when we are over the left column or the top row + if (e.clientX < leftBarTrackScaleWidth || e.clientY < topBarTimeScaleHeight) { + setHoveredSegment(undefined) + } else { + setHoveredSegment(s) + } }} + */ onPointerLeave={(e) => { // console.log('leave') setHoveredSegment(undefined) @@ -100,7 +128,9 @@ export function Cell({ colorScheme={colorScheme} widthInPx={widthInPx} widthInPxAfterZoom={widthInPxAfterZoom} + isResizing={isResizing} + track={tracks[s.track]} /> ) -} \ No newline at end of file +} diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/aitube-timeline/src/components/cells/ImageCell.tsx index 814439be..52354548 100644 --- a/packages/aitube-timeline/src/components/cells/ImageCell.tsx +++ b/packages/aitube-timeline/src/components/cells/ImageCell.tsx @@ -13,10 +13,14 @@ export function ImageCell({ durationInSteps, startTimeInSteps, colorScheme, + isResizing, + track, }: SpecializedCellProps) { return ( - + {/* { @@ -55,6 +57,9 @@ export function VideoCell({ side={THREE.FrontSide} // toneMapped={false} transparent + opacity={ + track.visible ? 1 : 0.5 + } > diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts index e5004366..d1eab899 100644 --- a/packages/aitube-timeline/src/components/cells/types.ts +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -1,4 +1,5 @@ import { ClapSegmentColorScheme } from "@/types" +import { Track } from "@/types/timeline" import { ClapSegment } from "@aitube/clap" export type SpecializedCellProps = { @@ -12,4 +13,6 @@ export type SpecializedCellProps = { colorScheme: ClapSegmentColorScheme widthInPx: number widthInPxAfterZoom: number + isResizing: boolean + track: Track } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index 31e61095..bff8a068 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -38,9 +38,19 @@ export function TimelineControls({ maxHeight, leftBarTrackScale, topBarTimelineScale, + resizeStartedAt, } = useTimelineState.getState() - if (!timelineCamera || !timelineControls) { return } + const now = performance.now() // new Date().getTime(), + const elapsedTimeInMs = now - resizeStartedAt + + const delayThreshold = 300 + const isResizing = elapsedTimeInMs < delayThreshold + // console.log(`now=${now}, resizeStartedAt=${resizeStartedAt}, elapsedTimeInMs=${elapsedTimeInMs}, delayThreshold=${delayThreshold}, isResizing=${isResizing}`) + if (!timelineCamera || !timelineControls) { + useTimelineState.setState({ isResizing }) + return + } const min = maxHeight * 0.5 const max = maxHeight * 0.5 @@ -49,6 +59,7 @@ export function TimelineControls({ const availableHeight = Math.min(size.height, maxHeight) + let before = scrollY scrollY = clamp( // should depend upon the current zoom level // if we are "high" in the sky (low zoom value) @@ -59,13 +70,18 @@ export function TimelineControls({ availableHeight ) + // console.log(`debug: before=${Math.round(before)}, after=${Math.round(scrollY)}`) timelineCamera.position.setX(scrollX) timelineControls.target.setX(scrollX) timelineCamera.position.setY(scrollY) timelineControls.target.setY(scrollY) - useTimelineState.setState({ scrollX, scrollY }) + useTimelineState.setState({ + scrollX, + scrollY, + isResizing + }) if (topBarTimelineScale) { topBarTimelineScale.position.y = (-topBarTimeScaleHeight + scrollY) + (size.height / 2) diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index 904d7776..c7eab742 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -35,23 +35,17 @@ export function Cells({ refreshRateInMs, }); - const hoveredSegment = useTimelineState(s => s.hoveredSegment) - const setHoveredSegment = useTimelineState(s => s.setHoveredSegment) - - useEffect(() => { - document.body.style.cursor = hoveredSegment ? 'pointer' : 'auto' - - return () => { document.body.style.cursor = 'auto' } - }, [hoveredSegment]) + /* const [props, set] = useSpring(() => ({ pos: [0, 0, 0], scale: [1, 1, 1], rotation: [0, 0, 0], config: { mass: 10, tension: 1000, friction: 300, precision: 0.00001 } })) + */ - console.log(`re-rendering `) + console.log(`re-rendering ${visibleSegments.length} `) return ( )} diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/aitube-timeline/src/components/timeline/Grid.tsx index 7124a9e0..38ed17d6 100644 --- a/packages/aitube-timeline/src/components/timeline/Grid.tsx +++ b/packages/aitube-timeline/src/components/timeline/Grid.tsx @@ -34,6 +34,7 @@ export function Grid({ }); console.log(`re-rendering `) + return ( <> diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx index 02a6aa99..b98d4362 100644 --- a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx @@ -17,17 +17,18 @@ export function LeftBarTrackScale({ width: number height: number }) { - console.log(`re-rendering `) + // console.log(`re-rendering `) const getCellHeight = useTimelineState((s) => s.getCellHeight) const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) const tracks = useTimelineState(s => s.tracks) + const toggleTrackVisibility = useTimelineState((s) => s.toggleTrackVisibility) const setLeftBarTrackScale = useTimelineState(s => s.setLeftBarTrackScale) - - const horizontalTrackLines = useHorizontaTrackLines(); + + const horizontalTrackLines = useHorizontaTrackLines() return ( - { - - } + + { + toggleTrackVisibility(track.id) + }} + > + 👁️ + s.horizontalZoomLevel) - const cellWidth = useTimelineState.getState().horizontalZoomLevel + // we should use the non-reactive version + const cellWidth = useTimelineState((s) => s.horizontalZoomLevel) + // const cellWidth = useTimelineState.getState().horizontalZoomLevel + const isResizing = useTimelineState(s => s.isResizing) + const nbMaxShots = NB_MAX_SHOTS const unit = 10 @@ -41,7 +43,7 @@ export function TopBarTimeScale({ const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) - console.log(`re-rendering `) + // console.log(`re-rendering `) const setTopBarTimelineScale = useTimelineState(s => s.setTopBarTimelineScale) @@ -94,8 +96,8 @@ export function TopBarTimeScale({ ))} - - {timeScaleGraduations.map((lineGeometry, idx) => ( + + {isResizing ? [] : timeScaleGraduations.map((lineGeometry, idx) => ( { + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) - const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) + const tracks = useTimelineState(s => s.tracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); @@ -21,7 +22,7 @@ export const useHorizontalGridLines = ({ const thisLines = [] as THREE.BufferGeometry[]; - for (let i = 0; i <= nbIdentifiedTracks; i++) { + for (let i = 0; i <= tracks.length; i++) { const horizontalLinePoints = [ new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 1) @@ -32,7 +33,12 @@ export const useHorizontalGridLines = ({ } setGridLines(thisLines); - }, [maxWidth, cellWidth, nbIdentifiedTracks, nbMaxShots]); + }, [ + cellWidth, + maxWidth, + nbMaxShots, + ...tracks.map(t => `${t.visible}_${t.height}`), +]); return gridlines; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts index b7fe810f..7caebedc 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts @@ -8,7 +8,7 @@ export const useHorizontaTrackLines = () => { const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) - const nbIdentifiedTracks = useTimelineState(s => s.nbIdentifiedTracks) + const tracks = useTimelineState(s => s.tracks) const [lines, setLines] = useState([] as THREE.BufferGeometry[]); @@ -16,7 +16,7 @@ export const useHorizontaTrackLines = () => { const thisLines = [] as THREE.BufferGeometry[]; - for (let i = 0; i <= nbIdentifiedTracks; i++) { + for (let i = 0; i <= tracks.length; i++) { const horizontalLinePoints = [ new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), new THREE.Vector3(leftBarTrackScaleWidth, -getVerticalCellPosition(0, i), 1) @@ -27,7 +27,11 @@ export const useHorizontaTrackLines = () => { } setLines(thisLines); - }, [cellWidth, nbIdentifiedTracks]); + }, [ + cellWidth, + leftBarTrackScaleWidth, + ...tracks.map(t => `${t.visible}_${t.height}`) + ]); return lines; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useHoveredSegment.ts b/packages/aitube-timeline/src/hooks/useHoveredSegment.ts new file mode 100644 index 00000000..0a2da196 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useHoveredSegment.ts @@ -0,0 +1,20 @@ +import { useEffect } from "react" +import { useTimelineState } from "./useTimelineState" + +export function useHoveredSegment(segmentId: string): boolean { + const hoveredSegment = useTimelineState(s => s.hoveredSegment) + + useEffect(() => { + const cursor = hoveredSegment ? 'pointer' : 'auto' + if (document.body.style.cursor !== cursor) { + document.body.style.cursor = cursor + } + return () => { document.body.style.cursor = 'auto' } + }, [hoveredSegment]) + + if (hoveredSegment?.id === segmentId) { + return true + } else { + return false + } +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts b/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts deleted file mode 100644 index e0e1fe8d..00000000 --- a/packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts +++ /dev/null @@ -1,17 +0,0 @@ - -import { DEFAULT_COLUMNS_PER_SLICE } from "@/constants/grid" - -import { useTimelineState } from "./useTimelineState" - -export function usePreviewTrackHeight() { - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) - - const imageRatio = 0.5625 // 0.6 - const previewHeight = Math.round( - // (horizontalZoomLevel / 40) * - imageRatio - * DEFAULT_COLUMNS_PER_SLICE // typically 4, but this might change in the future - * cellWidth) - - return previewHeight -} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index ca1f2911..0d4622e1 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -2,7 +2,7 @@ import { create } from "zustand" import * as THREE from "three" import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" -import { TimelineStore, Tracks } from "@/types/timeline" +import { TimelineStore, Track, Tracks } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideo" @@ -21,6 +21,9 @@ export const useTimelineState = create((set, get) => ({ }) return } + + set({ isLoading: true }) + console.log(`useTimelineState: setting the clap to`, clap) // we remove the big/long video @@ -118,25 +121,32 @@ export const useTimelineState = create((set, get) => ({ } } + const isEmpty = segments.length > 0 set({ ...getDefaultState(), clap, segments, - visibleSegments: segments, + visibleSegments: [], tracks, maxHeight, nbIdentifiedTracks, typicalSegmentDurationInSteps, + isEmpty, + isLoading: false, }) }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { const { minHorizontalZoomLevel, maxHorizontalZoomLevel } = get() const horizontalZoomLevel = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) - set({ horizontalZoomLevel }) + set({ + horizontalZoomLevel, + resizeStartedAt: performance.now(), + isResizing: true, + }) }, setSegments: (segments: ClapSegment[] = []) => { - set({ segments, visibleSegments: segments }) + set({ segments, visibleSegments: [] }) }, setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, @@ -169,7 +179,12 @@ export const useTimelineState = create((set, get) => ({ if (typeof trackNumber === "number" && !isNaN(trackNumber) && isFinite(trackNumber)) { const track = tracks[trackNumber] if (track) { - cellHeight = track.isPreview ? previewHeight : track.height + cellHeight = + track.isPreview && track.visible + ? previewHeight + : track.visible + ? track.height + : defaultCellHeight } else { // missing data } @@ -201,12 +216,13 @@ export const useTimelineState = create((set, get) => ({ baseSaturation, baseLightness, - backgroundColor: hslToHex(baseHue, baseSaturation, baseLightness), - backgroundColorHover: hslToHex(baseHue, baseSaturation + 10, baseLightness + 1), - foregroundColor: hslToHex(baseHue, baseSaturation, baseLightness), - borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), - textColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), - textColorHover: hslToHex(baseHue, baseSaturation + 40, baseLightness + 2), + backgroundColor: hslToHex(baseHue, baseSaturation + 10, baseLightness), + backgroundColorHover: hslToHex(baseHue, baseSaturation + 20, baseLightness + 1), + backgroundColorDisabled: hslToHex(baseHue, baseSaturation - 10, baseLightness - 2), + foregroundColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), + borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), + textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), + textColorHover: hslToHex(baseHue, baseSaturation + 55, baseLightness - 50), } if (!segment) { return colorScheme } @@ -225,6 +241,7 @@ export const useTimelineState = create((set, get) => ({ backgroundColor: hslToHex(baseHue, baseSaturation + 10, baseLightness), backgroundColorHover: hslToHex(baseHue, baseSaturation + 20, baseLightness + 1), + backgroundColorDisabled: hslToHex(baseHue, baseSaturation - 10, baseLightness - 2), foregroundColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), @@ -234,7 +251,17 @@ export const useTimelineState = create((set, get) => ({ return colorScheme }, setHoveredSegment: (hoveredSegment?: ClapSegment) => { - set({ hoveredSegment }) + // note: we do all of this in order to avoid useless state updates + if (hoveredSegment) { + if (get().hoveredSegment?.id !== hoveredSegment?.id) { + set({ hoveredSegment }) + } + } else { + if (get().hoveredSegment) { + set({ hoveredSegment: undefined }) + } + } + }, setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => { set({ timelineCamera }) @@ -254,6 +281,15 @@ export const useTimelineState = create((set, get) => ({ scrollX: scrollX + deltaX, scrollY: scrollY - deltaY, }) + }, + toggleTrackVisibility: (trackId: number) => { + const { tracks } = get() + set({ + tracks: tracks.map(t => ( + t.id === trackId + ? { ...t, visible: !t.visible } + : t + )), + }) } - })) diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 27b7855a..4670ba4e 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -14,7 +14,7 @@ export const useVisibleSegments = ({ }: { nbMaxTracks: number refreshRateInMs: number -}) => { +}): ClapSegment[] => { // to make it react to screen width change // however, this doesn't seem to work well const { size: canvasSize, viewport } = useThree() @@ -26,6 +26,8 @@ export const useVisibleSegments = ({ const segments = useTimelineState((s) => s.segments) const segmentsChanged = useTimelineState((s) => s.segmentsChanged) + // console.log(`segmentsChanged:`, segmentsChanged) + const visibleSegments = useTimelineState((s) => s.visibleSegments) const setVisibleSegments = useTimelineState((s) => s.setVisibleSegments) @@ -151,6 +153,7 @@ export const useVisibleSegments = ({ // TODO: replace our usage of stateRef.current // by useTimelineState.getState() const state = stateRef.current + const cellWidth = useTimelineState.getState().horizontalZoomLevel // we can adjust this threshold to only re compute the geometry @@ -233,6 +236,7 @@ export const useVisibleSegments = ({ state.initialized = true + console.log("scheduling a sync(false)") // we could also use useInterval, but we need something async-friendly const fn = async () => { // we want a relatively "high" refresh rate in order to get smooth camera movement @@ -255,6 +259,7 @@ export const useVisibleSegments = ({ // force a re-render when cell width or height change useEffect(() => { + console.log("forcing a sync(true)") const fn = async () => { try { await sync(true) } catch (err) {} } fn() }, [cellHeight, cellWidth]) diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 1e03bc76..b18c4bc5 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -15,7 +15,6 @@ export { export { useAxis, - usePreviewTrackHeight, useStandardTrackHeight, useTimelineState, useVisibleSegments diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/aitube-timeline/src/types/theme.ts index 8d7fb0b8..4a1aae88 100644 --- a/packages/aitube-timeline/src/types/theme.ts +++ b/packages/aitube-timeline/src/types/theme.ts @@ -20,6 +20,7 @@ export type ClapSegmentColorScheme = { backgroundColor: string backgroundColorHover: string + backgroundColorDisabled: string foregroundColor: string borderColor: string textColor: string diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index db4520bd..cb0b47de 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -26,6 +26,9 @@ export type TimelineStoreState = { visibleSegments: ClapSegment[] nbIdentifiedTracks: number + isEmpty: boolean + isLoading: boolean + tracks: Tracks minHorizontalZoomLevel: number @@ -72,6 +75,12 @@ export type TimelineStoreState = { scrollX: number scrollY: number + // used to determine how long it has been since we touch the scroll + // we use this information to render the grid faster, by disabling all text + // until a given debouncing time has elapsed + resizeStartedAt: number + isResizing: boolean + topBarTimelineScale?: THREE.Group leftBarTrackScale?: THREE.Group } @@ -90,6 +99,7 @@ export type TimelineStoreModifiers = { setTopBarTimelineScale: (topBarTimelineScale?: THREE.Group) => void setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => void handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number, deltaY: number }) => void + toggleTrackVisibility: (trackId: number) => void } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 7cbdcdbc..4773fc2d 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -14,6 +14,9 @@ export function getDefaultState(): TimelineStoreState { segmentsChanged: 0, visibleSegments: [], nbIdentifiedTracks: 0, + + isEmpty: true, + isLoading: false, tracks: [], @@ -51,6 +54,8 @@ export function getDefaultState(): TimelineStoreState { scrollX: 0, scrollY: 0, + resizeStartedAt: 0, + isResizing: false, topBarTimelineScale: undefined, leftBarTrackScale: undefined, diff --git a/packages/aitube-timeline/src/utils/sliceSegments.ts b/packages/aitube-timeline/src/utils/sliceSegments.ts index 1072f7ad..aa325a13 100644 --- a/packages/aitube-timeline/src/utils/sliceSegments.ts +++ b/packages/aitube-timeline/src/utils/sliceSegments.ts @@ -1,4 +1,4 @@ -import { ClapSegment } from "@aitube/clap" +import { ClapSegment, ClapSegmentFilteringMode, filterSegmentsWithinRange } from "@aitube/clap" // TODO put this in a web workers for smoother operations? @@ -14,9 +14,11 @@ export function sliceSegments({ visibleSegments: ClapSegment[] }): ClapSegment[] { // console.log(`sliceSegments(): extracting [${afterTimeInMs}:${beforeTimeInMs}] out of ${segments.length} segments`) - - const result = segments.filter(s => afterTimeInMs <= s.startTimeInMs && s.endTimeInMs <= beforeTimeInMs) - // console.log(`sliceSegments(): extracted ${result.length} segments`) - + const result = filterSegmentsWithinRange( + ClapSegmentFilteringMode.ANY, + afterTimeInMs, + beforeTimeInMs, + segments + ) return result } \ No newline at end of file From bb523c554a142e31b9f27f21aa71b6ea73a7b707 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 2 Jun 2024 15:55:48 +0200 Subject: [PATCH 107/346] up --- packages/aitube-timeline/src/components/timeline/Cells.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index c7eab742..c0312f01 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -45,7 +45,7 @@ export function Cells({ })) */ - console.log(`re-rendering ${visibleSegments.length} `) + // console.log(`re-rendering ${visibleSegments.length} `) return ( Date: Mon, 3 Jun 2024 00:59:10 +0200 Subject: [PATCH 108/346] 0.0.6 --- packages/aitube-timeline/README.md | 3 +- packages/aitube-timeline/bun.lockb | Bin 159613 -> 160136 bytes packages/aitube-timeline/package-lock.json | 4404 +++++++++++++++++ packages/aitube-timeline/package.json | 7 +- packages/aitube-timeline/src/ClapTimeline.tsx | 41 +- .../src/components/cells/Cell.tsx | 4 +- .../components/controls/TimelineControls.tsx | 61 +- .../scroller/HorizontalScroller.tsx | 5 - .../src/components/timeline/Cursor.tsx | 53 + .../src/components/timeline/CursorWeird.tsx | 21 + .../components/timeline/LeftBarTrackScale.tsx | 14 +- .../src/components/timeline/Timeline.tsx | 5 + .../components/timeline/TopBarTimeScale.tsx | 32 +- .../src/components/timeline/index.ts | 1 + .../src/components/timeline/types.ts | 3 + .../src/hooks/useCursorGeometry.ts | 34 + .../src/hooks/useTimeScaleGraduations.ts | 2 +- .../src/hooks/useTimelineState.ts | 83 +- .../aitube-timeline/src/types/timeline.ts | 20 +- .../src/utils/getDefaultState.ts | 10 +- .../src/utils/getFinalVideo.ts | 12 + .../src/utils/removeFinalVideo.ts | 9 +- 22 files changed, 4749 insertions(+), 75 deletions(-) create mode 100644 packages/aitube-timeline/package-lock.json create mode 100644 packages/aitube-timeline/src/components/timeline/Cursor.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/CursorWeird.tsx create mode 100644 packages/aitube-timeline/src/components/timeline/types.ts create mode 100644 packages/aitube-timeline/src/hooks/useCursorGeometry.ts create mode 100644 packages/aitube-timeline/src/utils/getFinalVideo.ts diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index 113dff5c..1b24491a 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -54,7 +54,8 @@ This project is currently not designed to be used with other tools such as Svelt ## TODO -[ ] BUG: When zooming in an area, large segments (such as music) become invisible due to the way we compute ranges +[ ] BUG: the scrollY position is a bit janky, one should solve the formula +[ ] OPTIM: we should avoid re-creating geometries (eg. grids, cells) and text since this is costly [ ] FEATURE: Add edit callbacks [ ] CLEAN: Write doc [ ] BUG: Fix the Vite previewer diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index a8cb1747a2606026b360bd70dd07ae11b0e4260c..567e85f09b9913038e0c083bc6cbd4ce06909862 100755 GIT binary patch delta 29234 zcmeIbd3;UR_y2#-k&BC%hmaT&Q-p*Vl90GWYrJM9w5E_C5mORsPPDXiW|u>YRwo24 zHP=vMYaUudRVh_P46U|WwDk8}XK1wV_Wl08Ki}`~`_H%Mk=I#!t-bcJ_Fj89_uTAz z@2qF~1wo(hK4``pp~I_idytER5I9X^RGjtplQ%R z=-8sFf?g>r5v!#qhNTQo8JU=ou?${%uBS~W1h`z}oP7jJ%Ir?IJcUY98b7& ztaPE!Lhw?C&|AcdN6dsLY4%f4DQ_cs(5&q7R7x_~3zY=_DI+HX4dbLjc1GFF$XzNF zLL*24M#BuJ-Vf<)7OuwuY5&bK<290-@ERsTtwp5{IR^64M8dOia(n zO7swJr zp}0`?G*rc}Mnk2~1|?=>jv~wS|4yaUh5LEONNGHQ24l2Xq z*C=b4)Q6WA39<9djW+Yi%05d#>N+>ZqR&Fbe`_?h>h2){KA(Lx*vhy(Q>F05pp3qw20$WpR{nfaNO**(2CGk zpiGeZA7(#Mf;F#2=J zPr4#CBROLr`MlQJYO!8ztb$uW#jxqfvn23XTWhYpOhPGeFO*T8J+hsZ;1OsL{1W6+ zfHS9!OH4~k$;fma^;u23r@htG6q}fqn3TK;URrW7RJ!I>Xc6dY^uQrw&2I6$Ydy4ouE)xmtF! zRYI&DOiD>N=Y=_sSn^}!R~Ws%6eD)Gf-*g4Pl8r~?xY$*NB1y$Fe|$c z0Z~{@L~-b1s2Ijln>lV|vg@q`t4GI=&d5w0p5z+T(`xa|A?C1k%|c%aJlV^VKm4dw zQPP`TwhMVF;>}qN-2w1oz#3?A@!59>h-Gtanx337B5h2v>rijYf?d!;#IJ+eE;Qot z;VxIfzE+Q<+VLZ0NOSdommYe?&Mylp6&wwfe2(_B(hU_}eAcPaz#$`srX(e%vtdc1 zSw|k~Zxz@x(Q1Lj;p2uSW)2*ZF?wKnVn(uS-~g+jktylSpBb)UdF?%NQ#erGS#~MF(3=dym;y5+)@N z7%_VIz~t-j(q+z0>Kwcja11J4xF0G_os!9*OBtT*G0J5>mxLdW zXprPOfL>YR*FweCM(7L0sWLMnQe*Kp0=V+2kyb{{M_CneGKz$ksi+E6Dpu3Z;F)x_ zuW+TtPO^%KrT(RC`dFrwtPs4k#V@HAe+4RbtW&{7%C#Lc#_GxDpf6gU{6p~x~L~F?TL1hlA4ka%8>;!A7 zI6KK2qr2hDBVRt*Dt#Qh=q4&^&72S z{`J|3yFcDO)bCvW2?4QpQ=Wcg&`Xy-J6ryxT`%h=M`auF^=n^V@=UQ4C-RT%df}a+ zFAsRH$LbjW{`ptGUg|q-_3LG_wbk{?-PZk6G?$B!kqyC*Bcp1oDisQPZo|eREvZ&D ziuSb8U9JYda}(g2OA56rGTL(tt_hrKQlD(_t0rVR*D#wxPIz-)i^%_R{7r%N{|G4>#{1RhF5=~tjdLaURH(G^y)>+ zsZ>Z>Ih6xBR8HkW@&~A}P_G^zpi)DVF)8Y+$5j6Su)wtqU0n~1^~Be- z@-rL3^Eg}#`ROY1p_qa&(sudOsEBCK55Fr4*C5o&m1d%fBjBVZU5ZNSD?(LHBd_N? zLh%i=ZhBxX6&B@n_pZexCF9Ox5Rx?XAq{;TPRybYY3SfEr)PxgXLD%6Er63MTAIh< zBwaq!FUr<->LFh82wWSh1l;i*IBC>;;t8Iw;2N5olwP)u)e8mGDmpe1u8r9^OKrJn zg8LL)Lv=kg*5e=UG}9~yd=3MXY42P$N#p=@|RgTx|`2YcCiMum)zJU|x zM;WdLLFs?8jAs^gGST0tuX3AtJ--nxP3Wg^T~7lR8_RQK^%)8$rMk?xO>n*8@Txk| z?s6pRq*esR>Vq1p)OfGHp`pr&_j;}(m#)+ljj9JXQeiE;?k5^ymMD9U60%(#FDQp* zGc(IoHKN@;;JQnX>C2*2>O)>nKs1Z787+;O5^avdg$SjIu(fuy`yO0J8MGcB^%gmP z&X9V`=Bx($8je9u`E?sx?reIRp3+$5wDfx3N7$95C^w4n!`mNKD;mV=tDC6QR$l$* zCMu_u*Ik=cnH8pXto}=^3Ty4vy>TiPaxPBgKq8u|+}2*t`lhTtR_*Y?e7Mjcb-i`0 zJB3hB3F+ItDz}Z-T@}0IOhLb9Dz&ZG{VoCqGrCPMgYIn|>uDZubxwYBGcXxW`c)VI z)>p=>oOWK%b%c2ZHf|veEydh!p;CQbcfE&PuHj~`3kmf$Lw5<8b#ZsaF-&#$EJ6>P zvELA)t;iy@rAqDK^*q|rav-;gjEirv^PLgM~pE9<3*}QaK&H zo_7%1(_d_~`zyF4Gyhhto&2}ARym!#`VXyDE+n&!3hV6ke9TyHXXb_T>LuE$9E2m= z{_Zv5(e8C{UNf&B3H3Ka&yvQn=>nlgO<7Z)U8d&@A(_P7YE|7BKbkAboaZ~VSGiri z`q}m>tee*p*TM3AYu?T5pmMr-_4OT8F2vJOg+1bRckbwN^)>T;mryGSd480T*(>;+ zyGbV=piGUI2+{JsxPk;^0xO_K)r$6PXF&D+ovV#|i_<~8^N59Jq)hnhTjAUtT2dX?`b*{B8_l09HQJhSHufd6?Im$ezY)x~5@RaNBav`wI z9ttO|WHrJnxE{ZA1qkMGvk1zhV`+W`mzORy0pB66q}g1la8i0n6&V=qUJDncR>a2Y zR})lfZ?C6bPirRfQ>!{fyC=c*Fz2i9da9g0UU#)#rWeJ!#WGHO_dSa(-KP0Xq1IYJCWaW5L>Ae^+NwXG?^l*vHJE@oz) z)mx?ZXV4-XgwR}FJl*;@BZW@WU+km861|>d2pghe?O@8_GGaIh=+^`|={qaAf~#k0 ziVy9Cljg%}8l_Y}b6B&xNg%|a!GC5GlGNBkZO_6<&XfaJrN5Ii>yM{5oHVf6q57Qu z=A*?ICh?R`w5+r`I|WWgEz2H*U^QHf*%c)RsMKVy{`dfulgy52fYT!^vHJZ1Dr}I~ z(_x_HU#zd&^ z1VUE)*l16z&EdfqB~PBxJyumW!I^W3USyC8OYwRhqhGAnltP|Gn95FYuu4t!dR`su zSSe%XBAg5b3PH2t5EVAm>lrk}dVFIKH8|R{2u>Q8J!5RNc0pYk+DxyQqQcU=o`e)9 zHTyyR#T1p3=GDGbSJIk!%A{IdpWocEwS|)wv5Lt`RXM}Fp2vq;DhNAAdp5vHojqnB zUWR)Jj&aU>Q#;M-Q7VLU4NgODrNuu(jCj!>ziyxJFP>8NIUg^?;3 z*^rScEZyr_G}5w|hL4ZdE~=&J&GZhVRBpOge`%Bo%kXNuR7yrOk6*ggXyr^_Zv`ja z#mp2Dt!-AdGMjnsAd@~Xt|AlJvt(HLTC2~{43(SdbuUI3t5)=hb$>-D&e$HOHIV0P zy;7#i8SV9?W?J)#*#hqCaBQ?9V)dG%Rq7b8XUu48UM^(1;So45<(Ztj=oncvSH#7- zpZPtsk5CI!R_SqZD2eU;d*~HHtwiQICn0j8t~H`PzOmL?VD6PXtKr0Htqn{roY=^` z&UUogII9;KZS1Q0k5jqhyxMYAYkV{9n%v!W#!Cgl$H%&d6Y`p&<%C*E$n!lR8J_0! z;T}2B+%pBny0;Qy{UlUrl1z^h$|RI(hVBz$wPV-Rd$KjDP|=8J_cl1zzR*~A{wya| zZ$h2TRLcpqH&fjv#0o^IlB!*{ITcaD3xpVRfw9^Fb!Bohz33DbmenMyqRae5)ulr# zgM1(aXrQW1t3l-wD)Q>Wa0x987zL(05-Qh&RPtj+HLt&*S@Kbk%V#V6-={Q|T>m=- zmn3~3GnfAXwafpXXYg+dmabx5a=F1kAYIJFYhDfwmw+fT0h^TR)x3mC0wzrJ5}IGV zJtf*B+6*X{rY=sYnI-+}81YwB@|XhT5-R#rf#fm`$R$+xr-b49D=P6%gBoB3kPDjS z%1>am$y!tjTni+@I$QqlsOYT+l5V4||5sG>KCt8SC?-q9COhKaQPJCM>j@Qp3y^|8 z1ab)#`8Jzwx9JY3TtX#&CyNSa&(9|LKLgFr5!B0nSy*Mn3FJYq^MDtbq4{@+p2 z`^450YIgl`TOd>vPT0IqDd;mG@>4)Ap~8P|)6-D7go^$dAn|8`TtfZ8S3u+!fLu1s zasq##lF>yV3BCbx2^INeAo43fuD_yU*)=ovkJN+gmMs^mi|hYv3xrC>w{8AGDh1!Q z<9~q)f6wOcL#6BdB(Y81P#I_un7MH zEkt~6TTiG2>)13LD*4rgN`>k}vqaF4fb>y}9T5xV&lM-PKT#1iwd1{Z{DV~TX<^HS zO8yVq{DV{~&|0&n9s;IfTc|W;C#a<9Y|}1KY0@4xpCFN3LZ!gRpps!w%`ey zK55Gzq>|w@TP{@ir=hZh%lDzAV8f>Kq5QcPa1*`Pg!vPdmdkq6R(#7=5L%Xq51^88 zvn_v+O2Tcn{I95_+d;hOeFT-R*=y@RND*bZ_HmcE{kDQo2_CTde@CUDL$=;uQR%u9 zc77*q`kAdSRF`q}Ie`Kwo|g#Kaztp#hl=PS zZjzzA29!&v#J9D1p~APbsSheq9puK9B>}PQ5nCWs3QVwhp;AC^Tiy>UQHeGk2$ceo zMED=5lrz*$Hw?;{$#RV%AO&VZi$kYc5w7XB{8^j6V9RIO{A{R9ORw7U*KGM4HhtTs zOQ5nAu7XNM-?!;%sJSMtCE#2Y2?#_~8A!!KfF!JH(`rz;go?bnFkC`qdit-PFvR~J zeAFlh|G%@rC;5Ms-t_m$|X`u~$kSN-b~Myy%xA09PCaS#wX*oro( z_(Y1$3;pK_!)}a!o-qD-!uaP2a?lw|2$#*^MqkKgzKLtjM@wc z86N*UVf;Vxgux@kTD5U*X7jVn7hn6bLy0ZB=X^i3&FH5dnm*gOwxIbpxuzZC{F+bC=Tf;p z_E4d(_^S@Le41Ouf0>{@d&S?FM66ao1UQ%7*UP{F;NYF~FdECpWo7~H)whI%q za%vIx0Ck6ZdDZ2$1g(Nv$~{nNuP10hsu%Z)Y8CfN%CjgztE>{aS5X_e2dffqBxoTj zg?m-CoqIJ^{>=ofx*Em3hT6-$rV4&5K?_ymxYtrgxreD*ZzpKA)fDb^)G6-aD)OBK zEke!UURRyxUQab%oS;RjncVBEE8H8X_$3KiLp6_kBXyH|lxn*)L5o(4xW}kF+#9Pd zISFdRa(}fp$EU?AZCQdEvcg{_FY{?l)hf7vcl}kFQMj1*>5-K_&8McU zOi-8MF2Z$Ck*gBa+|~YS_9~y&Nu7slv&LVweBY;aQ8V99P`BZ3!F5yds}t0cwf^eu z)jqAex(U~Foxke7#-}ByMQajN!S(*iz1FAoQeDS!zHQ`8?f&K?Azee2CD6Fp_{O8qfbj#qc&n6+;OLXtQf-F|{RsPZ`Lt3f_%< zA7kHcpEg4sg^SsPeINO>XVsLCun+Dc-192(W9-|DeINU@7u9*VHv6z|k58MaX70g0 zxLa^a#qY(w{n)qHr_EM3;d&mxzI{H;P>c3q-$Cr#@6+a~F8i?$ZY|uaN;`mkhp_K} zPg|f?!37+~zJosPHI;Y}``~uNEm9>8Vc!w#JLJ>eRNLV~k7D0ppZ2yIbr}2Lj>9ch z!AG#~6YM+U)0V2Ea50}^-%+2oOiek8eQ+1yR;b8Nu#{t;d-9LzT-Y^y;^h}`#!_I6FzOD>T&}6;MT%zQrb!E zJB58GecBea3NGMt?EB28eW(&Y!#=p(aNAXhQ`mPJ`%d|^ooYK==oi@cxlh}zMtzQb zaL3_3R>7yS?+o^x_Gx?7QMj11*!P7`+png4fqifn;SQ?EGuZbf_MP!*ht+wwHs`SK ztWP_tW}d}9xLa_as(DPhOV0bNdtdsrLf%kMBn8h5HOH{2QNkNsapk`!4&dGjLZ_txMQ<#a}&t$){aar{FHbHNEW9 zuB#cBu`kzOU5EQtHNJvz1r>P3xv8a8Ih2P1dw)Z1Ur-PA&Zz3-4glZ67OKuiID%w*@XxdG280U2MAJW0l(o7w`)<-Sx4~rQF3r zxPx%Ps{AkX;ICNpi;uN#FI?z7Ec(^QYB%mz?1MW4S5wuxhkf_4=$?-i?-X3jZ&-BS z$C@|eKK8*~hYMGYe@mD>7dsdH=40Kv@>_z@M$`OfcVOv{oIOuVFm4Nb54M5PR)b%n zYyQRx4M8L0jtF|@L(oS@5N#~g5ft=8;GYjcW209-1RF%KMFg>i#}B~}H-ce)2$~uj zMG%l5K}9!$W=4t|!5$GD6hXYPH$Q^01rUT6K=6<;t^k72f(Xutprui(AcD_C@O(i8 zt&LM6nC?N))Pta{F~fr(rVxVbBJdfF3n92Hf(3;TbTF=nU~XXq9SS4pWXvm!piL13 z_e9XeXj=rqZ4s;}f}opmM+8g!wW3B}f32O?-B{|6pl4Au{EMQIVDu`=tza<(TSU;y z@DxL^K?K8!A$ZK#D1sry5mYRWppTJK96>+{1P4XX&nRC4!5$GzDuE!;*eimuB@u*| zL@>}8R}w*JDFkOkkZjZ{h2S$0JYNdIVB?esrk6(0v^0VgV@7ENF=Y^37r{`YaTx@c zMX;a@f?>uL5zH-%phH;%BaC@v5wt0X;GPIZ8EwlUxGjPe5ieR>}w5pb%%`voUY&yOxAIcZR{M_a-3r5o@_I0qv#A;eW zeM&xKYn(P&1eKiA64H5ZQq;xw2zlIdPEJ_kUXR`SJ^nAgF zx3*Tpy)>BD?vggpEY&~N{{Qy|HL0G+hnn*Bei7P8%^lC{3y)ROdP?#$%UdJw_gzJs z@qf2cj%9aTv{tZugLvzI2*pO{Uz{_M6_PBnEHkS#!pse=$yXBpAeAiZ{1foNw3G<` z$I<-QXixj~O`^0yn%m6Os)JY?XS~!{YvZ2tDA^kEwY5Owc4I9~&+IKt`GnbOe#W&} z?TCIfNkm)CVm+fr%aIi>*Ru7iyjsz2>fGE&j}klhCdq7L&rB_@3c>roS(k{%5GxA2 zmol$0M(`}HRMuEqEH8uPEvsDP9#HkSAL+*~wq=t4a$9DsebSFN6C7snm0}tTf>PK(6O)SsB9ed8%A5IL#$*>URUl_(fY$UY9xVXkJ1l%^v_7 z5td9|hDx`U2hO`2`Pu+~^8cK!R3LfGMIa3#FOP@XvR7=qtRMu#fLyQIiWLbD2a?$N z-a#e8F~my+Ub7Q3G+j+>+3U8f3bM&SDz(U#1rr_*q^vh=SqR~gyreeYNIKtLsERNS z1u0Cvzrdf%HOIWWUY>7!{<1d9BbmtS%{9iP*;>ttlL$@*@~&B4(etHECus2 zm<{Ft1Iz{Uz$@TYFdr-gi@=-UE$}vY2P_6lKn_?2mIE0w)jFD=7+;XfO;Sj)Ccl4gPI@|)B+wL-+_=m`~b*zPaA-bkbMmHfX~5ca0Z+O zUxIT$zVdMx90kX~<6u0PB;)e{fgNBc_yBAIpOf)W=x|UHlmexJjNP)J90&k%LPiA; z2!cQ*P#N?G`9T3t5U?(|Zh{}d6>tH34Zfs&*Ew(=oCaTjDc}k4Bsc+10(nXHDcAwF zfURH?*a%jGHDDch7rY1F2kD?M=m!$P03dIxJAjU$6EK42X~lydA=Dl8012Qc=mj1H zkAdDshk078y9L3Aj4N}s%2|mz`GKB5zDDsdXbrre8IVtC%j()4F-cDK)#N#kGxuduR#`g0wjQ*pci-)^boiCnFN=?RO)7nx4?XJX@)DLoC4;L8 zd~v8hkgoIq87LnB>7xEXx=Z|6{5cj#nu4GJK>hc8^UKWRXA6Y7fzVJ;9LVZf7#Q*M zwNeqkc?ilLrVvzC?4m$c_?kebuj-&0s0u=il=)igij4_M4ly7aM1e-2A!uM6oUhf+ ziX$jv=^@Y@ctKOp%nrvxTY#3}VbB${1)V`_AS1ICXb(g#vNpg6+S$A_ie=nNdP&;_ zFqX4i-E2WmXaeX19s|yx?oGHqSO?aE_kc_t%fT}67I+gZ1g`?gXC9af3@{ta0yDvj z;05qJ$Ohvn-!+cF<3NVsXds?0^N~2x2q4av1Z1>`Q>K6cKrBrJgTN3l7>E;#?m!@N z;e`$b(u(5D;-un_V?jFQn?p>TREC*&w#cS{=fE@I3GgJC0j7hefmCD~mYz1S|zBfHbjGLYiH| z(!A1&(t@jiw4B7R1gpXOU=5H8^|!H6Z1unhJ_0|0-C#4=1PX$kU@O=Kc7QE5za6>_ zd3-R> zqwLgVcP6_u$yf@OND0fnp(>EVgqKxRc5SkI3kD%T_7}B)#MgsLYfAG*0I94L9u5i< zmR7DySY#5;I>$|x)HtXtuMI&1AUm9BAj_^S$x$}n4B8xY1Ra3vblQQ|Kz2WEfatUW z4}*t*7$lcY8CJ-;v!Ytx3zp_?38bk-Niy?;3hz+aP6;o%LZ#47Knj}zCIZ=-Wr7Tl z4n~3zU>HaPDPSNN0HmUcvOAL9Pj~PLkbPWNAePDAPAVgXwIEDw&9%Q5RJK^M)#?F6 zE|Be3f6xy|OY{YOKyTpaBoQ701_RLqyooUY4V{!5;?p2KO{mfX-0vbR8I6p z14%ytIv$J#j{~W=$VF$IEpzmQH$U_cMG-oQBs>Y3B+3S|3zmvL1*UH!v9_PxqlP) zf*n^x`v1YqsnOqN_;&?K8ZqK|keBfv^OcIu0RdpoVs2bvH=xGsceJWfgZ1m*;e)LZ zt#5;fsEB%&2L{pn&H+=p);BVuUPS$d#*}kfDepegMi4!Lq#mL6`BTL;C&oF-%sF|A z3`pJ}qCUsR8n1t@g%#=>857YUBGTpqg7(wIl9zL4m9A|!hwd1v(q8E)Uz07Za4>$P~L-}?N;^gIpcTv`8e4_{gM?wF7BVy5Od4oO<)B-)gX zaZ4KJANEb2h8$K~TC9C?P^-u}pKs5L*_z)7T29TJ<87CMa_QNl&9ew!#mw? z`H+4knvBhhNi1MolbSgP_in#9b4jUkt$)tbc)Ea5Wd*rANBtHo;jO(vd-*_~hI1Hj zRQm(#7R_2SJ}+i$QDgWDt$vVm=yS#Ga zM)TK?-p|uGUDWta%6AUdU0vO;Prb|2O66%dNAJdbH=$F};!hvVi-|5~c;6+hb6D@~ zzVjwGoWJk4JPqeK-*4ip7rgb*!@KfgUMXfgN7^7x05%VkoHZq=*W@v`Li04v7BjX< z?#`LP%?flGlsI2XCZ z2j5H6R*npL_;WNGS@j91U`+wH?@k!9qvy+S^Ewv^MQ4XrFy19?YHN7*JK0IScJ5eM z>~*)U)kjhWiF3$s_fM}?8$Y6WFSA^k4qWMI_@fb7=;qb1R;B%jK_a8dImWbO-5qa~ z-?y_gF%79JX>OG_>aC)#&e_KmL(W&-<_Xz|1~aB;$j7>c$m3CM{^?dfzc!MXMpjEa z6=+N*ZIE+5^70XpYtn8ET!=;kD=pSUtf!~O2N?%M(>W;lXwRG@ZGU|2qOMJ*@go}Y zIaY-^@1yXSO=dQ`-7vZ<(CCO}lvc@Vpk5zEb}yGnc0Uuh z?O|dX6GO+?c?3D{#*1 zy}A|?(TMWc9)=h$D2GUeyR&htR*O(N}0-Rbv)3sCiYZ zz~Ofq-|mpwHPEa|ls)dwt)p?AQ>M!lU$trci^J!lL9a^_IOkSZ8PjfMdg*rCh^ZIR zSgKY* zwy|@hoR$6yzM19Wy8V<=~wq>8Z)}tZLdC`h)t2##h5AXq|Gn%!Gk@A67QSVa6nErt_ zNWU6xeD?uW3#w}r+C=ZnscU#Q!PDtIH?c9PNk&Wu98_&QCvx<*<lYG4Ikv3Rz0=ZvA}jm_O!N}johx*H(uIIb>41hoE18#kx^$0DV+1FpDs{q zVTU*0m!Tk|yfGg&G&1_5q5m3XjNd{T81n8G?G^oOw9#&>#hdSe(_-?%&Nw`ykIrrXbrF%E2{bmuVZt3|4mFZ@LH`es^FV{^!y54AAe zuZdCTLoJ}txF+U9HK$q|9pV3F3r6p=Yl^HN5%cHGnXZK~FUpk>Ys@EYkaLRi{?(P+ zHA`*#B!x2O8sdI$#TrLM!#N}SskUCqSJnX2u!kcG}?uaYouUa&ivOE;6g-BPFJOMu#}H*%xQLj)rchsvoEZh85eZ0b3AvkhgzL3*7SOenb!13N{HKT zm1NQ?&5e=pQO?2LYwlF~{H5%L8;aXAYk0l%=GOA%8nkuS^_NC{VU}VJYS(S5qfEg{IU z->)0(cT*uJl9?hKKIku&AX&DUa+yQc?AGc>Imf0C7*(xl^TNf%ftUxxwf=P{AX5a> zzU}e>`t;UD@4b}zT5F^8M@*nC+E_cJ{%r>q4w=zic2hDZkXNrZ#=?)Nk8`&A`TGao z4Q=Retuidajz(F(dK}O$xs|Qd(Dk32&+fz^=S=p#r@o8m_gaTt z-E2D3!e)^>9bwa`MLwSYal(&+O5I;@rC2~-PR=>)SC=Kfz3`LQ*5$<<^%>qhi`@Y5PjcsTKIcLGI57_<1kt6rNCNCM#kqupY+8aOa zpMsck{2kQa$kNr{Buc6Bx^kQw! zUS{uBosItcsA=EMMjD$2eNtzm`C;gS&PJVm{~B+cIHXlDmhaOV$~wUQJixfS4|l8F z#VETU^*n^&Ro@TUqQ3 z8TZkQa(*Rb;ZvI)T5_-GJ7~)8iN1G^&wnO8bxWUiS3V-fe)xE%m(l(cN^uVEuQ%fG zyqV=D$z~!_p2O<7-sxpzqY-7D_3z3KYEUw!`jKi2&}d}s?ss8>dcdmEp8$}VbMZ==dFs=ceX_1N&_%H+dgjXTMbCK*Tb-lVtj$T3>KU|(ap z(4+l~&BquZ|Jq2C?dQ!y{SEJNG-;Cbi}cS3FfDP1FUDx+%5wrbbdB; zvZ-nA{=xkyHQ&VG)kUiEA;F@Ys}aw^cBfQ|C3rkdFK}h zisT$Q(!_865G!vI8+T4>ofzfOLhOvR1KwCLbDr?f#))dyQ0 z)o)(AHkXgLdatzRZ5kubw640u$dg!T&f;6Q-d~j_F+6Y(6+76Ne@a^u^!N38@bg3& z@D^WRHw!IoT>f0^s_i#oPiqbAN(TgPO||;SQzYuC{Wl(Eg2YqnVTtRw@g|Ca&W{ST zNxypR@jmV4nUQ!NjT`=A+&qo>g@zhMzMzMkUni*2{qDUt&XsbW`Rm8HDh@T8e}M

{h^^o@iUAu=LZ`eUXmTSs^>!4|M6@kdx8E# zt@gXw^yQ1M2Gxx;W6Y0jQirbZdq(5Kk@t4p%id&FWg` zmmVGq{CM5iM)z~cMtm6$U2EJ!G0^#mhn96tUGYBKyST3H9Bw5&W<-9ejnlp|mVK#} z_w*fU)#sFP5Vn!?gAU0?u{+)J*LhSP3#^9`=O-V0Ppoa&GGJJ#yp8xVW7v5*ruitN z^Enp4XVQ(-bGY@(>E`zkr54b1 zVTM)1{{xkHEYsM0op3KvKkV{KL5zFTqKj8DosOpw&0t`bw+g{*-qm6^-}4UpHZIfKH;r|WmU@m1TQPalycpR{#Lr-S)E0+ zIQ;I${kk<9)8wS{^DrOhOUkLdIU#6ernSiGwWsx)v$)8$UGVaBTkO=_r+=BVf6J%v z@?nqb+OdoK4mYj05uTAU z-e_JyuV~!wr|0kaSJBDob;Ilaed^@&aB~mTFd}pCc-d?*N~=tqSfy{I`H@$6V%o?d ziN@`gdZbx|@k%#7T5Q%*uW8h5sRtPAE9-&Apq6^0f_&RPbHvc(;f7XJ4>IOP>P?JF uJ@oR%&2Ddq@YW=#F`dR<=r5@2!1OGqU1w>Z> delta 28535 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 Fe*kN8iNpW^ diff --git a/packages/aitube-timeline/package-lock.json b/packages/aitube-timeline/package-lock.json new file mode 100644 index 00000000..e43f147c --- /dev/null +++ b/packages/aitube-timeline/package-lock.json @@ -0,0 +1,4404 @@ +{ + "name": "@aitube/timeline", + "version": "0.0.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@aitube/timeline", + "version": "0.0.5", + "license": "MIT", + "dependencies": { + "date-fns": "^3.6.0", + "react-virtualized": "^9.22.5" + }, + "devDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "@types/react-virtualized": "^9.21.30", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "bun-types": "latest", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "prettier": "^3.2.5", + "rimraf": "^5.0.7", + "typescript": "^5.4.5", + "vite": "^5.2.0" + }, + "peerDependencies": { + "@aitube/clap": "0.0.23", + "@radix-ui/react-slider": "^1.1.2", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.105.4", + "@react-three/fiber": "^8.16.2", + "clsx": "^2.0.0", + "react": "*", + "react-dom": "*", + "tailwind-merge": "^2.3.0", + "tailwindcss": "^3.4.3", + "three": "^0.164.1", + "typescript": "^5.4.5", + "zustand": "4.5.2" + } + }, + "node_modules/@aitube/clap": { + "version": "0.0.23", + "license": "MIT", + "peer": true, + "dependencies": { + "pure-uuid": "^1.8.1" + }, + "peerDependencies": { + "yaml": "^2.4.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.6", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.6", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.6", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "license": "MIT", + "peer": true, + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.6.1", + "license": "MIT", + "peer": true + }, + "node_modules/@react-spring/shared": { + "version": "9.7.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.3", + "license": "MIT", + "peer": true + }, + "node_modules/@react-three/drei": { + "version": "9.106.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three": { + "version": "9.6.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/animated": { + "version": "9.6.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/core": { + "version": "9.6.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/shared": { + "version": "9.6.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/types": { + "version": "9.6.1", + "license": "MIT", + "peer": true + }, + "node_modules/@react-three/drei/node_modules/zustand": { + "version": "3.7.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.16.6", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "3.7.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.2", + "license": "MIT", + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "license": "MIT", + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "license": "MIT", + "peer": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-virtualized": { + "version": "9.21.30", + "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.30.tgz", + "integrity": "sha512-4l2TFLQ8BCjNDQlvH85tU6gctuZoEdgYzENQyZHpgTHU7hoLzYgPSOALMAeA58LOWua8AzC6wBivPj1lfl6JgQ==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "license": "MIT", + "peer": true + }, + "node_modules/@types/three": { + "version": "0.164.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/three/node_modules/fflate": { + "version": "0.8.2", + "license": "MIT", + "peer": true + }, + "node_modules/@types/webxr": { + "version": "0.5.16", + "license": "MIT", + "peer": true + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/type-utils": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.11.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.11.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "license": "MIT", + "peer": true + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT", + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "license": "MIT", + "peer": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "license": "MIT", + "peer": true, + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bun-types": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.12.tgz", + "integrity": "sha512-DIM2C9qCECwhck9nLsCDeTv943VmGMCkwX3KljjprSRDXaK2CSiUDVGbUit80Er38ukgxuESJgYPAys4FsNCdg==", + "dev": true, + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/camera-controls": { + "version": "2.8.4", + "license": "MIT", + "peer": true, + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001625", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "license": "MIT", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "peer": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "license": "MIT", + "peer": true + }, + "node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-gpu": { + "version": "5.0.38", + "license": "MIT", + "peer": true, + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "license": "MIT", + "peer": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/draco3d": { + "version": "1.5.7", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.787", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.20.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.7", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.6.10", + "license": "MIT", + "peer": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "10.4.1", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.4", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hls.js": { + "version": "1.3.5", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/ignore": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "license": "MIT", + "peer": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "license": "MIT", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "license": "MIT", + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/its-fine": { + "version": "1.2.5", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/jackspeak": { + "version": "3.1.2", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "license": "MIT", + "peer": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT", + "peer": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maath": { + "version": "0.10.7", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/three": ">=0.144.0", + "three": ">=0.144.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meshline": { + "version": "3.2.1", + "license": "MIT", + "peer": true, + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "license": "MIT", + "peer": true + }, + "node_modules/micromatch": { + "version": "4.0.7", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT", + "peer": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "license": "MIT", + "peer": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT", + "peer": true + }, + "node_modules/potpack": { + "version": "1.0.2", + "license": "ISC", + "peer": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-uuid": { + "version": "1.8.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-composer": { + "version": "5.0.3", + "license": "MIT", + "peer": true, + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "license": "MIT", + "peer": true, + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, + "node_modules/react-virtualized": { + "version": "9.22.5", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", + "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "clsx": "^1.0.4", + "dom-helpers": "^5.1.3", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-virtualized/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.7", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.21.0", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stats-gl": { + "version": "2.2.8", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats-gl/node_modules/@types/three/node_modules/fflate": { + "version": "0.8.2", + "license": "MIT", + "peer": true + }, + "node_modules/stats.js": { + "version": "0.17.0", + "license": "MIT", + "peer": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/tailwind-merge": { + "version": "2.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.24.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "license": "MIT", + "peer": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.164.1", + "license": "MIT", + "peer": true + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.4", + "license": "MIT", + "peer": true, + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.30.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/troika-three-text": { + "version": "0.49.1", + "license": "MIT", + "peer": true, + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.49.0", + "license": "MIT", + "peer": true, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.49.0", + "license": "MIT", + "peer": true + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT", + "peer": true + }, + "node_modules/utility-types": { + "version": "3.11.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "5.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "peer": true + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "license": "MIT", + "peer": true + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.4.2", + "license": "ISC", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.2", + "license": "MIT", + "peer": true, + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 560684aa..18822b5d 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.5", + "version": "0.0.6", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -46,7 +46,10 @@ "typescript": "^5.4.5", "zustand": "4.5.2" }, - "dependencies": { "date-fns": "^3.6.0" }, + "dependencies": { + "date-fns": "^3.6.0", + "react-virtualized-auto-sizer": "^1.0.24" + }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-timeline.git" diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index 5bf3f8d1..6b44d765 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -1,3 +1,4 @@ +import AutoSizer, { Size } from "react-virtualized-auto-sizer" import { Canvas, useFrame, useThree } from "@react-three/fiber" import { Stats } from "@react-three/drei" @@ -7,7 +8,7 @@ import { VerticalScroller, Timeline } from "@/components" -import { ClapProject } from "@aitube/clap" +import { ClapProject, isValidNumber } from "@aitube/clap" import { DEFAULT_FRAMELOOP, DEFAULT_MAX_ZOOM, @@ -21,6 +22,7 @@ import { TimelineCamera } from "./components/camera" import { useTimelineState } from "./hooks" import { clamp } from "./utils/clamp" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "./constants/themes" +import { useRef } from "react" export function ClapTimeline({ clap, @@ -30,7 +32,9 @@ export function ClapTimeline({ zoomSpeed = DEFAULT_ZOOM_SPEED, zoomDampingFactor = DEFAULT_ZOOM_DAMPING_FACTOR, showFPS = DEFAULT_SHOW_FPS, - frameloop = DEFAULT_FRAMELOOP, + // frameloop = DEFAULT_FRAMELOOP, + // width, + // height, }: { clap?: ClapProject className?: string @@ -42,7 +46,9 @@ export function ClapTimeline({ // demand is less CPU intensive, but you will have to manually // trigger state changes - frameloop?: "demand" | "always" | "never" + // frameloop?: "demand" | "always" | "never" + // width?: number + // height?: number } = { clap: undefined, @@ -51,15 +57,19 @@ export function ClapTimeline({ zoomSpeed: DEFAULT_ZOOM_SPEED, zoomDampingFactor: DEFAULT_ZOOM_DAMPING_FACTOR, showFPS: DEFAULT_SHOW_FPS, - frameloop: DEFAULT_FRAMELOOP + // frameloop: DEFAULT_FRAMELOOP }) { + const ref = useRef(null) return ( -

+
+ + {({ height, width }: Size) => ( + // kids don't try this at home + useTimelineState.getState().setContainerSize({ width, height }),
{ + const rect = ref.current?.getBoundingClientRect() + if (!rect) { return } + + const clientY = wheelEvent.clientY + const containerY = rect.y + const posY = clientY - containerY + // apparently we cannot stop the propagation from the scroll wheel event // we attach to our to bar from the scroll wheel event set on the canvas // (that makes sense, one is in DOM space, the other in WebGL space) // // there are probably better ways to do this, but for now here is a very // crude fix to ignore global X-Y scroll events when we are over the timeline - if (wheelEvent.clientY <= topBarTimeScaleHeight) { return } + if (posY <= topBarTimeScaleHeight) { return } useTimelineState.getState().handleMouseWheel({ deltaX: wheelEvent.deltaX, @@ -93,6 +113,7 @@ export function ClapTimeline({ }
+ )} +
); }; diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 1ff30e14..03567006 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -81,7 +81,7 @@ export function Cell({ onPointerMove={(e) => { // crude code to ignore the event when we are over the left column or the top row - if (e.clientX < leftBarTrackScaleWidth || e.clientY < topBarTimeScaleHeight) { + if (e.offsetX < leftBarTrackScaleWidth || e.offsetY < topBarTimeScaleHeight) { setHoveredSegment(undefined) } else { setHoveredSegment(s) @@ -91,7 +91,7 @@ export function Cell({ /* onPointerEnter={(e) => { // crude code to ignore the event when we are over the left column or the top row - if (e.clientX < leftBarTrackScaleWidth || e.clientY < topBarTimeScaleHeight) { + if (e.offsetX < leftBarTrackScaleWidth || e.offsetY < topBarTimeScaleHeight) { setHoveredSegment(undefined) } else { setHoveredSegment(s) diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index bff8a068..d2d9a8bd 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -4,6 +4,7 @@ import { TimelineControlsImpl } from "./types" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" import { clamp } from "@/utils/clamp" import { useFrame, useThree } from "@react-three/fiber" +import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" // for doc see: // https://threejs.org/docs/index.html?q=controls#examples/en/controls/MapControls @@ -19,8 +20,6 @@ export function TimelineControls({ zoomSpeed: number zoomDampingFactor: number }) { - - const { size } = useThree() // this controls the top grid ruler bar and makes it sticky @@ -31,14 +30,20 @@ export function TimelineControls({ // or maybe the useFrame, but it doesn't resize immediately useFrame(({ gl, scene, camera }) => { let { + clap, + horizontalZoomLevel: cellWidth, scrollX, scrollY, timelineCamera, timelineControls, + timelineCursor, maxHeight, leftBarTrackScale, topBarTimelineScale, resizeStartedAt, + width, + height, + cursorTimestampAt, } = useTimelineState.getState() const now = performance.now() // new Date().getTime(), @@ -52,25 +57,49 @@ export function TimelineControls({ return } - const min = maxHeight * 0.5 - const max = maxHeight * 0.5 - scrollX = Math.max(-leftBarTrackScaleWidth, scrollX) - const availableHeight = Math.min(size.height, maxHeight) + const canvasHeight = size.height // * gl.getPixelRatio() + const contentHeight = maxHeight + + + // *------------------------* + // | scrollY | + // | *---------------* | + // | | | | \ + // | | | | <--- canvasHeight + // | | | | / + // *--|---------------|-----* + // | | + // | ------------- | + // | | + // | | \ + // | | <------ contentHeight (can be > or < than the canvasHeight) + // | | / + // | | + // *---------------* + // - let before = scrollY scrollY = clamp( // should depend upon the current zoom level // if we are "high" in the sky (low zoom value) // then we need to to go further noth // now, the problem is that depends scrollY, // + (zoomHeight / 2), - -availableHeight / 2, // (availableHeight / 2), - availableHeight + + 60, // min value: enough to display about one row + the top bar + + // TODO: find the right formula + size.height > 550 ? 350 : + size.height > 500 ? 400 : + size.height > 450 ? 450 : + size.height > 400 ? 500 : + size.height > 350 ? 550 : + size.height > 300 ? 550 : + 600 // determine how far down we can move (to see more of what is up) ) - // console.log(`debug: before=${Math.round(before)}, after=${Math.round(scrollY)}`) + // console.log(`scrollY=${Math.round(scrollY)}`) timelineCamera.position.setX(scrollX) timelineControls.target.setX(scrollX) @@ -82,7 +111,17 @@ export function TimelineControls({ scrollY, isResizing }) - + + + if (timelineCursor) { + + const positionInSteps = ( + (cursorTimestampAt * 1000) / DEFAULT_DURATION_IN_MS_PER_STEP + ) * cellWidth + + timelineCursor.position.x = positionInSteps + } + if (topBarTimelineScale) { topBarTimelineScale.position.y = (-topBarTimeScaleHeight + scrollY) + (size.height / 2) } diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx index 4845b124..f1d18165 100644 --- a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -42,11 +42,6 @@ export function HorizontalScroller() { value={range} onValueChange={(newRange: number[]) => handleTimelinePositionChange(newRange[0])} onWheel={(e) => { - console.log("HorizontalTimelineSlider: received a mouse wheel event:", { - deltaX: e.deltaX, - deltaY: e.deltaY, - z: e.deltaZ - }) handleZoomChange(horizontalZoomLevel + e.deltaY) }} /> diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx new file mode 100644 index 00000000..a0beeff2 --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -0,0 +1,53 @@ +import React from "react" + +import { + useTimelineState +} from "@/hooks" + +import { useCursorGeometry } from "@/hooks/useCursorGeometry" +import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" + +export function Cursor({ + width, + height +}: { + width: number + height: number +}) { + const setTimelineCursor = useTimelineState(s => s.setTimelineCursor) + + const cursorGeometries = useCursorGeometry(); + + console.log(`re-rendering `) + + return ( + <> + { + if (r) { + setTimelineCursor(r) + } + }} + > + {cursorGeometries.map((lineGeometry, idx) => ( + + + + ))} + + + + ); +}; diff --git a/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx b/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx new file mode 100644 index 00000000..033f2a9e --- /dev/null +++ b/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx @@ -0,0 +1,21 @@ +import React from "react" + +import { + useTimelineState +} from "@/hooks" + +import { hslToHex } from "@/utils" +import { useCursorGeometry } from "@/hooks/useCursorGeometry" + +export function Cursor({ + width, + height +}: { + width: number + height: number +}) { + + return ( + <>{null} + ) +}; diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx index b98d4362..4fb20222 100644 --- a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx @@ -64,7 +64,12 @@ export function LeftBarTrackScale({ leftBarTrackScaleWidth / 2, -getVerticalCellPosition(0, track.id) - (getCellHeight(track.id) / 2), -1 - ]}> + ]} + onClick={(e) => { + toggleTrackVisibility(track.id) + e.stopPropagation() + }} + > { - toggleTrackVisibility(track.id) - }} + onClick={(e) => { + toggleTrackVisibility(track.id) + e.stopPropagation() + }} > 👁️ diff --git a/packages/aitube-timeline/src/components/timeline/Timeline.tsx b/packages/aitube-timeline/src/components/timeline/Timeline.tsx index 6555c3e5..1c3abdbf 100644 --- a/packages/aitube-timeline/src/components/timeline/Timeline.tsx +++ b/packages/aitube-timeline/src/components/timeline/Timeline.tsx @@ -14,6 +14,7 @@ import { Cells } from "./Cells" import { TopBarTimeScale } from "./TopBarTimeScale" import { clamp } from "@/utils/clamp" import { LeftBarTrackScale } from "./LeftBarTrackScale" +import { Cursor } from "./Cursor" export function Timeline() { const { size } = useThree() @@ -54,10 +55,14 @@ export function Timeline() { opacity={0} /> + {/* + not a fan of all those props.. I think we could drop this + */} + ); diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 0a506e0f..bdc7b2a0 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -12,7 +12,7 @@ import { DEFAULT_DURATION_IN_MS_PER_STEP, NB_MAX_SHOTS } from "@/constants/grid" import { formatTimestamp } from "@/utils/formatTimestamp" import { useFrame, useThree } from "@react-three/fiber" -import { topBarTimeScaleHeight } from "@/constants/themes" +import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" export function TopBarTimeScale({ width, @@ -54,10 +54,16 @@ export function TopBarTimeScale({ setTopBarTimelineScale(r) } }} - position={[0, 0, 0]} + position={[-leftBarTrackScaleWidth, 0, 0]} onWheel={(e) => { + if (e.offsetY > topBarTimeScaleHeight) { return } + + const wheelFactor = 0.3 + setHorizontalZoomLevel( - useTimelineState.getState().horizontalZoomLevel + (0.5 * e.deltaY) + // Math.round( + useTimelineState.getState().horizontalZoomLevel + (wheelFactor * e.deltaY) + // ) ) e.stopPropagation() }} @@ -66,8 +72,12 @@ export function TopBarTimeScale({ position={[0, 0, -1]}> @@ -78,7 +88,11 @@ export function TopBarTimeScale({ /> - + {timeScaleGraduations.map((lineGeometry, idx) => ( ))} - + {isResizing ? [] : timeScaleGraduations.map((lineGeometry, idx) => ( \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts new file mode 100644 index 00000000..3f59668c --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts @@ -0,0 +1,34 @@ +import { useEffect, useState } from "react" +import * as THREE from "three" + +import { useTimelineState } from "./useTimelineState" +import { useThree } from "@react-three/fiber"; +import { leftBarTrackScaleWidth } from "@/constants/themes"; + +export const useCursorGeometry = () => { + + const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + + const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); + + const maxHeight = useTimelineState(s => s.maxHeight) + + useEffect(() => { + + const thisLines = [] as THREE.BufferGeometry[]; + + for (let i = 0; i < 3; i++) { + const verticalLinePoints = [ + new THREE.Vector3(i, 0, 7), + new THREE.Vector3(i, -maxHeight, 7) + ]; + const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); + + thisLines.push(verticalLineGeometry); + } + + setGridLines(thisLines); + }, [maxHeight, cellWidth]); + + return gridlines; +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts index a70635e5..3497cd21 100644 --- a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts +++ b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts @@ -68,7 +68,7 @@ export const useTimeScaleGraduations = ({ } } else { for (let i = 0; i < nbMaxShots; i++) { - if (i % 20 !== 0) { continue } + if (i % 10 !== 0) { continue } const verticalLinePoints = [ new THREE.Vector3(i * cellWidth, 2, 1), new THREE.Vector3( diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 0d4622e1..0a7c9289 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -10,6 +10,8 @@ import { hslToHex } from "@/utils/hslToHex" import { ClapSegmentCategoryHues, ClapSegmentColorScheme } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" +import { getFinalVideo } from "@/utils/getFinalVideo" +import { TimelineCursorImpl } from "@/components/timeline/types" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), @@ -33,6 +35,19 @@ export const useTimelineState = create((set, get) => ({ let typicalSegmentDurationInSteps = DEFAULT_COLUMNS_PER_SLICE * DEFAULT_DURATION_IN_MS_PER_STEP + const typicalSegmentLengthInPixels = cellWidth * typicalSegmentDurationInSteps + + // TODO: compute the exact image ratio instead of using the media orientation, + // since it might not match the actual assets + const ratio = (clap.meta?.width || 640) / (clap.meta?.height || 480) + + // also storyboards and videos might have different sizes / ratios + const previewHeight = Math.round( + typicalSegmentLengthInPixels / ratio + ) + + const defaultCellHeight = PROMPT_STEP_HEIGHT_IN_PX + // TODO: many of those checks about average duration, nb of tracks, collisions... // should be done by the Clap parser and/or serializer // send a demand to Julian (@flngr) to get it fixed! @@ -58,9 +73,10 @@ export const useTimelineState = create((set, get) => ({ // name: `Track ${s.track}`, name: `${s.category}`, isPreview, - height: isPreview - ? PROMPT_STEP_HEIGHT_IN_PX * 3 - : PROMPT_STEP_HEIGHT_IN_PX, + height: + isPreview + ? previewHeight + : defaultCellHeight, hue: 0, occupied: true, visible: true, @@ -93,20 +109,8 @@ export const useTimelineState = create((set, get) => ({ } } - const typicalSegmentLengthInPixels = cellWidth * typicalSegmentDurationInSteps - // TODO: compute the exact image ratio instead of using the media orientation, - // since it might not match the actual assets - const ratio = (clap.meta?.width || 640) / (clap.meta?.height || 480) - - // also storyboards and videos might have different sizes / ratios - const previewHeight = Math.round( - typicalSegmentLengthInPixels / ratio - ) - const nbIdentifiedTracks = tracks.length - const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) - for (let id = 0; id < tracks.length; id++) { if (!tracks[id]) { tracks[id] = { @@ -121,7 +125,13 @@ export const useTimelineState = create((set, get) => ({ } } + const finalVideo = getFinalVideo(clap) + const isEmpty = segments.length > 0 + + const nbIdentifiedTracks = tracks.length + const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) + set({ ...getDefaultState(), clap, @@ -133,6 +143,7 @@ export const useTimelineState = create((set, get) => ({ typicalSegmentDurationInSteps, isEmpty, isLoading: false, + finalVideo, }) }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { @@ -283,13 +294,43 @@ export const useTimelineState = create((set, get) => ({ }) }, toggleTrackVisibility: (trackId: number) => { - const { tracks } = get() + const { + tracks: oldTracks, + getCellHeight, + getVerticalCellPosition + } = get() + + const tracks = oldTracks.map(t => ( + t.id === trackId + ? { ...t, visible: !t.visible } + : t + )) + + const maxHeight = getCellHeight() + getVerticalCellPosition(0, tracks.length) + + set({ + tracks, + maxHeight, + }) + }, + setContainerSize: ({ width, height }: { width: number; height: number }) => { + + const { tracks, getCellHeight, getVerticalCellPosition } = get() + + const nbIdentifiedTracks = tracks.length + const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) + set({ - tracks: tracks.map(t => ( - t.id === trackId - ? { ...t, visible: !t.visible } - : t - )), + width, + height, + resizeStartedAt: performance.now(), + isResizing: true, }) + }, + setTimelineCursor: (timelineCursor?: TimelineCursorImpl) => { + set({ timelineCursor }) + }, + setCursorTimestampAt: (cursorTimestampAt: number) => { + set({ cursorTimestampAt }) } })) diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index cb0b47de..b086b40f 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -4,6 +4,7 @@ import { ClapProject, ClapSegment } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" +import { TimelineCursorImpl } from "@/components/timeline/types" export type Track = { id: number @@ -18,6 +19,10 @@ export type Track = { export type Tracks = Track[] export type TimelineStoreState = { + // container width and height + width: number + height: number + clap?: ClapProject theme: ClapTimelineTheme @@ -68,6 +73,9 @@ export type TimelineStoreState = { */ timelineControls?: TimelineControlsImpl + // ref to the cursor element + timelineCursor?: TimelineCursorImpl + // max height of the timeline maxHeight: number @@ -83,6 +91,13 @@ export type TimelineStoreState = { topBarTimelineScale?: THREE.Group leftBarTrackScale?: THREE.Group + + // the final video, if available + finalVideo?: ClapSegment + + // position of the current timestamp + cursorTimestampAt: number + } @@ -98,8 +113,11 @@ export type TimelineStoreModifiers = { setTimelineControls: (timelineControls?: TimelineControlsImpl) => void setTopBarTimelineScale: (topBarTimelineScale?: THREE.Group) => void setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => void - handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number, deltaY: number }) => void + handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number; deltaY: number }) => void toggleTrackVisibility: (trackId: number) => void + setContainerSize: ({ width, height }: { width: number; height: number }) => void + setTimelineCursor: (timelineCursor?: TimelineCursorImpl) => void + setCursorTimestampAt: (cursorTimestampAt: number) => void } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 4773fc2d..6b0d54f1 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -6,8 +6,9 @@ import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants import { TimelineStoreState } from "@/types/timeline" export function getDefaultState(): TimelineStoreState { - return { + width: 800, + height: 600, clap: undefined, theme: pastel, segments: [], @@ -53,11 +54,16 @@ export function getDefaultState(): TimelineStoreState { maxHeight: 32, scrollX: 0, - scrollY: 0, + scrollY: 450, resizeStartedAt: 0, isResizing: false, topBarTimelineScale: undefined, leftBarTrackScale: undefined, + + finalVideo: undefined, + + cursorTimestampAt: 0, + timelineCursor: undefined, } } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getFinalVideo.ts b/packages/aitube-timeline/src/utils/getFinalVideo.ts new file mode 100644 index 00000000..424ea4cb --- /dev/null +++ b/packages/aitube-timeline/src/utils/getFinalVideo.ts @@ -0,0 +1,12 @@ +import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" + +export function getFinalVideo(clap: ClapProject): ClapSegment | undefined { + const alreadyAnEmbeddedFinalVideo = clap.segments.filter(s => + s.category === ClapSegmentCategory.VIDEO && + s.status === "completed" && + s.startTimeInMs === 0 && + s.endTimeInMs === clap.meta.durationInMs && + s.assetUrl).at(0) + + return alreadyAnEmbeddedFinalVideo +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/removeFinalVideo.ts b/packages/aitube-timeline/src/utils/removeFinalVideo.ts index e6c68e96..f3d502d0 100644 --- a/packages/aitube-timeline/src/utils/removeFinalVideo.ts +++ b/packages/aitube-timeline/src/utils/removeFinalVideo.ts @@ -1,13 +1,8 @@ import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" +import { getFinalVideo } from "./getFinalVideo" export function removeFinalVideos(clap: ClapProject): ClapSegment[] { - const alreadyAnEmbeddedFinalVideo = clap.segments.filter(s => - s.category === ClapSegmentCategory.VIDEO && - s.status === "completed" && - s.startTimeInMs === 0 && - s.endTimeInMs === clap.meta.durationInMs && - s.assetUrl).at(0) - + const alreadyAnEmbeddedFinalVideo = getFinalVideo(clap) let ignoreThisVideoSegmentId = "" if (alreadyAnEmbeddedFinalVideo) { From c12963c80ba8a7b795f93fb7b6df8899c0c72db5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 3 Jun 2024 15:44:57 +0200 Subject: [PATCH 109/346] 0.0.24 --- packages/aitube-clap/bun.lockb | Bin 16869 -> 16869 bytes packages/aitube-clap/package.json | 7 ++++--- packages/aitube-clap/src/index.ts | 1 + packages/aitube-clap/src/types.ts | 29 +++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index c8cd3d24089225b001dce19241bc2e09f56f12eb..bdba6a46c021a7b9c81255d6282ba0c2e97933ec 100755 GIT binary patch delta 715 zcmaFb%=omKae|)0j_QqjokmlTcmC>6~VxoRjui92yOU`_oW3K{d?OuF(M&>HRC4%VKUX7O^ZigWCuZJZiYBzXg8 z2Wi(_@cRDgrNXg?LTYUM%-R-Whn>nM@0FAA*?98s^DCJN_NB)vv>lm_P4M3pwDF3) zc~@#iVvoqIJ0(jFnO!KZw_9D3p%`dzlyTzWV!QqsnI_D3(^$(3qqJusxlVI(rF{70 z3VGhiSLM8YwP6kg(kz>*6J|^NS-j!MJN^sZYh_kVI>=mj?5@fk9$pper}NqUk_A>o z8g8@Rm7I2KL#ESjwe-0CQ@$QjN!|8(@7#u`D(faYFl%r2P!_x1Et!3uvka z5Nm?y$tU&v7>y@O=o>N{>ltkJ(XV5f{KQzy6qYPtX@H5b&d5N|&`8e$mQY}+0w`mu zXJn>l!jM1tx3T1AJ(GLfKobvGDNfdNkd`#kD@m_%D5)$+E!HnDhBETh0lYLml3GI7>Gf@c(Wy6Fe4{iX!BPA1K#@kAE#ws>*IEl3xFWnmgc4xQRAAJBc zj*;OX|34tD4zUMJvMi96ydeHp#%c9cvz@ta3L)>-$hqbEg&&{d@s}qnp>CZeqwC00MnRdenVh21O?Gjfz~ z{k`)|-FkAayu@T(psCu(rm~l2@y_pL;!RJR)-p3YIM&l~?kl$A3;K<(eerSjdbvty z_w4GsmvndDk!{M@wWZP{b&~AEYqgu)8Jtt4ixuQTCOa@|Z}w1l!^3E_*;Kckkr(7< z4Il>5T9Z%e`7s(zme4n3HqtZQ?4w`DGWm(Im?)$JW1WSbsh*($11!D35(g8b z7Sy>fCjT~;+^lDEj~isxWI&sZeJ5 Date: Mon, 3 Jun 2024 15:48:03 +0200 Subject: [PATCH 110/346] 0.0.33 --- packages/aitube-client/README.md | 1 - packages/aitube-client/bun.lockb | Bin 18708 -> 18708 bytes packages/aitube-client/package.json | 7 ++-- .../src/api/editClapDialogues.ts | 3 +- .../aitube-client/src/api/editClapEntities.ts | 4 +-- .../aitube-client/src/api/editClapMusic.ts | 3 +- .../aitube-client/src/api/editClapSounds.ts | 3 +- .../aitube-client/src/api/editClapStory.ts | 3 +- .../src/api/editClapStoryboards.ts | 3 +- .../aitube-client/src/api/editClapVideos.ts | 3 +- packages/aitube-client/src/constants/index.ts | 1 - packages/aitube-client/src/constants/types.ts | 30 ------------------ packages/aitube-client/src/index.ts | 1 - .../src/utils/applyClapCompletion.ts | 4 +-- 14 files changed, 13 insertions(+), 53 deletions(-) diff --git a/packages/aitube-client/README.md b/packages/aitube-client/README.md index 1ba08ab4..47bddcce 100644 --- a/packages/aitube-client/README.md +++ b/packages/aitube-client/README.md @@ -45,7 +45,6 @@ import { aitubeUrl, aitubeApiVersion, aitubeApiUrl, - ClapCompletionMode, ClapEntityPrompt, SupportedExportFormat, applyClapCompletion, diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 3479c5fb5dd2e2910b390f41dd8e871b484595c9..bb08f64c7519f528c9340aae731ddc793f942078 100755 GIT binary patch delta 782 zcmbO-iE+v##tC`~PKmctzCAd2OT+!p@}v#(4~efS*{0K?dU2Zho?{gsZ1-&R>tYmb z;$dLmW?*PI4y1vop%O@NZhp&H%qTHYKdM)4tF0wxzRj^$fwOimK0Tvye%7VT%@xc! zT$58cO(sk52{7_Zp2(~|Ie?Fc*9xdzgaK>}10PuQ0y78GWuD2m`0SWOcqd2k*-e(< z7hsft=-`(CnxV0I0{;?5PM|IZQy^yCY%5rg#GPy_D7*QQkT#!#`Yl;)LBSRk(+dx_ zo!npk{OtXgo;P+~p4SO6F;45l#R2|e0Wpt zThGjYlYJE>>Uo;YxNkKH=qMKXr|TVPuC)I9xHL`Tz>0rFT&v<7yJ#Dy#uVPb z*+JSh7refIdZ}>ip^zFIKeM)l*kPwKMxYBB{_+0<(%K*=LjlXilZT&Q$xN^>JyxOZ z$aHLi|E{2oSM1HZQZo{JL}uM7S#rqiLUFyF{CnRV(-6 ze->{z@{a#P_ga}%lMXT$9=oe@hlf|i`ssXjzhr?Gk%rr>C3hvK-P(}p^jj@GZvT|8 zhg4Fxz1};w;i<~H&9Tb2`4~+$TN+JgaS)@)WCIgJW@9~r%_$~l zSj2%*+W<>AOpJ9FdZv1Y1`JJ;buA?sk58@!l1-BnEhQ&Uu{2~f-h9mRCl90Xz5Zp8F~3Bsgn;{Nl!L#XP=zyE)2A>-aU7+p}WcCH|`QZ S9;=51(2N64@{?mdwgUkA+a%Bc delta 789 zcmbO-iE+v##tC`~T&eRG-u*l4d}Qp^2h(2MyTW3dusC~BRNC(uD{oz|txMYI*TpE> z!o$G8$-vN138cA!^lu=|v-vG!F{8xd(=#gPXI;vis2|mGvDUetH4>iH&-y{ zaIrEmFfg!Ap2(~|S%6Q1kqgWU;NzKmhtEdvAkYvipkX3FH9#f<4_NjBGY1np@8ns0 zc9SLe1sKI4TKFX}!48 zZgTvauGD>QyK$rWl<+jS-=&jZ-O&-$hqbEg&&{d@s}qnp>IZ~MpBURSi-68#WcbJb4@hfIPE-n?%%Q~VQ<-#F zBL1kQ@>`~lT9pC<5A?Y`_|9DEdvwWXtMXCn3AUb3T0TV==(ve!YetFH&vMnAyF_6( zi^Pl^pN8%S(^exCi`HdTy~t(CkJ6N1Sftk?#_Z&V(Zwst*cRC}3eP&ElQk z$;6wUHmzl5c5tkx z9F(wNsfdZO&d5N|&`8gsWwNfNBxB{|Y9RT0a-yZ=79JQNq+J} zH)%-&y^{1Qhmy*I)MEX-{FGEEv%GlnK`ZIW2JY;W_qpp$HguO{G@9(~o;&%Cy9Ce$ OtR5CXKFEw%kL>`FI3L9T diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 3a8e8383..3ed710a8 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.32", + "version": "0.0.33", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,18 +14,19 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.23" + "@aitube/clap": "0.0.24" }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-client.git" }, "keywords": [ + "OpenClap", "AI cinema", "file format", "specification" diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/aitube-client/src/api/editClapDialogues.ts index 23415488..a54bff09 100644 --- a/packages/aitube-client/src/api/editClapDialogues.ts +++ b/packages/aitube-client/src/api/editClapDialogues.ts @@ -1,8 +1,7 @@ -import { ClapProject, fetchClap, removeGeneratedAssetUrls, serializeClap } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, removeGeneratedAssetUrls, serializeClap } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapDialogues({ diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/aitube-client/src/api/editClapEntities.ts index 67292b02..0373b461 100644 --- a/packages/aitube-client/src/api/editClapEntities.ts +++ b/packages/aitube-client/src/api/editClapEntities.ts @@ -1,8 +1,8 @@ -import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode, ClapEntityPrompt } from "@/constants/types" +import { ClapEntityPrompt } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapEntities({ diff --git a/packages/aitube-client/src/api/editClapMusic.ts b/packages/aitube-client/src/api/editClapMusic.ts index f845d7cb..66861f50 100644 --- a/packages/aitube-client/src/api/editClapMusic.ts +++ b/packages/aitube-client/src/api/editClapMusic.ts @@ -1,8 +1,7 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapMusic({ diff --git a/packages/aitube-client/src/api/editClapSounds.ts b/packages/aitube-client/src/api/editClapSounds.ts index 3bf26964..316f892a 100644 --- a/packages/aitube-client/src/api/editClapSounds.ts +++ b/packages/aitube-client/src/api/editClapSounds.ts @@ -1,8 +1,7 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapSounds({ diff --git a/packages/aitube-client/src/api/editClapStory.ts b/packages/aitube-client/src/api/editClapStory.ts index 35922cbd..2a7abb5a 100644 --- a/packages/aitube-client/src/api/editClapStory.ts +++ b/packages/aitube-client/src/api/editClapStory.ts @@ -1,8 +1,7 @@ -import { ClapProject, fetchClap, filterAssets, isValidNumber, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, filterAssets, isValidNumber, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import queryString from "query-string" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapStory({ diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/aitube-client/src/api/editClapStoryboards.ts index b2d6d5fb..2f596441 100644 --- a/packages/aitube-client/src/api/editClapStoryboards.ts +++ b/packages/aitube-client/src/api/editClapStoryboards.ts @@ -1,8 +1,7 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapStoryboards({ diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/aitube-client/src/api/editClapVideos.ts index 22a2485e..7f02456b 100644 --- a/packages/aitube-client/src/api/editClapVideos.ts +++ b/packages/aitube-client/src/api/editClapVideos.ts @@ -1,8 +1,7 @@ import queryString from "query-string" -import { ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls, ClapSegmentStatus, ClapSegmentCategory, filterSegments, ClapSegmentFilteringMode, ClapSegment } from "@aitube/clap" +import { ClapCompletionMode, ClapProject, fetchClap, serializeClap, removeGeneratedAssetUrls, ClapSegmentStatus, ClapSegmentCategory, filterSegments, ClapSegmentFilteringMode, ClapSegment } from "@aitube/clap" import { aitubeApiUrl } from "@/constants/config" -import { ClapCompletionMode } from "@/constants/types" import { applyClapCompletion } from "@/utils" export async function editClapVideos({ diff --git a/packages/aitube-client/src/constants/index.ts b/packages/aitube-client/src/constants/index.ts index d6ae0443..d4b598a5 100644 --- a/packages/aitube-client/src/constants/index.ts +++ b/packages/aitube-client/src/constants/index.ts @@ -12,7 +12,6 @@ export { } from './config' export { - ClapCompletionMode, ClapEntityPrompt, SupportedExportFormat } from "./types" diff --git a/packages/aitube-client/src/constants/types.ts b/packages/aitube-client/src/constants/types.ts index 9a70ded4..34c24862 100644 --- a/packages/aitube-client/src/constants/types.ts +++ b/packages/aitube-client/src/constants/types.ts @@ -2,36 +2,6 @@ import { ClapSegmentCategory } from "@aitube/clap" export type SupportedExportFormat = "mp4" | "webm" -export enum ClapCompletionMode { - /** - * the API and the client will return a full clap file. - * This is a very convenient and simple mode, but it is also very ineficient, - * so it should not be used for intensive applications. - */ - FULL = "full", - - /** - * the API and the client will return a partial clap file containing only the changes, - * containing only the new values and changes. - * This is useful for real-time applications and streaming. - */ - PARTIAL = "partial", - - /** - * the API will return a partial clap file containing only the changes, - * and the client will return a merge of the original with the new values. - * This is safe to run, there are no side-effects. - */ - MERGE = "merge", - - /** - * the API will return a partial clap file, and the client will replace the original. - * This is the most efficient mode, but it relies on side-effects and inline object updates. - */ - REPLACE = "replace" -} - - export type ClapEntityPrompt = { name: string diff --git a/packages/aitube-client/src/index.ts b/packages/aitube-client/src/index.ts index 321d935e..11669efd 100644 --- a/packages/aitube-client/src/index.ts +++ b/packages/aitube-client/src/index.ts @@ -19,7 +19,6 @@ export { aitubeUrl, aitubeApiVersion, aitubeApiUrl, - ClapCompletionMode, ClapEntityPrompt, SupportedExportFormat } from "./constants" diff --git a/packages/aitube-client/src/utils/applyClapCompletion.ts b/packages/aitube-client/src/utils/applyClapCompletion.ts index 2b3a8a0e..b84e31c4 100644 --- a/packages/aitube-client/src/utils/applyClapCompletion.ts +++ b/packages/aitube-client/src/utils/applyClapCompletion.ts @@ -1,6 +1,4 @@ -import { ClapProject, updateClap } from "@aitube/clap" - -import { ClapCompletionMode } from ".." +import { ClapCompletionMode, ClapProject, updateClap } from "@aitube/clap" export async function applyClapCompletion( existingClap: ClapProject, From 4155324c29ac18576cde531707cce0a268262730 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 3 Jun 2024 16:07:38 +0200 Subject: [PATCH 111/346] 0.0.15 --- packages/aitube-engine/README.md | 6 + packages/aitube-engine/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-engine/package.json | 6 +- packages/aitube-engine/src/index.ts | 12 + .../src/prompts/getPositivePrompt.ts | 58 +++++ packages/aitube-engine/src/prompts/index.ts | 1 + packages/aitube-engine/src/renderers/index.ts | 2 + .../storyboard/renderShotToStoryboard.ts | 122 ++++++++++ .../src/renderers/video/renderShotToVideo.ts | 218 ++++++++++++++++++ packages/aitube-engine/src/types.ts | 26 +++ 10 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 packages/aitube-engine/src/prompts/getPositivePrompt.ts create mode 100644 packages/aitube-engine/src/renderers/index.ts create mode 100644 packages/aitube-engine/src/renderers/storyboard/renderShotToStoryboard.ts create mode 100644 packages/aitube-engine/src/renderers/video/renderShotToVideo.ts create mode 100644 packages/aitube-engine/src/types.ts diff --git a/packages/aitube-engine/README.md b/packages/aitube-engine/README.md index 0eae80b8..b4537de8 100644 --- a/packages/aitube-engine/README.md +++ b/packages/aitube-engine/README.md @@ -23,11 +23,17 @@ npm install @aitube/engine import { getCharacterPrompt, getCharacterReferencePrompt, + getPositivePrompt, getSpeechBackgroundAudioPrompt, getSpeechForegroundAudioPrompt, getVideoPrompt, deduplicate, deduplicatePrompt, + renderShotToStoryboard, + renderShotToVideo, + type VideoRenderer, + type StoryboardRenderer, + type VideoFirstFrameExtractor } from '@aitube/engine' ``` diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index d4b37a4e80f894c2ad1e2b8eff9e87e4fc100c8d..1b477506f182109ef4b167df4187b29c9a14dea6 100755 GIT binary patch delta 821 zcmcc8#(1TTae|(L^~7e^^j&O>A^-R$&CGG;Z~Nl(yYOIz#;**KJRckR-i>})jG|WD z3=BZjP!A+{fV3fy=G=UiF_=+eqJC7b+E!aj&U~9=uL5W7UVM5+<@~HmnVT(`b2ulf zaF|TK!6U%PGdYl1eX;;A53dzay9fi=7zRGD=mcgC#_q{8dF>g`OqS%epL~N?fKdXX zo=*a3g2v_mz7|GKpdJQ8AZFZrmp>kfJNYiZ?B*oF(>xC9w`8>i1zS{1FFe?Ga)0^r zv-e+m-q>|{UT0j=WkY7~t!%zmbuYc&^zqfl>6MOJe>DC~{B){OHqJ)#;Z3=3Jv0AJ z&Xtp>=V>n8fi7hD$NvvVtAm^j1uPp+9)5l$Gr_*}ScSGD)3FKu zyMi`eu{ZBZ%}DGKnRTaR$sw}~#r1ZQt4lHz0}YNcPCQ&}*FPiEgxPKyYk6Um_N>XW z@)DDK<-Hj-Cts8cpL|1}x4z@##uGoMwg+7^^$gQkyV|W_Qu>GP8RE0AFq~aKEBWF@ zkLSU@)fOugD{k(;?r6EM=uS}Mg#C+i+>PG3ur@4wxE#r?+AxO#X_igZ39}{sEZ%VB z9sh;ywKA(F9b_&%c30&N53h>#)A{Uv$pR}P4YyfK?n+L(wIS2#w_1AK{wZG%sibau zy?1WIQ_*G{g#MmjHZjGT->rA9!^u=y^3JQ8>EU4GfkNrI<&9PWRdmVK>{+f9yt z)0MiynBkZg(u=nvpQ~sl19!YwW$%DGKU4Hsrr_ZwT0( z-D-dI!Q@;y37-Yhk{87P$~djQYPK`iO(Epn8acOIzwqNzJpS@zCA7{;G`-=a{P$1g zyx7U_?`{A1+Uv^KjenNNh>AUWp*XAAYZ1_yj12$y{{dilQradeJYaV7M?Iw2y z=Tzxp1-X#TwFa{cSY5-J8>KPg^z)~J8nK3bHLEQ;Xi@;wDq$d) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index e35e52b0..0af827a1 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.14", + "version": "0.0.15", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,12 +14,12 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.23" + "@aitube/clap": "0.0.24" }, "repository": { "type": "git", diff --git a/packages/aitube-engine/src/index.ts b/packages/aitube-engine/src/index.ts index 3eae5811..dc8ee39c 100644 --- a/packages/aitube-engine/src/index.ts +++ b/packages/aitube-engine/src/index.ts @@ -1,6 +1,12 @@ +export { + renderShotToStoryboard, + renderShotToVideo +} from './renderers' + export { getCharacterPrompt, getCharacterReferencePrompt, + getPositivePrompt, getSpeechBackgroundAudioPrompt, getSpeechForegroundAudioPrompt, getVideoPrompt, @@ -10,3 +16,9 @@ export { deduplicate, deduplicatePrompt, } from './utils' + +export { + VideoRenderer, + StoryboardRenderer, + VideoFirstFrameExtractor +} from "./types" \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getPositivePrompt.ts b/packages/aitube-engine/src/prompts/getPositivePrompt.ts new file mode 100644 index 00000000..d06a7e5d --- /dev/null +++ b/packages/aitube-engine/src/prompts/getPositivePrompt.ts @@ -0,0 +1,58 @@ +// should we really have default prompts in here? +// I think they should probably be defined at the applicative software layer (ie. in the client) + +export function addWordsIfNotPartOfThePrompt(prompt: string = "", words: string[] = []): string { + const promptWords = prompt.split(",").map(w => w.trim().toLocaleLowerCase()) + + return [ + prompt, + // we add our keywords, unless they are already part of the prompt + ...words.filter(w => !promptWords.includes(w.toLocaleLowerCase())) + ].join(", ") +} + + export function getPositivePrompt(prompt: string = "", triggerWord = "") { + return addWordsIfNotPartOfThePrompt(prompt, [ + "cinematic photo", + triggerWord, + "sublime", + "pro quality", + "sharp", + "crisp", + "beautiful", + "impressive", + "amazing", + "4K", + "hd" + ]) +} + +export function getNegativePrompt(prompt: string = "") { + return addWordsIfNotPartOfThePrompt(prompt, [ + "cropped", + // "underexposed", // <-- can be a desired style + // "overexposed", // <-- can be a desired style + "logo", + "hud", + "ui", + "censored", + "blurry", + "watermark", + "watermarked", + "copyright", + "extra digit", + "fewer digits", + "bad fingers", + "bad quality", + "worst quality", + "low quality", + "low resolution", + "glitch", // <-- keep or not? could be a desired style? + // "deformed", + // "mutated", + // "ugly", + // "disfigured", + // "3D render", // <-- keep or not? could be a desired style? + "signature" + ]) +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/index.ts b/packages/aitube-engine/src/prompts/index.ts index 82c5e41d..a35c3549 100644 --- a/packages/aitube-engine/src/prompts/index.ts +++ b/packages/aitube-engine/src/prompts/index.ts @@ -1,5 +1,6 @@ export { getCharacterPrompt } from "./getCharacterPrompt" export { getCharacterReferencePrompt } from "./getCharacterReferencePrompt" +export { getPositivePrompt } from "./getPositivePrompt" export { getSpeechBackgroundAudioPrompt } from "./getSpeechBackgroundAudioPrompt" export { getSpeechForegroundAudioPrompt } from "./getSpeechForegroundAudioPrompt" export { getVideoPrompt } from "./getVideoPrompt" diff --git a/packages/aitube-engine/src/renderers/index.ts b/packages/aitube-engine/src/renderers/index.ts new file mode 100644 index 00000000..91f2332d --- /dev/null +++ b/packages/aitube-engine/src/renderers/index.ts @@ -0,0 +1,2 @@ +export { renderShotToStoryboard } from "./storyboard/renderShotToStoryboard" +export { renderShotToVideo } from "./video/renderShotToVideo" \ No newline at end of file diff --git a/packages/aitube-engine/src/renderers/storyboard/renderShotToStoryboard.ts b/packages/aitube-engine/src/renderers/storyboard/renderShotToStoryboard.ts new file mode 100644 index 00000000..13a6f697 --- /dev/null +++ b/packages/aitube-engine/src/renderers/storyboard/renderShotToStoryboard.ts @@ -0,0 +1,122 @@ +import { + ClapProject, + ClapSegment, + getClapAssetSourceType, + newSegment, + filterSegments, + ClapSegmentFilteringMode, + ClapSegmentCategory, + ClapOutputType, + ClapSegmentStatus, + ClapCompletionMode +} from "@aitube/clap" + +import { getVideoPrompt } from "@/prompts/getVideoPrompt" +import { StoryboardRenderer } from "@/types" +import { getPositivePrompt } from "@/prompts/getPositivePrompt" + +export async function renderShotToStoryboard({ + shotSegment, + existingClap, + newerClap, + mode, + turbo, + renderStoryboard, + debug = false +}: { + shotSegment: ClapSegment + existingClap: ClapProject + newerClap: ClapProject + mode: ClapCompletionMode + turbo: boolean + renderStoryboard: StoryboardRenderer + debug?: boolean +}): Promise { + + const shotSegments: ClapSegment[] = filterSegments( + ClapSegmentFilteringMode.BOTH, + shotSegment, + existingClap.segments + ) + + const shotStoryboardSegments: ClapSegment[] = shotSegments.filter(s => + s.category === ClapSegmentCategory.STORYBOARD + ) + + let shotStoryboardSegment: ClapSegment | undefined = shotStoryboardSegments.at(0) + + // TASK 1: GENERATE MISSING STORYBOARD SEGMENT + if (!shotStoryboardSegment) { + shotStoryboardSegment = newSegment({ + track: 1, + startTimeInMs: shotSegment.startTimeInMs, + endTimeInMs: shotSegment.endTimeInMs, + assetDurationInMs: shotSegment.assetDurationInMs, + category: ClapSegmentCategory.STORYBOARD, + prompt: "", + assetUrl: "", + outputType: ClapOutputType.IMAGE, + }) + + // we fix the existing clap + if (shotStoryboardSegment) { + existingClap.segments.push(shotStoryboardSegment) + } + + if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] generated storyboard segment [${shotSegment.startTimeInMs}:${shotSegment.endTimeInMs}]`) } + } + + if (!shotStoryboardSegment) { throw new Error(`failed to generate a newSegment`) } + + // TASK 2: GENERATE MISSING STORYBOARD PROMPT + if (!shotStoryboardSegment?.prompt) { + // storyboard is missing, let's generate it + shotStoryboardSegment.prompt = getVideoPrompt( + shotSegments, + existingClap.entityIndex, + ["high quality", "crisp", "detailed"] + ) + if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] generating storyboard prompt: ${shotStoryboardSegment.prompt}`) } + } + + // TASK 3: GENERATE MISSING STORYBOARD BITMAP + if (!shotStoryboardSegment.assetUrl) { + if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] generating image..`) } + + // console.log(`we have ${existingClap.entities.length} entities`) + // check if we have an entity image we can use + const identityImage = existingClap.entities.find(e => e.id === shotStoryboardSegment.entityId)?.imageId + if (identityImage) { + // if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] using an entity to generate the storyboard..`) } + } + try { + shotStoryboardSegment.assetUrl = await renderStoryboard({ + prompt: getPositivePrompt(shotStoryboardSegment.prompt), + identityImage, + width: existingClap.meta.width, + height: existingClap.meta.height, + + // turbo mode is mandatory if we have an identity image + // that's because it will use PuLID instead of SDXL + turbo: !!identityImage, + }) + shotStoryboardSegment.assetSourceType = getClapAssetSourceType(shotStoryboardSegment.assetUrl) + shotStoryboardSegment.status = ClapSegmentStatus.COMPLETED + } catch (err) { + // console.log(`[api/v1/edit/storyboards] processShot: failed to generate an image: ${err}`) + shotStoryboardSegment.status = ClapSegmentStatus.TO_GENERATE + throw err + } + + if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] generated storyboard image: ${shotStoryboardSegment?.assetUrl?.slice?.(0, 50)}...`) } + + // if mode is full, newerClap already contains the ference to shotStoryboardSegment + // but if it's partial, we need to manually add it + if (mode !== ClapCompletionMode.FULL) { + newerClap.segments.push(shotStoryboardSegment) + } + } else { + if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] there is already a storyboard image: ${shotStoryboardSegment?.assetUrl?.slice?.(0, 50)}...`) } + } + +} diff --git a/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts b/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts new file mode 100644 index 00000000..a9a3afd8 --- /dev/null +++ b/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts @@ -0,0 +1,218 @@ + +import { getVideoPrompt } from "@/prompts" +import { VideoFirstFrameExtractor, VideoRenderer } from "@/types" +import { + ClapProject, + ClapSegment, + getClapAssetSourceType, + newSegment, + filterSegments, + ClapSegmentFilteringMode, + ClapOutputType, + ClapSegmentCategory, + ClapSegmentStatus, + parseMediaOrientation, + ClapCompletionMode +} from "@aitube/clap" + +export async function renderShotToVideo({ + shotSegment, + existingClap, + newerClap, + mode, + turbo, + renderVideo, + extractFirstFrame, + debug = false +}: { + shotSegment: ClapSegment + existingClap: ClapProject + newerClap: ClapProject + mode: ClapCompletionMode + turbo: boolean + renderVideo: VideoRenderer + extractFirstFrame: VideoFirstFrameExtractor + debug?: boolean +}): Promise { + const shotSegments: ClapSegment[] = filterSegments( + ClapSegmentFilteringMode.BOTH, + shotSegment, + existingClap.segments + ) + + const shotVideoSegments: ClapSegment[] = shotSegments.filter(s => + s.category === ClapSegmentCategory.VIDEO + ) + + let shotVideoSegment: ClapSegment | undefined = shotVideoSegments.at(0) + + const shotStoryboardSegments: ClapSegment[] = shotSegments.filter(s => + s.category === ClapSegmentCategory.STORYBOARD + ) + + let shotStoryboardSegment: ClapSegment | undefined = shotStoryboardSegments.at(0) + + // console.log(`[api/edit/videos] processShot: shot [${shotSegment.startTimeInMs}:${shotSegment.endTimeInMs}] has ${shotSegments.length} segments (${shotVideoSegments.length} videos)`) + + // TASK 1: GENERATE MISSING VIDEO SEGMENT + if (!shotVideoSegment) { + shotVideoSegment = newSegment({ + track: 1, + startTimeInMs: shotSegment.startTimeInMs, + endTimeInMs: shotSegment.endTimeInMs, + assetDurationInMs: shotSegment.assetDurationInMs, + category: ClapSegmentCategory.VIDEO, + prompt: "", + assetUrl: "", + outputType: ClapOutputType.VIDEO + }) + + // we fix the existing clap + if (shotVideoSegment) { + existingClap.segments.push(shotSegment) + } + + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] generated video segment [${shotSegment.startTimeInMs}:${shotSegment.endTimeInMs}]`) } + } + + if (!shotVideoSegment) { + throw new Error(`failed to generate a new segment`) + } + + + // TASK 2: GENERATE MISSING VIDEO PROMPT + if (!shotVideoSegment?.prompt) { + // video is missing, let's generate it + shotVideoSegment.prompt = getVideoPrompt( + shotSegments, + existingClap.entityIndex, + ["high quality", "crisp", "detailed"] + ) + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] generating video prompt: ${shotVideoSegment.prompt}`) } + } + + // TASK 3: GENERATE MISSING VIDEO FILE + if (!shotVideoSegment.assetUrl) { + // console.log(`[api/edit/videos] processShot: generating video file..`) + + const debug = false + + let width = existingClap.meta.width + let height = existingClap.meta.height + + // if (turbo) { + // width = Math.round(width / 2) + // height = Math.round(height / 2) + // } + + /* + if (width > height) { + width = 768 + height = 384 + } else if (width < height) { + width = 384 + height = 768 + } else { + width = 512 + height = 512 + } + */ + + if (!shotStoryboardSegment?.assetUrl) { + // it is normal for some storyboards to be empty, + // it only means that we cannot generate or are not interested in generating the video, + // for instance if we have already the video + // console.log(`skipping video generation for the shot..`) + return + + // const error = `cannot generate a video without a storyboard! (at least not with AnimateDiff-LCM SVD)` + // console.error(error) + // throw new Error(error) + } + + try { + shotVideoSegment.assetUrl = await renderVideo({ + // prompt: getPositivePrompt(shotVideoSegment.prompt), + imageInputBase64: shotStoryboardSegment.assetUrl, + seed: shotSegment.seed, + width, + height, + // by default we do 1 second of 24 fps + // but it would look better if we had 2 seconds of 24 fps + nbFrames: 80, + nbFPS: 24, + nbSteps: 4, // turbo ? 4 : 8, + debug, + }) + shotVideoSegment.assetSourceType = getClapAssetSourceType(shotVideoSegment.assetUrl) + shotVideoSegment.status = ClapSegmentStatus.COMPLETED + } catch (err) { + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] failed to generate a video file: ${err}`) } + shotVideoSegment.status = ClapSegmentStatus.TO_GENERATE + throw err + } + + // console.log(`[api/edit/videos] processShot: generated video files: ${shotVideoSegment?.assetUrl?.slice?.(0, 50)}...`) + + // if mode is full, newerClap already contains the ference to shotVideoSegment + // but if it's partial, we need to manually add it + if (mode !== ClapCompletionMode.FULL) { + newerClap.segments.push(shotVideoSegment) + } + + } else { + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] there is already a video file: ${shotVideoSegment?.assetUrl?.slice?.(0, 50)}...`) } + } + + if (!shotVideoSegment.assetUrl) { + return + } + + if (!shotStoryboardSegment) { + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] adding the missing storyboard segment`) } + + shotStoryboardSegment = newSegment({ + track: 1, + startTimeInMs: shotSegment.startTimeInMs, + endTimeInMs: shotSegment.endTimeInMs, + assetDurationInMs: shotSegment.assetDurationInMs, + category: ClapSegmentCategory.STORYBOARD, + prompt: shotVideoSegment.prompt, + outputType: ClapOutputType.IMAGE, + status: ClapSegmentStatus.TO_GENERATE, + }) + + if (shotStoryboardSegment) { + existingClap.segments.push(shotStoryboardSegment) + } + } + + + //---------- + if ( + shotStoryboardSegment && + (!shotStoryboardSegment.assetUrl || shotStoryboardSegment.status === "to_generate") + ) { + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] generating a missing storyboard asset`) } + + try { + shotStoryboardSegment.assetUrl = await extractFirstFrame({ + inputVideo: shotVideoSegment.assetUrl, + outputFormat: "jpeg" + }) + if (!shotStoryboardSegment.assetUrl) { throw new Error(`failed to extract the first frame`) } + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] successfully fixed the missing storyboard`) } + + shotStoryboardSegment.status = ClapSegmentStatus.COMPLETED + } catch (err) { + if (debug) { console.log(`[@aitube-engine/renderShotToVideo] WARNING: couldn't generate the missing storyboard (probably an error with the ffmpeg not being found)`) } + shotStoryboardSegment.status = ClapSegmentStatus.TO_GENERATE + } + + + if (shotStoryboardSegment && mode !== ClapCompletionMode.FULL) { + newerClap.segments.push(shotStoryboardSegment) + } + } + +} \ No newline at end of file diff --git a/packages/aitube-engine/src/types.ts b/packages/aitube-engine/src/types.ts new file mode 100644 index 00000000..c3ca5975 --- /dev/null +++ b/packages/aitube-engine/src/types.ts @@ -0,0 +1,26 @@ + +export type StoryboardRenderer = (request: { + prompt: string; + identityImage?: string; + width?: number; + height?: number; + seed?: number; + turbo?: boolean; +}) => Promise + + +export type VideoRenderer = (request: { + imageInputBase64?: string; + seed?: number; + width?: number; + height?: number; + nbFrames?: number; + nbFPS?: number; + nbSteps?: number; + debug?: boolean; +}) => Promise + +export type VideoFirstFrameExtractor = (params: { + inputVideo?: string; + outputFormat?: "jpeg" | "png" | "webp"; +}) => Promise From 189a32282fc7f9778c088d9edf16158e46a3008c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 3 Jun 2024 16:12:32 +0200 Subject: [PATCH 112/346] 0.0.7 --- packages/aitube-timeline/bun.lockb | Bin 160136 -> 159621 bytes packages/aitube-timeline/package-lock.json | 4404 -------------------- packages/aitube-timeline/package.json | 6 +- 3 files changed, 3 insertions(+), 4407 deletions(-) delete mode 100644 packages/aitube-timeline/package-lock.json diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 567e85f09b9913038e0c083bc6cbd4ce06909862..dec2d2f8dbbcded64be11f279a7e5de2c34ca986 100755 GIT binary patch delta 13434 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 D!A`yc delta 13599 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 diff --git a/packages/aitube-timeline/package-lock.json b/packages/aitube-timeline/package-lock.json deleted file mode 100644 index e43f147c..00000000 --- a/packages/aitube-timeline/package-lock.json +++ /dev/null @@ -1,4404 +0,0 @@ -{ - "name": "@aitube/timeline", - "version": "0.0.5", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@aitube/timeline", - "version": "0.0.5", - "license": "MIT", - "dependencies": { - "date-fns": "^3.6.0", - "react-virtualized": "^9.22.5" - }, - "devDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "@types/react-virtualized": "^9.21.30", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react": "^4.2.1", - "bun-types": "latest", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "prettier": "^3.2.5", - "rimraf": "^5.0.7", - "typescript": "^5.4.5", - "vite": "^5.2.0" - }, - "peerDependencies": { - "@aitube/clap": "0.0.23", - "@radix-ui/react-slider": "^1.1.2", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.105.4", - "@react-three/fiber": "^8.16.2", - "clsx": "^2.0.0", - "react": "*", - "react-dom": "*", - "tailwind-merge": "^2.3.0", - "tailwindcss": "^3.4.3", - "three": "^0.164.1", - "typescript": "^5.4.5", - "zustand": "4.5.2" - } - }, - "node_modules/@aitube/clap": { - "version": "0.0.23", - "license": "MIT", - "peer": true, - "dependencies": { - "pure-uuid": "^1.8.1" - }, - "peerDependencies": { - "yaml": "^2.4.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.6", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helpers": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/traverse": "^7.24.6", - "@babel/types": "^7.24.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.6", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.6", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.24.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.8", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.0.5", - "license": "MIT", - "peer": true, - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@radix-ui/number": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-use-size": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-spring/animated": { - "version": "9.7.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.6.1", - "license": "MIT", - "peer": true - }, - "node_modules/@react-spring/shared": { - "version": "9.7.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/types": "~9.7.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.3", - "license": "MIT", - "peer": true - }, - "node_modules/@react-three/drei": { - "version": "9.106.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.11.2", - "@mediapipe/tasks-vision": "0.10.8", - "@monogrid/gainmap-js": "^3.0.5", - "@react-spring/three": "~9.6.1", - "@use-gesture/react": "^10.2.24", - "camera-controls": "^2.4.2", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.28", - "glsl-noise": "^0.0.0", - "hls.js": "1.3.5", - "maath": "^0.10.7", - "meshline": "^3.1.6", - "react-composer": "^5.0.3", - "stats-gl": "^2.0.0", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.0", - "three-stdlib": "^2.29.9", - "troika-three-text": "^0.49.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.10.0", - "uuid": "^9.0.1", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=8.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three": { - "version": "9.6.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/core": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/animated": { - "version": "9.6.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/core": { - "version": "9.6.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/rafz": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/shared": { - "version": "9.6.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-spring/rafz": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/types": { - "version": "9.6.1", - "license": "MIT", - "peer": true - }, - "node_modules/@react-three/drei/node_modules/zustand": { - "version": "3.7.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.16.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.1", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.2", - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "license": "MIT", - "peer": true - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.12.13", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "license": "MIT", - "peer": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-virtualized": { - "version": "9.21.30", - "resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.30.tgz", - "integrity": "sha512-4l2TFLQ8BCjNDQlvH85tU6gctuZoEdgYzENQyZHpgTHU7hoLzYgPSOALMAeA58LOWua8AzC6wBivPj1lfl6JgQ==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/react": "*" - } - }, - "node_modules/@types/stats.js": { - "version": "0.17.3", - "license": "MIT", - "peer": true - }, - "node_modules/@types/three": { - "version": "0.164.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@tweenjs/tween.js": "~23.1.1", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/three/node_modules/fflate": { - "version": "0.8.2", - "license": "MIT", - "peer": true - }, - "node_modules/@types/webxr": { - "version": "0.5.16", - "license": "MIT", - "peer": true - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/type-utils": "7.11.0", - "@typescript-eslint/utils": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.11.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/utils": "7.11.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "7.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "license": "MIT", - "peer": true - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "license": "MIT", - "peer": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "license": "ISC", - "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "license": "MIT", - "peer": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "license": "MIT", - "peer": true, - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/bun-types": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.12.tgz", - "integrity": "sha512-DIM2C9qCECwhck9nLsCDeTv943VmGMCkwX3KljjprSRDXaK2CSiUDVGbUit80Er38ukgxuESJgYPAys4FsNCdg==", - "dev": true, - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/camera-controls": { - "version": "2.8.4", - "license": "MIT", - "peer": true, - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001625", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "license": "MIT", - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/commander": { - "version": "4.1.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "license": "MIT", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "license": "MIT", - "peer": true - }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-gpu": { - "version": "5.0.38", - "license": "MIT", - "peer": true, - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "license": "MIT", - "peer": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.787", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.20.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.7", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.6.10", - "license": "MIT", - "peer": true - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob": { - "version": "10.4.1", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hls.js": { - "version": "1.3.5", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/ignore": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "license": "MIT", - "peer": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "license": "MIT", - "peer": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "license": "MIT", - "peer": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/its-fine": { - "version": "1.2.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.8", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/jackspeak": { - "version": "3.1.2", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "license": "MIT", - "peer": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT", - "peer": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/maath": { - "version": "0.10.7", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@types/three": ">=0.144.0", - "three": ">=0.144.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/meshline": { - "version": "3.2.1", - "license": "MIT", - "peer": true, - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "license": "MIT", - "peer": true - }, - "node_modules/micromatch": { - "version": "4.0.7", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT", - "peer": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT", - "peer": true - }, - "node_modules/potpack": { - "version": "1.0.2", - "license": "ISC", - "peer": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.2.5", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-uuid": { - "version": "1.8.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-composer": { - "version": "5.0.3", - "license": "MIT", - "peer": true, - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "debounce": "^1.2.1" - }, - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - } - }, - "node_modules/react-virtualized": { - "version": "9.22.5", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", - "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "clsx": "^1.0.4", - "dom-helpers": "^5.1.3", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-virtualized/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "license": "MIT", - "peer": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "license": "MIT" - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "license": "MIT", - "peer": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.7", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stats-gl": { - "version": "2.2.8", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/three": "^0.163.0" - } - }, - "node_modules/stats-gl/node_modules/@types/three": { - "version": "0.163.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@tweenjs/tween.js": "~23.1.1", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/stats-gl/node_modules/@types/three/node_modules/fflate": { - "version": "0.8.2", - "license": "MIT", - "peer": true - }, - "node_modules/stats.js": { - "version": "0.17.0", - "license": "MIT", - "peer": true - }, - "node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "license": "MIT", - "peer": true, - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/tailwind-merge": { - "version": "2.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.24.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "license": "MIT", - "peer": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "license": "MIT", - "peer": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/three": { - "version": "0.164.1", - "license": "MIT", - "peer": true - }, - "node_modules/three-mesh-bvh": { - "version": "0.7.4", - "license": "MIT", - "peer": true, - "peerDependencies": { - "three": ">= 0.151.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.30.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/troika-three-text": { - "version": "0.49.1", - "license": "MIT", - "peer": true, - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.49.0", - "troika-worker-utils": "^0.49.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.49.0", - "license": "MIT", - "peer": true, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.49.0", - "license": "MIT", - "peer": true - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.16", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT", - "peer": true - }, - "node_modules/utility-types": { - "version": "3.11.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vite": { - "version": "5.2.12", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "peer": true - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "license": "MIT", - "peer": true - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.4.2", - "license": "ISC", - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zustand": { - "version": "4.5.2", - "license": "MIT", - "peer": true, - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - } -} diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 18822b5d..80d59102 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.6", + "version": "0.0.7", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -25,13 +25,13 @@ "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "rimraf": "^5.0.7", "typescript": "^5.4.5", "vite": "^5.2.0" }, "peerDependencies": { - "@aitube/clap": "0.0.23", + "@aitube/clap": "0.0.24", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", From 5c9dc627a4db07e782513e50538c55ce7449cb81 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 4 Jun 2024 14:14:13 +0200 Subject: [PATCH 113/346] 0.0.8 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/ClapTimeline.tsx | 3 +- .../src/components/timeline/Cursor.tsx | 2 +- .../src/components/timeline/Grid.tsx | 2 +- .../src/components/timeline/Timeline.tsx | 2 +- .../src/hooks/useHorizontalGridLines.ts | 2 +- .../src/hooks/useHorizontalTrackLines.ts | 2 +- .../src/hooks/useTimelineState.ts | 74 +++++++++++++++++-- .../src/hooks/useVerticalGridLines.ts | 9 ++- .../src/hooks/useVisibleSegments.ts | 21 ++---- .../aitube-timeline/src/types/timeline.ts | 16 ++++ .../src/utils/getDefaultState.ts | 2 +- 12 files changed, 105 insertions(+), 32 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 80d59102..987269d9 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.7", + "version": "0.0.8", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index 6b44d765..e0a1cc46 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -20,8 +20,7 @@ import { import { cn } from "./utils" import { TimelineCamera } from "./components/camera" import { useTimelineState } from "./hooks" -import { clamp } from "./utils/clamp" -import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "./constants/themes" +import { topBarTimeScaleHeight } from "./constants/themes" import { useRef } from "react" export function ClapTimeline({ diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx index a0beeff2..26e2c3cf 100644 --- a/packages/aitube-timeline/src/components/timeline/Cursor.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -18,7 +18,7 @@ export function Cursor({ const cursorGeometries = useCursorGeometry(); - console.log(`re-rendering `) + // console.log(`re-rendering `) return ( <> diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/aitube-timeline/src/components/timeline/Grid.tsx index 38ed17d6..086d5316 100644 --- a/packages/aitube-timeline/src/components/timeline/Grid.tsx +++ b/packages/aitube-timeline/src/components/timeline/Grid.tsx @@ -33,7 +33,7 @@ export function Grid({ nbMaxShots, }); - console.log(`re-rendering `) + // console.log(`re-rendering `) return ( diff --git a/packages/aitube-timeline/src/components/timeline/Timeline.tsx b/packages/aitube-timeline/src/components/timeline/Timeline.tsx index 1c3abdbf..495a766f 100644 --- a/packages/aitube-timeline/src/components/timeline/Timeline.tsx +++ b/packages/aitube-timeline/src/components/timeline/Timeline.tsx @@ -32,7 +32,7 @@ export function Timeline() { const width = nbMaxShots * cellWidth const height = getVerticalCellPosition(0, nbMaxTracks) - console.log(`re-rendering `) + // console.log(`re-rendering `) return ( `${t.visible}_${t.height}`), + JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)), ]); return gridlines; diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts index 7caebedc..16e05a1e 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts @@ -30,7 +30,7 @@ export const useHorizontaTrackLines = () => { }, [ cellWidth, leftBarTrackScaleWidth, - ...tracks.map(t => `${t.visible}_${t.height}`) + JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) ]); return lines; diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 0a7c9289..e0ba1afc 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -1,6 +1,6 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" +import { ClapProject, ClapSegment, ClapSegmentCategory, newClap, serializeClap } from "@aitube/clap" import { TimelineStore, Track, Tracks } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" @@ -12,10 +12,11 @@ import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" import { TimelineCursorImpl } from "@/components/timeline/types" +import { sliceSegments } from "@/utils" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), - setClap: (clap?: ClapProject) => { + setClap: async (clap?: ClapProject) => { if (!clap || !Array.isArray(clap?.segments)) { console.log(`useTimelineState: empty clap, so resetting`) set({ @@ -127,16 +128,35 @@ export const useTimelineState = create((set, get) => ({ const finalVideo = getFinalVideo(clap) - const isEmpty = segments.length > 0 + const isEmpty = segments.length === 0 const nbIdentifiedTracks = tracks.length const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) + /* + // by default the buffer ("visibleSegments") will be empty, + // waiting for some user interactions + // we bootstrap it by giving it a pre-filtered list of segments + // + // TODO: we should move those computations to useVisibleSegments instead + const howManyCellsAreVisible = (get().width / horizontalZoomLevel) + 10 + const beforeTimeInMs = howManyCellsAreVisible * DEFAULT_DURATION_IN_MS_PER_STEP + + const visibleSegments = await sliceSegments({ + segments, + afterTimeInMs: 0, + beforeTimeInMs, + visibleSegments: [] + }) + */ + const visibleSegments: ClapSegment[] = [] + set({ ...getDefaultState(), clap, segments, - visibleSegments: [], + visibleSegments, + segmentsChanged: 1, tracks, maxHeight, nbIdentifiedTracks, @@ -332,5 +352,49 @@ export const useTimelineState = create((set, get) => ({ }, setCursorTimestampAt: (cursorTimestampAt: number) => { set({ cursorTimestampAt }) - } + }, + saveClapAs: async ({ + embedded, + + saveToFilePath, + + showTargetDirPopup = false, + + // some extra text to append to the file name + extraLabel = "" + }: { + // if embedded is true, the file will be larger, as all the content, + // image, video, audio.. + // will be embedded into it (except the last big video) + embedded?: boolean + + saveToFilePath?: string + + // note: the native select picker doesn't work in all browsers (eg. not in Firefox) + // but it's not an issue, in our case we can save using Node/Electron + the cloud + showTargetDirPopup?: boolean + + // some extra text to append to the file name + extraLabel?: string + } = {}) => { + const clap = get().clap || newClap() + + const blob = await serializeClap(clap) + + // Create an object URL for the compressed clap blob + const objectUrl = URL.createObjectURL(blob); + + // Create an anchor element and force browser download + const anchor = document.createElement("a"); + anchor.href = objectUrl; + anchor.download = saveToFilePath || `${clap.meta.title}${extraLabel}.clap`; + document.body.appendChild(anchor); // Append to the body (could be removed once clicked) + anchor.click(); // Trigger the download + + // Cleanup: revoke the object URL and remove the anchor element + URL.revokeObjectURL(objectUrl); + document.body.removeChild(anchor); + + return objectUrl.length + }, })) diff --git a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts index 77f68ba0..89e9fd3a 100644 --- a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts @@ -9,7 +9,7 @@ export const useVerticalGridLines = ({ nbMaxShots: number }) => { const cellWidth = useTimelineState(s => s.horizontalZoomLevel) - + const tracks = useTimelineState(s => s.tracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); const maxHeight = useTimelineState(s => s.maxHeight) @@ -29,7 +29,12 @@ export const useVerticalGridLines = ({ } setGridLines(thisLines); - }, [maxHeight, cellWidth, nbMaxShots]); + }, [ + maxHeight, + cellWidth, + nbMaxShots, + JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) + ]); return gridlines; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 4670ba4e..d9ea46de 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -55,9 +55,7 @@ export const useVisibleSegments = ({ beforeTimeInMs: number afterTimeInMs: number timeout: NodeJS.Timeout - segments: ClapSegment[] visibleSegments: ClapSegment[] - nbMaxTracks: number }>({ position: new THREE.Vector3(), scale: new THREE.Vector3(), @@ -65,21 +63,9 @@ export const useVisibleSegments = ({ beforeTimeInMs: 0, afterTimeInMs: 0, timeout: 0 as unknown as NodeJS.Timeout, - segments: [], visibleSegments: [], - nbMaxTracks, }) - - // make sure the state reflects the latest params - stateRef.current.segments = [...segments] - stateRef.current.nbMaxTracks = nbMaxTracks - - // DO we still need this? - useEffect(() => { - stateRef.current.segments = [...segments] - console.log("TODO: force a re-rendering") - }, [segmentsChanged]) /* for some reason, this: @@ -222,7 +208,10 @@ export const useVisibleSegments = ({ state.afterTimeInMs = afterTimeInMs state.beforeTimeInMs = beforeTimeInMs - const visibleSegments = await sliceSegments({ ...state }) + const visibleSegments = await sliceSegments({ + segments: useTimelineState.getState().segments, + ...state + }) state.visibleSegments = [...visibleSegments] @@ -262,7 +251,7 @@ export const useVisibleSegments = ({ console.log("forcing a sync(true)") const fn = async () => { try { await sync(true) } catch (err) {} } fn() - }, [cellHeight, cellWidth]) + }, [cellHeight, cellWidth, segmentsChanged]) return visibleSegments }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index b086b40f..e442734b 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -102,6 +102,7 @@ export type TimelineStoreState = { export type TimelineStoreModifiers = { + setClap: (clap?: ClapProject) => Promise setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: ClapSegment[]) => void setVisibleSegments: (visibleSegments?: ClapSegment[]) => void @@ -118,6 +119,21 @@ export type TimelineStoreModifiers = { setContainerSize: ({ width, height }: { width: number; height: number }) => void setTimelineCursor: (timelineCursor?: TimelineCursorImpl) => void setCursorTimestampAt: (cursorTimestampAt: number) => void + saveClapAs: (params: { + // if embedded is true, the file will be larger, as all the content, + // image, video, audio.. + // will be embedded into it (except the last big video) + embedded?: boolean + + saveToFilePath?: string + + // note: the native select picker doesn't work in all browsers (eg. not in Firefox) + // but it's not an issue, in our case we can save using Node/Electron + the cloud + showTargetDirPopup?: boolean + + // some extra text to append to the file name + extraLabel?: string + }) => Promise } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 6b0d54f1..7f425f7f 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -28,7 +28,7 @@ export function getDefaultState(): TimelineStoreState { afterSteps: 0, timeout: 0 as unknown as NodeJS.Timeout, - minHorizontalZoomLevel: 2, + minHorizontalZoomLevel: 6, maxHorizontalZoomLevel: 100, // horizontalZoomLevel is the WIDTH of a grid cell, in pixels From f2439e19bdd7af385e18e9730f8818ccf6459f45 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 5 Jun 2024 00:53:37 +0200 Subject: [PATCH 114/346] 0.0.9 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/Cell.tsx | 2 +- .../src/components/cells/ImageCell.tsx | 47 ++++++++----- .../src/components/cells/RedrawButton.tsx | 67 +++++++++++++++++++ .../src/components/cells/TextCell.tsx | 11 ++- .../src/components/cells/VideoCell.tsx | 8 +++ .../src/components/timeline/Cursor.tsx | 2 +- .../src/components/timeline/Grid.tsx | 6 +- packages/aitube-timeline/src/hooks/useAxis.ts | 6 +- .../src/hooks/useCursorGeometry.ts | 2 +- .../src/hooks/useHorizontalGridLines.ts | 4 +- .../src/hooks/useHorizontalTrackLines.ts | 6 +- .../src/hooks/useTimelineState.ts | 45 ++++++++++++- .../src/hooks/useVerticalGridLines.ts | 5 +- .../src/hooks/useVisibleSegments.ts | 12 ++-- packages/aitube-timeline/src/index.tsx | 4 +- packages/aitube-timeline/src/types/index.ts | 6 +- .../aitube-timeline/src/types/rendering.ts | 24 +++++++ .../aitube-timeline/src/types/timeline.ts | 20 +++++- .../src/utils/getDefaultState.ts | 13 ++++ packages/aitube-timeline/src/utils/index.ts | 1 + .../src/utils/parseRenderingStrategy.ts | 31 +++++++++ 22 files changed, 279 insertions(+), 45 deletions(-) create mode 100644 packages/aitube-timeline/src/components/cells/RedrawButton.tsx create mode 100644 packages/aitube-timeline/src/types/rendering.ts create mode 100644 packages/aitube-timeline/src/utils/parseRenderingStrategy.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 987269d9..5e41cfbf 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 03567006..14e2916f 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -76,7 +76,7 @@ export function Cell({ + ((durationInSteps * cellWidth) / 2), -verticalCellPosition + (cellHeight / 2), - -1 + -3 ]} onPointerMove={(e) => { diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/aitube-timeline/src/components/cells/ImageCell.tsx index 52354548..716a5380 100644 --- a/packages/aitube-timeline/src/components/cells/ImageCell.tsx +++ b/packages/aitube-timeline/src/components/cells/ImageCell.tsx @@ -1,8 +1,9 @@ -import { Image } from "@react-three/drei" +import { Circle, Image, Text } from "@react-three/drei" import { useThree } from "@react-three/fiber" import { useSpring, a, animated, config } from "@react-spring/three" import { SpecializedCellProps } from "./types" +import { RedrawButton } from "./RedrawButton" export function ImageCell({ segment: s, @@ -17,21 +18,33 @@ export function ImageCell({ track, }: SpecializedCellProps) { return ( - + <> + + + + + + ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx new file mode 100644 index 00000000..d8024180 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx @@ -0,0 +1,67 @@ +import { ClapSegment } from "@aitube/clap" +import { Circle, Text } from "@react-three/drei" + +import { useTimelineState } from "@/hooks" + +export function RedrawButton({ + segment, + cellWidth, + cellHeight, + isHovered, + durationInSteps, +}: { + segment: ClapSegment + cellWidth: number + cellHeight: number + isHovered: boolean + durationInSteps: number +}) { + // const [isButtonHovered, setButtonHovered] = useState(false) + + return ( + <> + { + useTimelineState().renderSegment(segment) + }} + > + + + 🎲 + + + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 0c4be466..1f26f42a 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -6,6 +6,8 @@ import { clampWebGLText } from "@/utils" import { SpecializedCellProps } from "./types" import { useThree } from "@react-three/fiber" import { useTimelineState } from "@/hooks" +import { RedrawButton } from "./RedrawButton" +import { ClapSegmentCategory } from "@aitube/clap" export function TextCell({ segment: s, @@ -139,8 +141,15 @@ export function TextCell({ > {lines.join("\n")} } - + {(s.category === ClapSegmentCategory.STORYBOARD || s.category === ClapSegmentCategory.VIDEO) + ? : null} ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/VideoCell.tsx b/packages/aitube-timeline/src/components/cells/VideoCell.tsx index bbe3e221..bae3f8b1 100644 --- a/packages/aitube-timeline/src/components/cells/VideoCell.tsx +++ b/packages/aitube-timeline/src/components/cells/VideoCell.tsx @@ -3,6 +3,7 @@ import * as THREE from "three" import { useSpring, a, animated, config } from "@react-spring/three" import { SpecializedCellProps } from "./types" +import { RedrawButton } from "./RedrawButton" export function VideoCell({ segment: s, @@ -64,6 +65,13 @@ export function VideoCell({ + ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx index 26e2c3cf..d04c2674 100644 --- a/packages/aitube-timeline/src/components/timeline/Cursor.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -26,7 +26,7 @@ export function Cursor({ position={[ leftBarTrackScaleWidth, (height / 2), - -7 + -6 ]} ref={r => { if (r) { diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/aitube-timeline/src/components/timeline/Grid.tsx index 086d5316..91533517 100644 --- a/packages/aitube-timeline/src/components/timeline/Grid.tsx +++ b/packages/aitube-timeline/src/components/timeline/Grid.tsx @@ -38,7 +38,7 @@ export function Grid({ return ( <> - + {verticalGridLines.map((lineGeometry, idx) => ( - + {horizontalGridLines.map((lineGeometry, idx) => ( - + {axis.map((lineGeometry, idx) => ( { new THREE.Vector3(0, -maxHeight, 1) ]); + /* const horizontalBottom = new THREE.BufferGeometry().setFromPoints([ new THREE.Vector3(0, -maxHeight, 1), new THREE.Vector3(width, -maxHeight, 1) ]); - setAxis([horizontalTop, vertical, horizontalBottom]); + */ + setAxis([horizontalTop, vertical, + //horizontalBottom + ]); }, [width, height]); return axis; diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts index 3f59668c..50c8ac14 100644 --- a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts +++ b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts @@ -19,7 +19,7 @@ export const useCursorGeometry = () => { for (let i = 0; i < 3; i++) { const verticalLinePoints = [ - new THREE.Vector3(i, 0, 7), + new THREE.Vector3(i, 60, 7), new THREE.Vector3(i, -maxHeight, 7) ]; const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); diff --git a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts index 8d3ede61..fe8dbc6b 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts @@ -24,8 +24,8 @@ export const useHorizontalGridLines = ({ for (let i = 0; i <= tracks.length; i++) { const horizontalLinePoints = [ - new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), - new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 1) + new THREE.Vector3(0, -getVerticalCellPosition(0, i), 0), + new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 0) ]; const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts index 16e05a1e..f42f345e 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts @@ -18,8 +18,8 @@ export const useHorizontaTrackLines = () => { for (let i = 0; i <= tracks.length; i++) { const horizontalLinePoints = [ - new THREE.Vector3(0, -getVerticalCellPosition(0, i), 1), - new THREE.Vector3(leftBarTrackScaleWidth, -getVerticalCellPosition(0, i), 1) + new THREE.Vector3(0, -getVerticalCellPosition(0, i), 0), + new THREE.Vector3(leftBarTrackScaleWidth, -getVerticalCellPosition(0, i), 0) ]; const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); @@ -29,6 +29,8 @@ export const useHorizontaTrackLines = () => { setLines(thisLines); }, [ cellWidth, + // maxWidth, + // nbMaxShots, leftBarTrackScaleWidth, JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) ]); diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index e0ba1afc..79db2ba5 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -1,13 +1,13 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapProject, ClapSegment, ClapSegmentCategory, newClap, serializeClap } from "@aitube/clap" +import { ClapEntity, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, newClap, serializeClap } from "@aitube/clap" -import { TimelineStore, Track, Tracks } from "@/types/timeline" +import { SegmentRenderer, TimelineStore, Track, Tracks } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideo" import { hslToHex } from "@/utils/hslToHex" -import { ClapSegmentCategoryHues, ClapSegmentColorScheme } from "@/types" +import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" @@ -397,4 +397,43 @@ export const useTimelineState = create((set, get) => ({ return objectUrl.length }, + setStoryboardRenderingStrategy: (storyboardRenderingStrategy: RenderingStrategy) => { + set({ + storyboardRenderingStrategy: storyboardRenderingStrategy || RenderingStrategy.ON_DEMAND + }) + }, + setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => { + set({ + videoRenderingStrategy: videoRenderingStrategy || RenderingStrategy.ON_DEMAND + }) + }, + setSegmentRenderer: (segmentRenderer: SegmentRenderer) => { + const defaultSegmentRenderer: SegmentRenderer = ( params: { + segment: ClapSegment, + + // the slice to use for rendering + segments: ClapSegment[], + + entities: Record + }) => Promise.resolve(params.segment) + + set({ + segmentRenderer: (segmentRenderer || defaultSegmentRenderer) + }) + }, + renderSegment: async (segment: ClapSegment) => { + const { segmentRenderer, clap, segments } = get() + + return segmentRenderer({ + segment, + + // the slice to use for rendering + segments: filterSegments(ClapSegmentFilteringMode.ANY, segment, segments), + + // TODO OPTIMIZATION: + // we should filter the entities here, + // to optimize the payload size + entities: clap?.entityIndex || {}, + }) + }, })) diff --git a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts index 89e9fd3a..00d054c0 100644 --- a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts @@ -10,6 +10,7 @@ export const useVerticalGridLines = ({ }) => { const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const tracks = useTimelineState(s => s.tracks) + const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); const maxHeight = useTimelineState(s => s.maxHeight) @@ -20,8 +21,8 @@ export const useVerticalGridLines = ({ for (let i = 0; i < nbMaxShots; i++) { const verticalLinePoints = [ - new THREE.Vector3(i * cellWidth, 0, 1), - new THREE.Vector3(i * cellWidth, -maxHeight, 1) + new THREE.Vector3(i * cellWidth, 0, 0), + new THREE.Vector3(i * cellWidth, -getVerticalCellPosition(0, tracks.length), 0) ]; const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index d9ea46de..28178066 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -55,7 +55,6 @@ export const useVisibleSegments = ({ beforeTimeInMs: number afterTimeInMs: number timeout: NodeJS.Timeout - visibleSegments: ClapSegment[] }>({ position: new THREE.Vector3(), scale: new THREE.Vector3(), @@ -63,7 +62,6 @@ export const useVisibleSegments = ({ beforeTimeInMs: 0, afterTimeInMs: 0, timeout: 0 as unknown as NodeJS.Timeout, - visibleSegments: [], }) /* @@ -208,13 +206,13 @@ export const useVisibleSegments = ({ state.afterTimeInMs = afterTimeInMs state.beforeTimeInMs = beforeTimeInMs + const { segments, visibleSegments: previouslyVisibleSegments } = useTimelineState.getState() const visibleSegments = await sliceSegments({ - segments: useTimelineState.getState().segments, + segments, + visibleSegments: previouslyVisibleSegments, ...state }) - state.visibleSegments = [...visibleSegments] - setVisibleSegments(visibleSegments) } } @@ -225,7 +223,7 @@ export const useVisibleSegments = ({ state.initialized = true - console.log("scheduling a sync(false)") + // console.log("scheduling a sync(false)") // we could also use useInterval, but we need something async-friendly const fn = async () => { // we want a relatively "high" refresh rate in order to get smooth camera movement @@ -248,7 +246,7 @@ export const useVisibleSegments = ({ // force a re-render when cell width or height change useEffect(() => { - console.log("forcing a sync(true)") + // console.log("forcing a sync(true)") const fn = async () => { try { await sync(true) } catch (err) {} } fn() }, [cellHeight, cellWidth, segmentsChanged]) diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index b18c4bc5..3387f993 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -27,7 +27,8 @@ export { clampWebGLText, clampWebGLTextNaive, similar, - sliceSegments + sliceSegments, + parseRenderingStrategy } from "./utils" export { @@ -38,6 +39,7 @@ export { ClapTimelineTheme, ClapSegmentCategoryHues, ClapSegmentColorScheme, + RenderingStrategy } from "./types" export { ClapTimeline } from "./ClapTimeline" diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index 89385925..dd5f32cb 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -13,4 +13,8 @@ export { ClapTimelineTheme, ClapSegmentCategoryHues, ClapSegmentColorScheme -} from "./theme" \ No newline at end of file +} from "./theme" + +export { + RenderingStrategy +} from "./rendering" \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/aitube-timeline/src/types/rendering.ts new file mode 100644 index 00000000..1f026788 --- /dev/null +++ b/packages/aitube-timeline/src/types/rendering.ts @@ -0,0 +1,24 @@ + +export enum RenderingStrategy { + + // render assets when the user asks for it (could be a click or mouse hover) + ON_DEMAND = "ON_DEMAND", + + // render assets currently visible on screen, never render invisible ones + ON_SCREEN_ONLY = "ON_SCREEN_ONLY", + + // render assets visible on screen in priority, + // then pre-render a few of the surrounding assets (but not the whole set) + ON_SCREEN_THEN_SURROUNDING = "ON_SCREEN_THEN_SURROUNDING", + + + // render assets visible on screen in priority, + // then pre-render *ALL* the remaining project's assets + // so yeah if you have 3000 storyboards, it will render that many ($$$) + // (note: there is a setting to cap the number of parallel renderings) + // + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !! this is hardcore! only GPU-rich people shoud use this feature! !! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ON_SCREEN_THEN_ALL = "ON_SCREEN_THEN_ALL", +} diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index e442734b..c499717b 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,10 +1,11 @@ import * as THREE from "three" -import { ClapProject, ClapSegment } from "@aitube/clap" +import { ClapEntity, ClapProject, ClapSegment } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { TimelineCursorImpl } from "@/components/timeline/types" +import { RenderingStrategy } from "./rendering" export type Track = { id: number @@ -18,6 +19,15 @@ export type Track = { export type Tracks = Track[] +export type SegmentRenderer = (params: { + segment: ClapSegment, + + // the slice to use for rendering + segments: ClapSegment[], + + entities: Record +}) => Promise + export type TimelineStoreState = { // container width and height width: number @@ -98,6 +108,10 @@ export type TimelineStoreState = { // position of the current timestamp cursorTimestampAt: number + storyboardRenderingStrategy: RenderingStrategy + videoRenderingStrategy: RenderingStrategy + + segmentRenderer: SegmentRenderer } @@ -134,6 +148,10 @@ export type TimelineStoreModifiers = { // some extra text to append to the file name extraLabel?: string }) => Promise + setStoryboardRenderingStrategy: (storyboardRenderingStrategy: RenderingStrategy) => void + setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => void + setSegmentRenderer: (segmentRenderer: SegmentRenderer) => void + renderSegment: (segment: ClapSegment) => Promise } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 7f425f7f..eb8c4fbc 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -4,6 +4,8 @@ import * as THREE from "three" import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { TimelineStoreState } from "@/types/timeline" +import { RenderingStrategy } from "@/types" +import { ClapEntity, ClapSegment } from "@aitube/clap" export function getDefaultState(): TimelineStoreState { return { @@ -65,5 +67,16 @@ export function getDefaultState(): TimelineStoreState { cursorTimestampAt: 0, timelineCursor: undefined, + + storyboardRenderingStrategy: RenderingStrategy.ON_DEMAND, + videoRenderingStrategy: RenderingStrategy.ON_DEMAND, + segmentRenderer: (params: { + segment: ClapSegment, + + // the slice to use for rendering + segments: ClapSegment[], + + entities: Record + }) => Promise.resolve(params.segment), } } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts index 296e8ffb..1581fb4f 100644 --- a/packages/aitube-timeline/src/utils/index.ts +++ b/packages/aitube-timeline/src/utils/index.ts @@ -8,3 +8,4 @@ export { export { hslToHex } from "./hslToHex" export { similar } from "./similar" export { sliceSegments } from "./sliceSegments" +export { parseRenderingStrategy } from "./parseRenderingStrategy" \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/parseRenderingStrategy.ts b/packages/aitube-timeline/src/utils/parseRenderingStrategy.ts new file mode 100644 index 00000000..204f9524 --- /dev/null +++ b/packages/aitube-timeline/src/utils/parseRenderingStrategy.ts @@ -0,0 +1,31 @@ +import { RenderingStrategy } from "@/types" + +export function parseRenderingStrategy(input: any, defaultStrategy?: RenderingStrategy): RenderingStrategy { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(RenderingStrategy).includes(unknownString as RenderingStrategy)) { + return unknownString as RenderingStrategy + } + + let strategy: RenderingStrategy = defaultStrategy || RenderingStrategy.ON_DEMAND + + unknownString = unknownString.toLowerCase() + + if (unknownString === "on_demand") { + strategy = RenderingStrategy.ON_DEMAND + } + else if (unknownString === "on_screen_only") { + strategy = RenderingStrategy.ON_SCREEN_ONLY + } + else if (unknownString === "on_screen_then_surrounding") { + strategy = RenderingStrategy.ON_SCREEN_THEN_SURROUNDING + } + else if (unknownString === "on_screen_then_all") { + strategy = RenderingStrategy.ON_SCREEN_THEN_ALL + } else { + strategy = RenderingStrategy.ON_DEMAND + } + return strategy +} \ No newline at end of file From 6d8bb3e57ee1f68055b066768e069fa9c5c584a6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 5 Jun 2024 01:01:52 +0200 Subject: [PATCH 115/346] 0.0.10 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useTimelineState.ts | 5 ++--- packages/aitube-timeline/src/index.tsx | 3 ++- packages/aitube-timeline/src/types/index.ts | 3 ++- packages/aitube-timeline/src/types/rendering.ts | 10 ++++++++++ packages/aitube-timeline/src/types/timeline.ts | 11 +---------- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 5e41cfbf..297f6b98 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.9", + "version": "0.0.10", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 79db2ba5..13d47ff3 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -2,17 +2,16 @@ import { create } from "zustand" import * as THREE from "three" import { ClapEntity, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, newClap, serializeClap } from "@aitube/clap" -import { SegmentRenderer, TimelineStore, Track, Tracks } from "@/types/timeline" +import { TimelineStore, Tracks } from "@/types/timeline" import { getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideo" import { hslToHex } from "@/utils/hslToHex" -import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy } from "@/types" +import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, SegmentRenderer } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" import { TimelineCursorImpl } from "@/components/timeline/types" -import { sliceSegments } from "@/utils" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 3387f993..7ad07649 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -39,7 +39,8 @@ export { ClapTimelineTheme, ClapSegmentCategoryHues, ClapSegmentColorScheme, - RenderingStrategy + RenderingStrategy, + SegmentRenderer } from "./types" export { ClapTimeline } from "./ClapTimeline" diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index dd5f32cb..7af46d73 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -16,5 +16,6 @@ export { } from "./theme" export { - RenderingStrategy + RenderingStrategy, + SegmentRenderer } from "./rendering" \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/aitube-timeline/src/types/rendering.ts index 1f026788..7b6ad9b3 100644 --- a/packages/aitube-timeline/src/types/rendering.ts +++ b/packages/aitube-timeline/src/types/rendering.ts @@ -1,3 +1,4 @@ +import { ClapEntity, ClapSegment } from "@aitube/clap" export enum RenderingStrategy { @@ -22,3 +23,12 @@ export enum RenderingStrategy { // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ON_SCREEN_THEN_ALL = "ON_SCREEN_THEN_ALL", } + +export type SegmentRenderer = (params: { + segment: ClapSegment, + + // the slice to use for rendering + segments: ClapSegment[], + + entities: Record +}) => Promise \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index c499717b..5b6e2b2a 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -5,7 +5,7 @@ import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { TimelineCursorImpl } from "@/components/timeline/types" -import { RenderingStrategy } from "./rendering" +import { RenderingStrategy, SegmentRenderer } from "./rendering" export type Track = { id: number @@ -19,15 +19,6 @@ export type Track = { export type Tracks = Track[] -export type SegmentRenderer = (params: { - segment: ClapSegment, - - // the slice to use for rendering - segments: ClapSegment[], - - entities: Record -}) => Promise - export type TimelineStoreState = { // container width and height width: number From da24cf53173b481f49ed9a8521d4ba6613ddec1a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 5 Jun 2024 18:14:58 +0200 Subject: [PATCH 116/346] 0.0.11 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/ClapTimeline.tsx | 11 +- .../src/components/cells/Cell.tsx | 15 +- .../src/components/cells/RedrawButton.tsx | 14 +- .../src/components/cells/TextCell.tsx | 5 + .../components/controls/TimelineControls.tsx | 6 +- .../scroller/HorizontalScroller.tsx | 6 +- .../components/scroller/VerticalScroller.tsx | 2 +- .../src/components/timeline/Cells.tsx | 17 +- .../src/components/timeline/Cursor.tsx | 13 +- .../src/components/timeline/Grid.tsx | 31 +- .../components/timeline/LeftBarTrackScale.tsx | 14 +- .../src/components/timeline/Timeline.tsx | 31 +- .../components/timeline/TopBarTimeScale.tsx | 23 +- .../aitube-timeline/src/compute/README.md | 2 + .../src/compute/computeCellHeight.ts | 31 ++ .../src/compute/computeContentSizeMetrics.ts | 65 +++++ packages/aitube-timeline/src/demo.tsx | 2 +- packages/aitube-timeline/src/hooks/index.ts | 1 - packages/aitube-timeline/src/hooks/useAxis.ts | 13 +- .../src/hooks/useCursorGeometry.ts | 9 +- .../src/hooks/useHorizontalGridLines.ts | 16 +- .../src/hooks/useHorizontalTrackLines.ts | 6 +- .../src/hooks/useStandardTrackHeight.ts | 6 - .../src/hooks/useTimeScaleGraduations.ts | 8 +- .../src/hooks/useTimelineState.ts | 271 +++++++++--------- .../src/hooks/useVerticalGridLines.ts | 17 +- .../src/hooks/useVisibleSegments.ts | 6 +- packages/aitube-timeline/src/index.tsx | 1 - .../aitube-timeline/src/types/timeline.ts | 43 ++- .../src/utils/getDefaultState.ts | 75 ++--- .../src/utils/getTextLength.ts | 2 +- 32 files changed, 425 insertions(+), 339 deletions(-) create mode 100644 packages/aitube-timeline/src/compute/README.md create mode 100644 packages/aitube-timeline/src/compute/computeCellHeight.ts create mode 100644 packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts delete mode 100644 packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 297f6b98..ea682fbb 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.10", + "version": "0.0.11", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index e0a1cc46..7802f5b3 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -59,12 +59,15 @@ export function ClapTimeline({ // frameloop: DEFAULT_FRAMELOOP }) { const ref = useRef(null) + + const handleIsCreated = () => { + useTimelineState.setState({ isReady: true }) + } + return (
{({ height, width }: Size) => ( - // kids don't try this at home - useTimelineState.getState().setContainerSize({ width, height }),
{ const rect = ref.current?.getBoundingClientRect() if (!rect) { return } @@ -118,7 +123,7 @@ export function ClapTimeline({ zoomSpeed={zoomSpeed} zoomDampingFactor={zoomDampingFactor} /> - + {showFPS && } diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 14e2916f..65c98dfc 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -1,5 +1,5 @@ import { a } from "@react-spring/three" -import { ClapSegment } from "@aitube/clap" +import { ClapSegment, ClapSegmentCategory } from "@aitube/clap" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" @@ -19,7 +19,7 @@ export function Cell({ const getSegmentColorScheme = useTimelineState(s => s.getSegmentColorScheme) const colorScheme = getSegmentColorScheme(s) - const cellWidth = useTimelineState((s) => s.horizontalZoomLevel) + const cellWidth = useTimelineState((s) => s.cellWidth) const getCellHeight = useTimelineState((s) => s.getCellHeight) const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) @@ -86,6 +86,8 @@ export function Cell({ } else { setHoveredSegment(s) } + e.stopPropagation() + return false }} /* @@ -101,10 +103,17 @@ export function Cell({ onPointerLeave={(e) => { // console.log('leave') setHoveredSegment(undefined) + + e.stopPropagation() + return false }} - onClick={(e) => console.log('click')} + onClick={(e) => { + console.log('click on cell ' + s.id) + e.stopPropagation() + return false + }} onContextMenu={(e) => console.log('context menu')} onDoubleClick={(e) => console.log('double click')} // onWheel={(e) => console.log('wheel spins')} diff --git a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx index d8024180..9aee9101 100644 --- a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx +++ b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx @@ -17,9 +17,10 @@ export function RedrawButton({ durationInSteps: number }) { // const [isButtonHovered, setButtonHovered] = useState(false) - + const handleClick = () => { + console.log('hum?') + } return ( - <> { - useTimelineState().renderSegment(segment) + onClick={(e) => { + // console.log(`click on RedrawButton for segment ` + segment.id) + useTimelineState.getState().renderSegment(segment) + + e.stopPropagation() + return false }} > - ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 1f26f42a..519f5e46 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -138,6 +138,11 @@ export function TextCell({ // so you will have to change the "Arial" or "bold Arial" // in the function which computes a character's width fontWeight={400} + onClick={(e) => { + console.log('click on text in cell ' + s.id) + e.stopPropagation() + return false + }} > {lines.join("\n")} } diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index d2d9a8bd..ea2b92ef 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -31,13 +31,13 @@ export function TimelineControls({ useFrame(({ gl, scene, camera }) => { let { clap, - horizontalZoomLevel: cellWidth, + cellWidth, scrollX, scrollY, timelineCamera, timelineControls, timelineCursor, - maxHeight, + contentHeight, leftBarTrackScale, topBarTimelineScale, resizeStartedAt, @@ -60,8 +60,6 @@ export function TimelineControls({ scrollX = Math.max(-leftBarTrackScaleWidth, scrollX) const canvasHeight = size.height // * gl.getPixelRatio() - const contentHeight = maxHeight - // *------------------------* // | scrollY | diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx index f1d18165..374b7441 100644 --- a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -7,7 +7,7 @@ export function HorizontalScroller() { const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) const maxHorizontalZoomLevel = useTimelineState((s) => s.maxHorizontalZoomLevel) - const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) + const cellWidth = useTimelineState((s) => s.cellWidth) const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) if (!timelineCamera || !timelineControls) { return null } @@ -31,7 +31,6 @@ export function HorizontalScroller() { ] return ( - <>
handleTimelinePositionChange(newRange[0])} onWheel={(e) => { - handleZoomChange(horizontalZoomLevel + e.deltaY) + handleZoomChange(cellWidth + e.deltaY) }} />
- ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx index 89da0d43..4b64560a 100644 --- a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx @@ -7,7 +7,7 @@ export function VerticalScroller() { const timelineCamera = useTimelineState(s => s.timelineCamera) const timelineControls = useTimelineState(s => s.timelineControls) - const horizontalZoomLevel = useTimelineState((s) => s.horizontalZoomLevel) + const cellWidth = useTimelineState((s) => s.cellWidth) const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) // TODO: we want to control two things: diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index c0312f01..b679d1ba 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -9,15 +9,7 @@ import { import { Cell } from "@/components/cells" -export function Cells({ - width, - height -}: { - width: number - height: number -}) { - - const nbMaxTracks = DEFAULT_NB_TRACKS +export function Cells() { // refresh rate for the grid (high value == delay before we see the "hidden" cells) // this should be a fact of the number of segments, @@ -27,11 +19,12 @@ export function Cells({ // to avoid having to re-compute const refreshRateInMs = 500 + const contentHeight = useTimelineState(s => s.contentHeight) + // note: this one is async, so it creates a delay // we could cheat by detecting the cell width change and apply it // faster on the current geometries const visibleSegments = useVisibleSegments({ - nbMaxTracks, refreshRateInMs, }); @@ -45,7 +38,7 @@ export function Cells({ })) */ - // console.log(`re-rendering ${visibleSegments.length} `) + console.log(`re-rendering ${visibleSegments.length} `) return ( {visibleSegments.map((s) => diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx index d04c2674..6819887c 100644 --- a/packages/aitube-timeline/src/components/timeline/Cursor.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -7,16 +7,11 @@ import { import { useCursorGeometry } from "@/hooks/useCursorGeometry" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" -export function Cursor({ - width, - height -}: { - width: number - height: number -}) { +export function Cursor() { const setTimelineCursor = useTimelineState(s => s.setTimelineCursor) - const cursorGeometries = useCursorGeometry(); + const contentHeight = useTimelineState(s => s.contentHeight) + const cursorGeometries = useCursorGeometry() // console.log(`re-rendering `) @@ -25,7 +20,7 @@ export function Cursor({ { diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/aitube-timeline/src/components/timeline/Grid.tsx index 91533517..33d8ec2c 100644 --- a/packages/aitube-timeline/src/components/timeline/Grid.tsx +++ b/packages/aitube-timeline/src/components/timeline/Grid.tsx @@ -9,36 +9,23 @@ import { } from "@/hooks" import { hslToHex } from "@/utils" -import { NB_MAX_SHOTS } from "@/constants/grid" -export function Grid({ - width, - height -}: { - width: number - height: number -}) { +export function Grid() { const typicalSegmentDurationInSteps = useTimelineState(s => s.typicalSegmentDurationInSteps) + const contentHeight = useTimelineState(s => s.contentHeight) - const nbMaxShots = NB_MAX_SHOTS - const nbMaxTracks = DEFAULT_NB_TRACKS - const axis = useAxis(width, height) + const axis = useAxis() - const verticalGridLines = useVerticalGridLines({ - nbMaxShots, - }); - - const horizontalGridLines = useHorizontalGridLines({ - nbMaxShots, - }); + const verticalGridLines = useVerticalGridLines() + const horizontalGridLines = useHorizontalGridLines() // console.log(`re-rendering `) - + return ( <> - + {verticalGridLines.map((lineGeometry, idx) => ( - + {horizontalGridLines.map((lineGeometry, idx) => ( - + {axis.map((lineGeometry, idx) => ( `) + + const contentHeight = useTimelineState((s) => s.contentHeight) + const getCellHeight = useTimelineState((s) => s.getCellHeight) + const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) const tracks = useTimelineState(s => s.tracks) @@ -37,7 +35,7 @@ export function LeftBarTrackScale({ setLeftBarTrackScale(r) } }} - position={[-leftBarTrackScaleWidth, height / 2, -2]} + position={[-leftBarTrackScaleWidth, contentHeight / 2, -2]} > {horizontalTrackLines.map((lineGeometry, idx) => ( diff --git a/packages/aitube-timeline/src/components/timeline/Timeline.tsx b/packages/aitube-timeline/src/components/timeline/Timeline.tsx index 495a766f..a5dc9136 100644 --- a/packages/aitube-timeline/src/components/timeline/Timeline.tsx +++ b/packages/aitube-timeline/src/components/timeline/Timeline.tsx @@ -16,21 +16,16 @@ import { clamp } from "@/utils/clamp" import { LeftBarTrackScale } from "./LeftBarTrackScale" import { Cursor } from "./Cursor" -export function Timeline() { +export function Timeline({ width, height }: { width: number; height: number }) { const { size } = useThree() - // careful, this will update everytime the horizontal zoom level changes - // which can be intensive - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const setContainerSize = useTimelineState(s => s.setContainerSize) + useEffect(() => { + setContainerSize({ width, height }) + }, [width, height, setContainerSize]) - const nbMaxShots = NB_MAX_SHOTS - const nbMaxTracks = DEFAULT_NB_TRACKS - - // const aspect = size.width / viewport.width; - - const width = nbMaxShots * cellWidth - const height = getVerticalCellPosition(0, nbMaxTracks) + const contentHeight = useTimelineState(s => s.contentHeight) + const contentWidth = useTimelineState(s => s.contentWidth) // console.log(`re-rendering `) return ( @@ -42,7 +37,7 @@ export function Timeline() { position={[0,0,0]} > - - - - + + + + + ); diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index bdc7b2a0..0a99dfd9 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -14,28 +14,21 @@ import { useFrame, useThree } from "@react-three/fiber" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" -export function TopBarTimeScale({ - width, - height -}: { - width: number - height: number -}) { - const { size } = useThree() +export function TopBarTimeScale() { + // const { size } = useThree() // we should use the non-reactive version - const cellWidth = useTimelineState((s) => s.horizontalZoomLevel) + const cellWidth = useTimelineState((s) => s.cellWidth) // const cellWidth = useTimelineState.getState().horizontalZoomLevel + const contentWidth = useTimelineState((s) => s.contentWidth) + const contentHeight = useTimelineState((s) => s.contentHeight) const isResizing = useTimelineState(s => s.isResizing) - const nbMaxShots = NB_MAX_SHOTS - const unit = 10 // note: recomputing this is expensive and creates a visual delay const timeScaleGraduations = useTimeScaleGraduations({ - nbMaxShots, unit }); @@ -62,7 +55,7 @@ export function TopBarTimeScale({ setHorizontalZoomLevel( // Math.round( - useTimelineState.getState().horizontalZoomLevel + (wheelFactor * e.deltaY) + useTimelineState.getState().cellWidth + (wheelFactor * e.deltaY) // ) ) e.stopPropagation() @@ -72,9 +65,9 @@ export function TopBarTimeScale({ position={[0, 0, -1]}> { + contentHeight += computeCellHeight({ + trackNumber: track.id, + tracks, + defaultCellHeight, + defaultPreviewHeight + }) + return { + ...track, + contentHeight, + } + }) + return { + nbMaxShots, + nbMaxTracks, + nbIdentifiedTracks: newTracks.length, + contentWidth: nbMaxShots * cellWidth, + contentHeight, + tracks: newTracks, + cellWidth, + defaultCellHeight, + defaultSegmentDurationInSteps, + defaultSegmentLengthInPixels, + defaultMediaRatio, + defaultPreviewHeight, + } +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/demo.tsx b/packages/aitube-timeline/src/demo.tsx index bcde430a..85752c2f 100644 --- a/packages/aitube-timeline/src/demo.tsx +++ b/packages/aitube-timeline/src/demo.tsx @@ -10,7 +10,7 @@ root.render(
Hello
- +
); \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/aitube-timeline/src/hooks/index.ts index cfea2ba8..5beef493 100644 --- a/packages/aitube-timeline/src/hooks/index.ts +++ b/packages/aitube-timeline/src/hooks/index.ts @@ -1,6 +1,5 @@ export { useAxis } from "./useAxis" export { useVerticalGridLines } from "./useVerticalGridLines" export { useHorizontalGridLines } from "./useHorizontalGridLines" -export { useStandardTrackHeight } from "./useStandardTrackHeight" export { useTimelineState } from "./useTimelineState" export { useVisibleSegments } from "./useVisibleSegments" \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useAxis.ts b/packages/aitube-timeline/src/hooks/useAxis.ts index b1c79ec8..2384f20c 100644 --- a/packages/aitube-timeline/src/hooks/useAxis.ts +++ b/packages/aitube-timeline/src/hooks/useAxis.ts @@ -1,22 +1,23 @@ import { useEffect, useState } from "react" import * as THREE from "three" -import { useTimelineState } from "./useTimelineState"; +import { useTimelineState } from "./useTimelineState" -export const useAxis = (width: number, height: number) => { +export const useAxis = () => { const [axis, setAxis] = useState([] as THREE.BufferGeometry[]); - const maxHeight = useTimelineState(s => s.maxHeight) + const contentHeight = useTimelineState(s => s.contentHeight) + const contentWidth = useTimelineState(s => s.contentWidth) useEffect(() => { const horizontalTop = new THREE.BufferGeometry().setFromPoints([ new THREE.Vector3(0, 0, 1), - new THREE.Vector3(width, 0, 1) + new THREE.Vector3(contentWidth, 0, 1) ]); const vertical = new THREE.BufferGeometry().setFromPoints([ new THREE.Vector3(0, 0, 1), - new THREE.Vector3(0, -maxHeight, 1) + new THREE.Vector3(0, -contentHeight, 1) ]); /* @@ -28,7 +29,7 @@ export const useAxis = (width: number, height: number) => { setAxis([horizontalTop, vertical, //horizontalBottom ]); - }, [width, height]); + }, [contentWidth, contentHeight]); return axis; } \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts index 50c8ac14..ccb912c6 100644 --- a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts +++ b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts @@ -7,12 +7,11 @@ import { leftBarTrackScaleWidth } from "@/constants/themes"; export const useCursorGeometry = () => { - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const maxHeight = useTimelineState(s => s.maxHeight) - + const contentHeight = useTimelineState(s => s.contentHeight) + useEffect(() => { const thisLines = [] as THREE.BufferGeometry[]; @@ -20,7 +19,7 @@ export const useCursorGeometry = () => { for (let i = 0; i < 3; i++) { const verticalLinePoints = [ new THREE.Vector3(i, 60, 7), - new THREE.Vector3(i, -maxHeight, 7) + new THREE.Vector3(i, -contentHeight, 7) ]; const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); @@ -28,7 +27,7 @@ export const useCursorGeometry = () => { } setGridLines(thisLines); - }, [maxHeight, cellWidth]); + }, [contentHeight]); return gridlines; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts index fe8dbc6b..af2d251e 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts @@ -3,21 +3,15 @@ import * as THREE from "three" import { useTimelineState } from "./useTimelineState" -export const useHorizontalGridLines = ({ - nbMaxShots, -}: { - nbMaxShots: number -}) => { +export const useHorizontalGridLines = () => { - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const contentWidth = useTimelineState(s => s.contentWidth) const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) const tracks = useTimelineState(s => s.tracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const maxWidth = nbMaxShots * cellWidth - useEffect(() => { const thisLines = [] as THREE.BufferGeometry[]; @@ -25,7 +19,7 @@ export const useHorizontalGridLines = ({ for (let i = 0; i <= tracks.length; i++) { const horizontalLinePoints = [ new THREE.Vector3(0, -getVerticalCellPosition(0, i), 0), - new THREE.Vector3(maxWidth, -getVerticalCellPosition(0, i), 0) + new THREE.Vector3(contentWidth, -getVerticalCellPosition(0, i), 0) ]; const horizontalLineGeometry = new THREE.BufferGeometry().setFromPoints(horizontalLinePoints); @@ -34,9 +28,7 @@ export const useHorizontalGridLines = ({ setGridLines(thisLines); }, [ - cellWidth, - maxWidth, - nbMaxShots, + contentWidth, JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)), ]); diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts index f42f345e..b9bd7c45 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts @@ -5,7 +5,6 @@ import { useTimelineState } from "./useTimelineState" import { leftBarTrackScaleWidth } from "@/constants/themes" export const useHorizontaTrackLines = () => { - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) const tracks = useTimelineState(s => s.tracks) @@ -27,10 +26,7 @@ export const useHorizontaTrackLines = () => { } setLines(thisLines); - }, [ - cellWidth, - // maxWidth, - // nbMaxShots, + }, [, leftBarTrackScaleWidth, JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) ]); diff --git a/packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts b/packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts deleted file mode 100644 index 9384b331..00000000 --- a/packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PROMPT_STEP_HEIGHT_IN_PX } from "@/constants/grid" - -export function useStandardTrackHeight() { - - return PROMPT_STEP_HEIGHT_IN_PX -} diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts index 3497cd21..fbb7a384 100644 --- a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts +++ b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts @@ -7,16 +7,14 @@ import { useTimelineState } from "./useTimelineState" // maybe either we pre-compute everything and we let the runtime figure out what to render on screen, // or we implement our own code to do that.. I don't know export const useTimeScaleGraduations = ({ - nbMaxShots, unit }: { - nbMaxShots: number unit: number }) => { - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const cellWidth = useTimelineState(s => s.cellWidth) + const nbMaxShots = useTimelineState(s => s.nbMaxShots) const [timeScaleGraduations, setTimeScaleGraduations] = useState([] as THREE.BufferGeometry[]); - const maxHeight = useTimelineState(s => s.maxHeight) const bigTickHeight = 12 const smallTickHeight = 8 @@ -84,7 +82,7 @@ export const useTimeScaleGraduations = ({ } setTimeScaleGraduations(lines); - }, [maxHeight, cellWidth, nbMaxShots]); + }, [cellWidth, nbMaxShots]); return timeScaleGraduations; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 13d47ff3..7a507309 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -3,8 +3,8 @@ import * as THREE from "three" import { ClapEntity, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, newClap, serializeClap } from "@aitube/clap" import { TimelineStore, Tracks } from "@/types/timeline" -import { getDefaultState } from "@/utils/getDefaultState" -import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" +import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" +import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideo" import { hslToHex } from "@/utils/hslToHex" import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, SegmentRenderer } from "@/types" @@ -12,17 +12,23 @@ import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" import { TimelineCursorImpl } from "@/components/timeline/types" +import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" export const useTimelineState = create((set, get) => ({ ...getDefaultState(), setClap: async (clap?: ClapProject) => { + + // this re-initialize everything that is related to the current .clap project + set({ + ...getDefaultProjectState() + }) + if (!clap || !Array.isArray(clap?.segments)) { - console.log(`useTimelineState: empty clap, so resetting`) - set({ - ...getDefaultState() - }) + console.log(`useTimelineState: no clap to show`) return } + + (window as any).useTimelineState = useTimelineState set({ isLoading: true }) @@ -30,23 +36,11 @@ export const useTimelineState = create((set, get) => ({ // we remove the big/long video const segments = removeFinalVideos(clap) - const { horizontalZoomLevel, getCellHeight, getVerticalCellPosition } = get() - const cellWidth = horizontalZoomLevel - - let typicalSegmentDurationInSteps = DEFAULT_COLUMNS_PER_SLICE * DEFAULT_DURATION_IN_MS_PER_STEP - const typicalSegmentLengthInPixels = cellWidth * typicalSegmentDurationInSteps - - // TODO: compute the exact image ratio instead of using the media orientation, - // since it might not match the actual assets - const ratio = (clap.meta?.width || 640) / (clap.meta?.height || 480) - - // also storyboards and videos might have different sizes / ratios - const previewHeight = Math.round( - typicalSegmentLengthInPixels / ratio - ) - - const defaultCellHeight = PROMPT_STEP_HEIGHT_IN_PX + const { + defaultCellHeight, + cellWidth, + } = get() // TODO: many of those checks about average duration, nb of tracks, collisions... // should be done by the Clap parser and/or serializer @@ -56,6 +50,53 @@ export const useTimelineState = create((set, get) => ({ let tracks: Tracks = [] + let defaultSegmentDurationInSteps = get().defaultSegmentDurationInSteps + + // TODO: this whole approach is a bit weak, + // having an heuristic is okay but we should do it: + // track by track + // for each track, count length occurrences to keep the most recurring one + // do something for images/videos that don't have the right ratio, + // eg. add black banding + for (const s of segments) { + if (s.category === ClapSegmentCategory.CAMERA) { + const durationInSteps = ( + (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP + ) + // TODO: we should do this row by row + // and look at the most recurring duration, + // using a table + defaultSegmentDurationInSteps = durationInSteps + break + } + } + + const defaultSegmentLengthInPixels = cellWidth * defaultSegmentDurationInSteps + + // TODO: compute the exact image ratio instead of using the media orientation, + // since it might not match the actual assets + const defaultMediaRatio = clap ? ( + (clap.meta.width || 896) / (clap.meta.height || 512) + ) : (896 / 512) + + // also storyboards and videos might have different sizes / ratios + const defaultPreviewHeight = Math.round( + defaultSegmentLengthInPixels / defaultMediaRatio + ) + + /* + console.log("WTF:", JSON.parse(JSON.stringify({ + defaultSegmentDurationInSteps, + cellWidth, + defaultPreviewHeight, + defaultCellHeight, + "clap.meta.width": clap.meta.width, + "(clap.meta.height": clap.meta.height, + defaultSegmentLengthInPixels, + defaultMediaRatio + }))) + */ + for (const s of segments) { if (idCollisionDetector.has(s.id)) { @@ -68,6 +109,7 @@ export const useTimelineState = create((set, get) => ({ const isPreview = s.category === ClapSegmentCategory.STORYBOARD || s.category === ClapSegmentCategory.VIDEO + tracks[s.track] = { id: s.track, // name: `Track ${s.track}`, @@ -75,7 +117,7 @@ export const useTimelineState = create((set, get) => ({ isPreview, height: isPreview - ? previewHeight + ? defaultPreviewHeight : defaultCellHeight, hue: 0, occupied: true, @@ -105,7 +147,7 @@ export const useTimelineState = create((set, get) => ({ const durationInSteps = ( (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP ) - typicalSegmentDurationInSteps = durationInSteps + defaultSegmentDurationInSteps = durationInSteps } } @@ -117,7 +159,7 @@ export const useTimelineState = create((set, get) => ({ id, name: `(empty)`, isPreview: false, - height: PROMPT_STEP_HEIGHT_IN_PX, + height: defaultCellHeight, hue: 0, occupied: false, // <-- setting this to false is the important part visible: true, @@ -129,49 +171,49 @@ export const useTimelineState = create((set, get) => ({ const isEmpty = segments.length === 0 - const nbIdentifiedTracks = tracks.length - const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) - - /* - // by default the buffer ("visibleSegments") will be empty, - // waiting for some user interactions - // we bootstrap it by giving it a pre-filtered list of segments - // - // TODO: we should move those computations to useVisibleSegments instead - const howManyCellsAreVisible = (get().width / horizontalZoomLevel) + 10 - const beforeTimeInMs = howManyCellsAreVisible * DEFAULT_DURATION_IN_MS_PER_STEP - - const visibleSegments = await sliceSegments({ - segments, - afterTimeInMs: 0, - beforeTimeInMs, - visibleSegments: [] - }) - */ + const visibleSegments: ClapSegment[] = [] set({ - ...getDefaultState(), clap, segments, visibleSegments, segmentsChanged: 1, - tracks, - maxHeight, - nbIdentifiedTracks, - typicalSegmentDurationInSteps, + isEmpty, isLoading: false, finalVideo, + + ...computeContentSizeMetrics({ + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + }) }) }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { - const { minHorizontalZoomLevel, maxHorizontalZoomLevel } = get() - const horizontalZoomLevel = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) + const { + minHorizontalZoomLevel, + maxHorizontalZoomLevel, + clap, + tracks, + defaultSegmentDurationInSteps, + } = get() + const cellWidth = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) + + const resizeStartedAt = performance.now() + const isResizing = true + set({ - horizontalZoomLevel, - resizeStartedAt: performance.now(), - isResizing: true, + resizeStartedAt, + isResizing, + ...computeContentSizeMetrics({ + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + }) }) }, @@ -181,58 +223,21 @@ export const useTimelineState = create((set, get) => ({ setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, getCellHeight: (trackNumber?: number): number => { - const defaultCellHeight = PROMPT_STEP_HEIGHT_IN_PX - let cellHeight = defaultCellHeight - - const { - clap, - horizontalZoomLevel, - tracks, - typicalSegmentDurationInSteps - } = get() - - if (!clap) { return cellHeight } - - const cellWidth = horizontalZoomLevel - - const typicalSegmentLengthInPixels = cellWidth * typicalSegmentDurationInSteps - - // TODO: compute the exact image ratio instead of using the media orientation, - // since it might not match the actual assets - const ratio = clap.meta.width / clap.meta.height - - // also storyboards and videos might have different sizes / ratios - const previewHeight = Math.round( - typicalSegmentLengthInPixels / ratio - ) - - if (typeof trackNumber === "number" && !isNaN(trackNumber) && isFinite(trackNumber)) { - const track = tracks[trackNumber] - if (track) { - cellHeight = - track.isPreview && track.visible - ? previewHeight - : track.visible - ? track.height - : defaultCellHeight - } else { - // missing data - } - } - - return cellHeight + const { defaultCellHeight, tracks } = get() + const track = tracks[trackNumber!] + return track?.height || defaultCellHeight }, - getVerticalCellPosition: (start: number, end: number): number => { - const { getCellHeight } = get() - + const { defaultCellHeight, tracks } = get() let height = 0 for (let i = start; i < end; i++) { - height += getCellHeight(i) + const track = tracks[i!] + height += track?.height || defaultCellHeight } return height }, + getSegmentColorScheme: (segment?: ClapSegment): ClapSegmentColorScheme => { const { theme } = get() @@ -314,36 +319,42 @@ export const useTimelineState = create((set, get) => ({ }, toggleTrackVisibility: (trackId: number) => { const { - tracks: oldTracks, - getCellHeight, - getVerticalCellPosition + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, } = get() - const tracks = oldTracks.map(t => ( - t.id === trackId - ? { ...t, visible: !t.visible } - : t - )) - - const maxHeight = getCellHeight() + getVerticalCellPosition(0, tracks.length) - set({ - tracks, - maxHeight, + ...computeContentSizeMetrics({ + clap, + tracks: tracks.map(t => ( + t.id === trackId + ? { ...t, visible: !t.visible } + : t + )), + cellWidth, + defaultSegmentDurationInSteps + }) }) }, setContainerSize: ({ width, height }: { width: number; height: number }) => { - - const { tracks, getCellHeight, getVerticalCellPosition } = get() - - const nbIdentifiedTracks = tracks.length - const maxHeight = getCellHeight() + getVerticalCellPosition(0, nbIdentifiedTracks) - set({ width, height, resizeStartedAt: performance.now(), isResizing: true, + /* + + changing the *container* size has absolutely no impact on the content + + ...computeContentSizeMetrics({ + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps + }) + */ }) }, setTimelineCursor: (timelineCursor?: TimelineCursorImpl) => { @@ -407,23 +418,19 @@ export const useTimelineState = create((set, get) => ({ }) }, setSegmentRenderer: (segmentRenderer: SegmentRenderer) => { - const defaultSegmentRenderer: SegmentRenderer = ( params: { - segment: ClapSegment, - - // the slice to use for rendering - segments: ClapSegment[], - - entities: Record - }) => Promise.resolve(params.segment) - - set({ - segmentRenderer: (segmentRenderer || defaultSegmentRenderer) - }) + set({ segmentRenderer }) }, - renderSegment: async (segment: ClapSegment) => { + renderSegment: async (segment: ClapSegment): Promise => { const { segmentRenderer, clap, segments } = get() - return segmentRenderer({ + // console.log("useTimelineState.renderSegment(): calling user-provided segmentRenderer", segmentRenderer) + + if (!segmentRenderer) { + return segment + // throw new Error(`please call setSegmentRender(...) first`) + } + + const result = await segmentRenderer({ segment, // the slice to use for rendering @@ -434,5 +441,7 @@ export const useTimelineState = create((set, get) => ({ // to optimize the payload size entities: clap?.entityIndex || {}, }) + + return result }, })) diff --git a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts index 00d054c0..8eacd63c 100644 --- a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts @@ -2,18 +2,15 @@ import { useEffect, useState } from "react" import * as THREE from "three" import { useTimelineState } from "./useTimelineState" +import { NB_MAX_SHOTS } from "@/constants/grid" -export const useVerticalGridLines = ({ - nbMaxShots, -}: { - nbMaxShots: number -}) => { - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) +export const useVerticalGridLines = () => { + const cellWidth = useTimelineState(s => s.cellWidth) + const contentHeight = useTimelineState(s => s.contentHeight) const tracks = useTimelineState(s => s.tracks) - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const maxHeight = useTimelineState(s => s.maxHeight) + const nbMaxShots = useTimelineState(s => s.nbMaxShots) useEffect(() => { @@ -22,7 +19,7 @@ export const useVerticalGridLines = ({ for (let i = 0; i < nbMaxShots; i++) { const verticalLinePoints = [ new THREE.Vector3(i * cellWidth, 0, 0), - new THREE.Vector3(i * cellWidth, -getVerticalCellPosition(0, tracks.length), 0) + new THREE.Vector3(i * cellWidth, -contentHeight, 0) ]; const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); @@ -31,7 +28,7 @@ export const useVerticalGridLines = ({ setGridLines(thisLines); }, [ - maxHeight, + contentHeight, cellWidth, nbMaxShots, JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts index 28178066..8afaeb8f 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useVisibleSegments.ts @@ -9,10 +9,8 @@ import { similar, sliceSegments } from "@/utils" import { useTimelineState } from "./useTimelineState" export const useVisibleSegments = ({ - nbMaxTracks, refreshRateInMs, }: { - nbMaxTracks: number refreshRateInMs: number }): ClapSegment[] => { // to make it react to screen width change @@ -36,7 +34,7 @@ export const useVisibleSegments = ({ // we do a little trick here, to put the camera zoom inside our Zustand store const camera = useThree(({ camera }) => camera) - const cellWidth = useTimelineState(s => s.horizontalZoomLevel) + const cellWidth = useTimelineState(s => s.cellWidth) const getCellHeight = useTimelineState(s => s.getCellHeight) // const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) // note: only the average height change will be detected @@ -138,7 +136,7 @@ export const useVisibleSegments = ({ // by useTimelineState.getState() const state = stateRef.current - const cellWidth = useTimelineState.getState().horizontalZoomLevel + const cellWidth = useTimelineState.getState().cellWidth // we can adjust this threshold to only re compute the geometry // when a significant shift has been done by the user diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 7ad07649..c613fd61 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -15,7 +15,6 @@ export { export { useAxis, - useStandardTrackHeight, useTimelineState, useVisibleSegments } from "./hooks" diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 5b6e2b2a..3f9ae1ff 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -19,7 +19,27 @@ export type Track = { export type Tracks = Track[] +export type ContentSizeMetrics = { + nbMaxShots: number + nbMaxTracks: number + nbIdentifiedTracks: number + contentWidth: number + contentHeight: number + tracks: Tracks + cellWidth: number + defaultCellHeight: number + defaultSegmentDurationInSteps: number + defaultSegmentLengthInPixels: number + defaultMediaRatio: number + defaultPreviewHeight: number +} + export type TimelineStoreState = { + // used to track the timeline state + // this helps informing parent app user + // that the timeline has been recreated inside the React tree for instance + isReady: boolean + // container width and height width: number height: number @@ -35,11 +55,22 @@ export type TimelineStoreState = { isEmpty: boolean isLoading: boolean + // -- metrics computed by computeContentSizeMetrics -- + nbMaxShots: number + nbMaxTracks: number + contentWidth: number + contentHeight: number tracks: Tracks + cellWidth: number + defaultCellHeight: number + defaultSegmentDurationInSteps: number + defaultSegmentLengthInPixels: number + defaultMediaRatio: number + defaultPreviewHeight: number + // ------------------------------------------------- minHorizontalZoomLevel: number maxHorizontalZoomLevel: number - horizontalZoomLevel: number originalHorizontalZoomLevel: number position: THREE.Vector3 @@ -48,9 +79,6 @@ export type TimelineStoreState = { beforeSteps: number afterSteps: number timeout: NodeJS.Timeout - cellHeight: number - cellWidth: number - nbMaxTracks: number typicalSegmentDurationInSteps: number @@ -77,9 +105,6 @@ export type TimelineStoreState = { // ref to the cursor element timelineCursor?: TimelineCursorImpl - // max height of the timeline - maxHeight: number - // used to track current camera position, at zoom level 1.0 scrollX: number scrollY: number @@ -102,7 +127,7 @@ export type TimelineStoreState = { storyboardRenderingStrategy: RenderingStrategy videoRenderingStrategy: RenderingStrategy - segmentRenderer: SegmentRenderer + segmentRenderer?: SegmentRenderer } @@ -112,7 +137,7 @@ export type TimelineStoreModifiers = { setSegments: (segments?: ClapSegment[]) => void setVisibleSegments: (visibleSegments?: ClapSegment[]) => void getCellHeight: (trackNumber?: number) => number - getVerticalCellPosition: (start: number,end: number) => number + getVerticalCellPosition: (start: number, end: number) => number getSegmentColorScheme: (segment?: ClapSegment) => ClapSegmentColorScheme setHoveredSegment: (hoveredSegment?: ClapSegment) => void setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => void diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index eb8c4fbc..44547f5b 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -1,28 +1,22 @@ import * as THREE from "three" - import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { TimelineStoreState } from "@/types/timeline" import { RenderingStrategy } from "@/types" -import { ClapEntity, ClapSegment } from "@aitube/clap" +import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, NB_MAX_SHOTS } from "@/constants/grid" -export function getDefaultState(): TimelineStoreState { +// those settings will change between .clap project reloads +export function getDefaultProjectState() { return { - width: 800, - height: 600, clap: undefined, - theme: pastel, segments: [], segmentsChanged: 0, visibleSegments: [], - nbIdentifiedTracks: 0, isEmpty: true, isLoading: false, - - tracks: [], - + position: new THREE.Vector3(), scale: new THREE.Vector3(), initialized: false, @@ -32,51 +26,58 @@ export function getDefaultState(): TimelineStoreState { minHorizontalZoomLevel: 6, maxHorizontalZoomLevel: 100, - - // horizontalZoomLevel is the WIDTH of a grid cell, in pixels - // by initializing it with PROMPT_STEP_HEIGHT_IN_PX (the default grid cell HEIGHT in pixels) - // we can achieve a square shape - horizontalZoomLevel: PROMPT_STEP_HEIGHT_IN_PX, originalHorizontalZoomLevel: PROMPT_STEP_HEIGHT_IN_PX, - cellHeight: PROMPT_STEP_HEIGHT_IN_PX, - - // @deprecated - cellWidth: PROMPT_STEP_HEIGHT_IN_PX, - + nbMaxShots: NB_MAX_SHOTS, nbMaxTracks: DEFAULT_NB_TRACKS, - + nbIdentifiedTracks: 0, + contentWidth: 1024, + contentHeight: 800, + cellWidth: PROMPT_STEP_HEIGHT_IN_PX, + tracks: [], + defaultCellHeight: PROMPT_STEP_HEIGHT_IN_PX, + defaultSegmentDurationInSteps: 4, + defaultSegmentLengthInPixels: 4 * PROMPT_STEP_HEIGHT_IN_PX, + defaultMediaRatio: 896 / 512, + defaultPreviewHeight: PROMPT_STEP_HEIGHT_IN_PX, typicalSegmentDurationInSteps: 4, - currentZoomLevel: 1.0, + // @deprecated, we now use a static WebGL camera zoom level set at 1.0 + currentZoomLevel: 1.0, hoveredSegment: undefined, - timelineControls: undefined, - maxHeight: 32, - scrollX: 0, scrollY: 450, resizeStartedAt: 0, isResizing: false, - topBarTimelineScale: undefined, - leftBarTrackScale: undefined, - finalVideo: undefined, cursorTimestampAt: 0, - timelineCursor: undefined, + } +} +// those settings will NOT changes between .clap project reloads +export function getDefaultPreferencesState() { + return { + isReady: false, + width: 1024, + height: 800, + theme: pastel, + timelineControls: undefined, + topBarTimelineScale: undefined, + leftBarTrackScale: undefined, + timelineCursor: undefined, storyboardRenderingStrategy: RenderingStrategy.ON_DEMAND, videoRenderingStrategy: RenderingStrategy.ON_DEMAND, - segmentRenderer: (params: { - segment: ClapSegment, - - // the slice to use for rendering - segments: ClapSegment[], - - entities: Record - }) => Promise.resolve(params.segment), + segmentRenderer: undefined, + } +} + +export function getDefaultState(): TimelineStoreState { + return { + ...getDefaultProjectState(), + ...getDefaultPreferencesState(), } } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/aitube-timeline/src/utils/getTextLength.ts index caedc9fd..bb3463ca 100644 --- a/packages/aitube-timeline/src/utils/getTextLength.ts +++ b/packages/aitube-timeline/src/utils/getTextLength.ts @@ -43,7 +43,7 @@ const webglFontWidthFactor = 1.7 */ export function getWebGLCharWidth(char: string = ""): number { - const cellWidthInPixels = useTimelineState.getState().horizontalZoomLevel + const cellWidthInPixels = useTimelineState.getState().cellWidth let responsiveHack = 1.5 From fac9ef8d0299e9d14dc9bf9690fe1e4708862484 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 6 Jun 2024 02:16:14 +0200 Subject: [PATCH 117/346] 0.0.12 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/Cell.tsx | 23 +++++++ .../src/components/cells/ImageCell.tsx | 39 ++++++++---- .../src/components/cells/RedrawButton.tsx | 61 +++++++++++++++---- .../src/components/cells/TextCell.tsx | 12 ---- .../src/components/cells/VideoCell.tsx | 8 --- .../src/hooks/useTimelineState.ts | 23 +++++-- 7 files changed, 121 insertions(+), 47 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index ea682fbb..e732450b 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.11", + "version": "0.0.12", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 65c98dfc..67993982 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -9,6 +9,8 @@ import { TextCell } from "./TextCell" import { useTimelineState } from "@/hooks" import { useHoveredSegment } from "@/hooks/useHoveredSegment" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" +import { RedrawButton } from "./RedrawButton" +import { Suspense } from "react" export function Cell({ segment: s @@ -126,6 +128,7 @@ export function Cell({ // onPointerMissed={() => console.log('missed')} // onUpdate={(self) => console.log('props have been updated')} > +
}> + + {(s.category === ClapSegmentCategory.STORYBOARD + || s.category === ClapSegmentCategory.VIDEO) + && } ) } diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/aitube-timeline/src/components/cells/ImageCell.tsx index 716a5380..09883c0a 100644 --- a/packages/aitube-timeline/src/components/cells/ImageCell.tsx +++ b/packages/aitube-timeline/src/components/cells/ImageCell.tsx @@ -1,9 +1,8 @@ import { Circle, Image, Text } from "@react-three/drei" -import { useThree } from "@react-three/fiber" +import { invalidate, useThree } from "@react-three/fiber" import { useSpring, a, animated, config } from "@react-spring/three" import { SpecializedCellProps } from "./types" -import { RedrawButton } from "./RedrawButton" export function ImageCell({ segment: s, @@ -17,8 +16,34 @@ export function ImageCell({ isResizing, track, }: SpecializedCellProps) { + // const ref = useRef, Material | Material[], Object3DEventMap>>(null) + + /* + const renderSegment = useTimelineState(s => s.renderSegment) + + const [inProgress, setInProgress] = useState(false) + // const [isButtonHovered, setButtonHovered] = useState(false) + const onRender = async () => { + setInProgress(true) + try { + // console.log(`click on RedrawButton for segment ` + segment.id) + const segment = await renderSegment(s) + if (ref.current) { + // update the image src + } + + // note that this will poison-pill the current + invalidate() + // ref.current.url + } catch (err) { + + } finally { + setInProgress(false) + } + } + */ + return ( - <> - - ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx index 9aee9101..0aff7a2e 100644 --- a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx +++ b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx @@ -1,7 +1,8 @@ +import { useTimelineState } from "@/hooks" import { ClapSegment } from "@aitube/clap" import { Circle, Text } from "@react-three/drei" - -import { useTimelineState } from "@/hooks" +import { invalidate } from "@react-three/fiber" +import { useState, useTransition } from "react" export function RedrawButton({ segment, @@ -9,22 +10,52 @@ export function RedrawButton({ cellHeight, isHovered, durationInSteps, + // isBusy, + // onClick, }: { segment: ClapSegment cellWidth: number cellHeight: number isHovered: boolean durationInSteps: number + // isBusy: boolean + // onClick: () => void }) { + const [_isPending, startTransition] = useTransition() + const renderSegment = useTimelineState(s => s.renderSegment) + + const [inProgress, setInProgress] = useState(false) // const [isButtonHovered, setButtonHovered] = useState(false) - const handleClick = () => { - console.log('hum?') + + const onRender = async () => { + startTransition(() => { + setInProgress(true) + }) + try { + // console.log(`click on RedrawButton for segment ` + segment.id) + const newSegment = await renderSegment(segment) + // if (ref.current) { + // update the image src + // } + + // note that this will poison-pill the current + invalidate() + + // ref.current.url + } catch (err) { + + } finally { + startTransition(() => { + setInProgress(false) + }) + } } + return ( { - // console.log(`click on RedrawButton for segment ` + segment.id) - useTimelineState.getState().renderSegment(segment) - + if (!inProgress) { + onRender() + } e.stopPropagation() return false }} @@ -42,7 +73,7 @@ export function RedrawButton({ - 🎲 + {inProgress ? '🕓' : '🎲'} + {/* + also for a smoother animation, + we should pre-render everything, and use opacity to switch between + the states I think + + to create a "loader" we can also use this: + 🕛🕐🕑🕒🕓🕓🕔🕧🕖🕗🕘🕚 + */} ) diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 519f5e46..d7c80809 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -4,10 +4,6 @@ import { useSpring, a, animated, config } from "@react-spring/three" import { clampWebGLText } from "@/utils" import { SpecializedCellProps } from "./types" -import { useThree } from "@react-three/fiber" -import { useTimelineState } from "@/hooks" -import { RedrawButton } from "./RedrawButton" -import { ClapSegmentCategory } from "@aitube/clap" export function TextCell({ segment: s, @@ -147,14 +143,6 @@ export function TextCell({ {lines.join("\n")} } - {(s.category === ClapSegmentCategory.STORYBOARD || s.category === ClapSegmentCategory.VIDEO) - ? : null} ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/VideoCell.tsx b/packages/aitube-timeline/src/components/cells/VideoCell.tsx index bae3f8b1..bbe3e221 100644 --- a/packages/aitube-timeline/src/components/cells/VideoCell.tsx +++ b/packages/aitube-timeline/src/components/cells/VideoCell.tsx @@ -3,7 +3,6 @@ import * as THREE from "three" import { useSpring, a, animated, config } from "@react-spring/three" import { SpecializedCellProps } from "./types" -import { RedrawButton } from "./RedrawButton" export function VideoCell({ segment: s, @@ -65,13 +64,6 @@ export function VideoCell({ - ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 7a507309..a3336470 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -423,14 +423,19 @@ export const useTimelineState = create((set, get) => ({ renderSegment: async (segment: ClapSegment): Promise => { const { segmentRenderer, clap, segments } = get() - // console.log("useTimelineState.renderSegment(): calling user-provided segmentRenderer", segmentRenderer) - if (!segmentRenderer) { return segment // throw new Error(`please call setSegmentRender(...) first`) } - const result = await segmentRenderer({ + const { + id, + assetUrl, + assetDurationInMs, + assetFileFormat, + assetSourceType, + status + } = await segmentRenderer({ segment, // the slice to use for rendering @@ -442,6 +447,16 @@ export const useTimelineState = create((set, get) => ({ entities: clap?.entityIndex || {}, }) - return result + // note: this actually modifies the old object in-place + const newSegment = Object.assign(segment, { + id, + assetUrl, + assetDurationInMs, + assetFileFormat, + assetSourceType, + status + }) + + return newSegment }, })) From 8c4eb908c3174409147f4ccc7582e8ba90d4d384 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 6 Jun 2024 19:42:23 +0200 Subject: [PATCH 118/346] add support for fal.ai storyboards --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/TextCell.tsx | 15 +++++- .../aitube-timeline/src/constants/index.ts | 4 +- .../src/hooks/useTimelineState.ts | 20 ++++++-- packages/aitube-timeline/src/index.tsx | 33 ++++++++++-- .../aitube-timeline/src/types/rendering.ts | 4 +- .../aitube-timeline/src/types/timeline.ts | 1 + .../src/utils/findFreeTrack.ts | 50 +++++++++++++++++++ packages/aitube-timeline/src/utils/index.ts | 12 ++++- ...moveFinalVideo.ts => removeFinalVideos.ts} | 0 10 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 packages/aitube-timeline/src/utils/findFreeTrack.ts rename packages/aitube-timeline/src/utils/{removeFinalVideo.ts => removeFinalVideos.ts} (100%) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index e732450b..0d67d0be 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.12", + "version": "0.0.14", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index d7c80809..3519404d 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -1,4 +1,4 @@ -import { RoundedBox, Text } from "@react-three/drei" +import { GradientTexture, RoundedBox, Text } from "@react-three/drei" import { useSpring, a, animated, config } from "@react-spring/three" import { clampWebGLText } from "@/utils" @@ -69,7 +69,18 @@ export function TextCell({ } // transparent // opacity={} - /> + > + {/* + TODO: yes this is cool, but also expensive + we should re-use the geometries and textures + to be able to do something like this + + */} + {/* ((set, get) => ({ ...getDefaultState(), @@ -423,11 +424,12 @@ export const useTimelineState = create((set, get) => ({ renderSegment: async (segment: ClapSegment): Promise => { const { segmentRenderer, clap, segments } = get() - if (!segmentRenderer) { + if (!segmentRenderer || !clap) { return segment // throw new Error(`please call setSegmentRender(...) first`) } + console.log("going to use clap meta:", clap.meta) const { id, assetUrl, @@ -444,7 +446,9 @@ export const useTimelineState = create((set, get) => ({ // TODO OPTIMIZATION: // we should filter the entities here, // to optimize the payload size - entities: clap?.entityIndex || {}, + entities: clap.entityIndex || {}, + + meta: clap.meta }) // note: this actually modifies the old object in-place @@ -459,4 +463,14 @@ export const useTimelineState = create((set, get) => ({ return newSegment }, + findFreeTrack: ({ + startTimeInMs, + endTimeInMs + }: { + startTimeInMs?: number + endTimeInMs?: number + }): number => { + const { segments } = get() + return findFreeTrack({ segments, startTimeInMs, endTimeInMs }) + } })) diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index c613fd61..bf19e599 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -10,24 +10,49 @@ export { ImageCell, VideoCell, TextCell, - SpecializedCellProps + type SpecializedCellProps } from "./components" +export { + DEFAULT_DURATION_IN_MS_PER_STEP, + DEFAULT_NB_TRACKS, + DEFAULT_COLUMNS_PER_SLICE, + PROMPT_STEP_HEIGHT_IN_PX, + PREVIEW_STEP_HEIGHT_IN_PX, + NB_MAX_SHOTS, + baseClapSegmentCategoryHues, + pastel, + DEFAULT_THEMES, +} from "./constants" + export { useAxis, + useVerticalGridLines, + useHorizontalGridLines, useTimelineState, - useVisibleSegments + useVisibleSegments, } from "./hooks" export { + clamp, cn, + debounceAsync, + debounceSync, + findFreeTrack, + formatTimestamp, + getDefaultState, + getFinalVideo, getWebGLCharWidth, getWebGLTextWidth, clampWebGLText, clampWebGLTextNaive, + hslToHex, + parseRenderingStrategy, + removeFinalVideos, similar, + sleep, sliceSegments, - parseRenderingStrategy + throttle } from "./utils" export { @@ -39,7 +64,7 @@ export { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, - SegmentRenderer + type SegmentRenderer } from "./types" export { ClapTimeline } from "./ClapTimeline" diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/aitube-timeline/src/types/rendering.ts index 7b6ad9b3..24d8a81c 100644 --- a/packages/aitube-timeline/src/types/rendering.ts +++ b/packages/aitube-timeline/src/types/rendering.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapSegment } from "@aitube/clap" +import { ClapEntity, ClapMeta, ClapSegment } from "@aitube/clap" export enum RenderingStrategy { @@ -31,4 +31,6 @@ export type SegmentRenderer = (params: { segments: ClapSegment[], entities: Record + + meta: ClapMeta }) => Promise \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 3f9ae1ff..bd1ed614 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -168,6 +168,7 @@ export type TimelineStoreModifiers = { setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => void setSegmentRenderer: (segmentRenderer: SegmentRenderer) => void renderSegment: (segment: ClapSegment) => Promise + findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/findFreeTrack.ts b/packages/aitube-timeline/src/utils/findFreeTrack.ts new file mode 100644 index 00000000..6803744d --- /dev/null +++ b/packages/aitube-timeline/src/utils/findFreeTrack.ts @@ -0,0 +1,50 @@ +import { DEFAULT_NB_TRACKS } from "@/constants" +import { ClapSegment, isValidNumber } from "@aitube/clap" + +// search in an array of segment for the first available track, within a given range +export function findFreeTrack({ + segments = [], + startTimeInMs = 0, + endTimeInMs = Number.MAX_SAFE_INTEGER, +}: { + segments: ClapSegment[] + startTimeInMs?: number + endTimeInMs?: number +}): number { + // identify any occurence of a segment being in our desired range + const collisions: ClapSegment[] = segments.filter(segment => { + if ( + ((startTimeInMs <= segment.startTimeInMs) || (startTimeInMs < segment.endTimeInMs)) + && + ((endTimeInMs < segment.startTimeInMs) || (endTimeInMs <= segment.endTimeInMs)) + ) return false + return true + }) + + const MIN_TRACK_NUMBER = 1 + + // trivial case: no collision! + if (!collisions.length) { + return MIN_TRACK_NUMBER // let's assign the uppermost track by default + } + + // identify all the used tracks (note: some tracks might be empty) + const occupiedTracks: number[] = Object.keys( + collisions.reduce((acc, segment) => ({ + ...acc, + [segment.track]: true + }), {} as Record) + ).map(key => Number(key)).sort((a, b) => a - b) + + // TODO: those constants should be dynamic + let freeTrack = DEFAULT_NB_TRACKS - 1 + + for (let trackNumber = MIN_TRACK_NUMBER; trackNumber < (DEFAULT_NB_TRACKS - 1); trackNumber++) { + if (!occupiedTracks.includes(trackNumber)) { + freeTrack = trackNumber + break + } + } + + return freeTrack +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts index 1581fb4f..86ae4839 100644 --- a/packages/aitube-timeline/src/utils/index.ts +++ b/packages/aitube-timeline/src/utils/index.ts @@ -1,4 +1,11 @@ +export { clamp } from "./clamp" export { cn } from "./cn" +export { debounceAsync } from "./debounceAsync" +export { debounceSync } from "./debounceSync" +export { findFreeTrack } from "./findFreeTrack" +export { formatTimestamp } from "./formatTimestamp" +export { getDefaultState } from "./getDefaultState" +export { getFinalVideo } from "./getFinalVideo" export { getWebGLCharWidth, getWebGLTextWidth, @@ -6,6 +13,9 @@ export { clampWebGLTextNaive } from "./getTextLength" export { hslToHex } from "./hslToHex" +export { parseRenderingStrategy } from "./parseRenderingStrategy" +export { removeFinalVideos } from "./removeFinalVideos" export { similar } from "./similar" +export { sleep } from "./sleep" export { sliceSegments } from "./sliceSegments" -export { parseRenderingStrategy } from "./parseRenderingStrategy" \ No newline at end of file +export { throttle } from "./throttle" \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/removeFinalVideo.ts b/packages/aitube-timeline/src/utils/removeFinalVideos.ts similarity index 100% rename from packages/aitube-timeline/src/utils/removeFinalVideo.ts rename to packages/aitube-timeline/src/utils/removeFinalVideos.ts From 2c1629dc237a9d799de1274c552d1937c844e551 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 7 Jun 2024 02:37:11 +0200 Subject: [PATCH 119/346] 0.0.15 --- packages/aitube-timeline/package.json | 2 +- .../components/controls/TimelineControls.tsx | 9 +++-- .../src/hooks/useTimelineState.ts | 39 ++++++++++++++++--- .../aitube-timeline/src/types/rendering.ts | 9 ++++- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 0d67d0be..1ec89073 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.14", + "version": "0.0.15", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index ea2b92ef..19107b0d 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -85,16 +85,19 @@ export function TimelineControls({ // now, the problem is that depends scrollY, // + (zoomHeight / 2), - 60, // min value: enough to display about one row + the top bar + -60, // min value: enough to display about one row + the top bar + 900, + /* // TODO: find the right formula - size.height > 550 ? 350 : + size.height > 550 ? 250 : size.height > 500 ? 400 : size.height > 450 ? 450 : size.height > 400 ? 500 : size.height > 350 ? 550 : size.height > 300 ? 550 : - 600 // determine how far down we can move (to see more of what is up) + 900 // determine how far down we can move (to see more of what is up) + */ ) // console.log(`scrollY=${Math.round(scrollY)}`) diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index 2438f7d0..ac2efe1c 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -200,9 +200,13 @@ export const useTimelineState = create((set, get) => ({ clap, tracks, defaultSegmentDurationInSteps, + cellWidth: previousCellWidth } = get() const cellWidth = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) + // nothing changed + if (Math.round(cellWidth) === Math.round(previousCellWidth)) { return } + const resizeStartedAt = performance.now() const isResizing = true @@ -313,6 +317,7 @@ export const useTimelineState = create((set, get) => ({ }, handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number, deltaY: number }) => { const { scrollX, scrollY } = get() + // TODO: compute the limits here, to avoid doing re-renderings for nothing set({ scrollX: scrollX + deltaX, scrollY: scrollY - deltaY, @@ -340,6 +345,12 @@ export const useTimelineState = create((set, get) => ({ }) }, setContainerSize: ({ width, height }: { width: number; height: number }) => { + const { width: previousWidth, height: previousHeight } = get() + const changed = + (Math.round(previousWidth) !== Math.round(height)) + || (Math.round(previousHeight) !== Math.round(height)) + if (!changed) { return } + set({ width, height, @@ -364,6 +375,8 @@ export const useTimelineState = create((set, get) => ({ setCursorTimestampAt: (cursorTimestampAt: number) => { set({ cursorTimestampAt }) }, + + // this function has an issue, it saves stuff as .txt, which is bad saveClapAs: async ({ embedded, @@ -428,8 +441,21 @@ export const useTimelineState = create((set, get) => ({ return segment // throw new Error(`please call setSegmentRender(...) first`) } + + const entities = clap.entityIndex || {} + + const speakingCharactersIds = segments.map(s => + s.category === ClapSegmentCategory.DIALOGUE ? s.entityId : null + ).filter(id => id) as string[] + + const generalCharactersIds = segments.map(s => + s.category === ClapSegmentCategory.CHARACTER ? s.entityId : null + ).filter(id => id) as string[] + + const mainCharacterId: string | undefined = speakingCharactersIds.at(0) || generalCharactersIds.at(0) || undefined + + const mainCharacterEntity: ClapEntity | undefined = mainCharacterId ? (entities[mainCharacterId] || undefined) : undefined - console.log("going to use clap meta:", clap.meta) const { id, assetUrl, @@ -442,12 +468,13 @@ export const useTimelineState = create((set, get) => ({ // the slice to use for rendering segments: filterSegments(ClapSegmentFilteringMode.ANY, segment, segments), - - // TODO OPTIMIZATION: - // we should filter the entities here, - // to optimize the payload size - entities: clap.entityIndex || {}, + entities, + + speakingCharactersIds, + generalCharactersIds, + mainCharacterId, + mainCharacterEntity, meta: clap.meta }) diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/aitube-timeline/src/types/rendering.ts index 24d8a81c..19d4cc5e 100644 --- a/packages/aitube-timeline/src/types/rendering.ts +++ b/packages/aitube-timeline/src/types/rendering.ts @@ -25,12 +25,17 @@ export enum RenderingStrategy { } export type SegmentRenderer = (params: { - segment: ClapSegment, + segment: ClapSegment // the slice to use for rendering - segments: ClapSegment[], + segments: ClapSegment[] entities: Record + speakingCharactersIds: string[] + generalCharactersIds: string[] + mainCharacterId?: string + mainCharacterEntity?: ClapEntity + meta: ClapMeta }) => Promise \ No newline at end of file From 32035575199b15f865a8c3cf36aecd17280e0e9b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 8 Jun 2024 02:09:06 +0200 Subject: [PATCH 120/346] 0.0.16 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/VideoCell.tsx | 2 +- .../components/controls/TimelineControls.tsx | 73 +++++---- .../src/components/timeline/Cells.tsx | 11 +- .../src/components/timeline/Cursor.tsx | 2 +- .../components/timeline/LeftBarTrackScale.tsx | 2 +- .../components/timeline/TopBarTimeScale.tsx | 2 +- packages/aitube-timeline/src/hooks/index.ts | 2 +- .../src/hooks/useCursorGeometry.ts | 4 +- ...VisibleSegments.ts => useSegmentLoader.ts} | 138 +++++++----------- .../src/hooks/useTimelineState.ts | 53 ++++++- packages/aitube-timeline/src/index.tsx | 2 +- .../aitube-timeline/src/types/timeline.ts | 13 +- .../src/utils/getDefaultState.ts | 9 +- .../src/utils/sliceSegments.ts | 3 - 15 files changed, 163 insertions(+), 155 deletions(-) rename packages/aitube-timeline/src/hooks/{useVisibleSegments.ts => useSegmentLoader.ts} (68%) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 1ec89073..04760059 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.15", + "version": "0.0.16", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/VideoCell.tsx b/packages/aitube-timeline/src/components/cells/VideoCell.tsx index bbe3e221..53e04c50 100644 --- a/packages/aitube-timeline/src/components/cells/VideoCell.tsx +++ b/packages/aitube-timeline/src/components/cells/VideoCell.tsx @@ -46,7 +46,7 @@ export function VideoCell({ position={[ 0, -cellHeight, - 1 + 0 ]} > or < than the canvasHeight) - // | | / - // | | - // *---------------* - // + /* + const topBottomSize = (size.height > canvasHeight) + ? ((size.height / 2) - (canvasHeight / 2)) + : ((canvasHeight / 2) - (size.height / 2)) + */ + + + const calculateTopBottomSizeSmooth = (height: number): number => { + // note: contentHeight seems to depends on cellWidth zoop, + // because when we change the horizontal "zoom" (the cellWidth) + // this messes up our calculation + const maxHeight = contentHeight // 820 + const minHeight = 0 + const maxTopBottomSize = maxHeight / 2 + if (height >= maxHeight) { + return 0 + } else { + const normalizedHeight = (height - minHeight) / (maxHeight - minHeight) + + return Math.max(0, maxTopBottomSize - (normalizedHeight * maxTopBottomSize)) + } + }; + + + // if you find the exact formula, please submit a PR! + const topBottomSize = calculateTopBottomSizeSmooth(size.height) + // console.log(`size.height=${size.height} contentHeight=${contentHeight} topBottomSize=${topBottomSize}`) scrollY = clamp( - // should depend upon the current zoom level - // if we are "high" in the sky (low zoom value) - // then we need to to go further noth - // now, the problem is that depends - scrollY, // + (zoomHeight / 2), - - -60, // min value: enough to display about one row + the top bar - - 900, - /* - // TODO: find the right formula - size.height > 550 ? 250 : - size.height > 500 ? 400 : - size.height > 450 ? 450 : - size.height > 400 ? 500 : - size.height > 350 ? 550 : - size.height > 300 ? 550 : - 900 // determine how far down we can move (to see more of what is up) - */ + scrollY, + + // if you want to change those, fine, + // but make sure the timeline still works properly when you change its height, + // horizontal zoom, and number of tracks + -topBottomSize + PROMPT_STEP_HEIGHT_IN_PX, // to take to top time scroll bar into account + topBottomSize + 38, ) // console.log(`scrollY=${Math.round(scrollY)}`) diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index b679d1ba..33cfb22d 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -1,9 +1,6 @@ -import React, { useEffect } from "react" -import { useSpring, a, animated, config } from "@react-spring/three" -import { DEFAULT_NB_TRACKS } from "@/constants" import { - useVisibleSegments, + useSegmentLoader, useTimelineState } from "@/hooks" @@ -24,7 +21,7 @@ export function Cells() { // note: this one is async, so it creates a delay // we could cheat by detecting the cell width change and apply it // faster on the current geometries - const visibleSegments = useVisibleSegments({ + const { visibleSegments, loadedSegments } = useSegmentLoader({ refreshRateInMs, }); @@ -38,7 +35,7 @@ export function Cells() { })) */ - console.log(`re-rendering ${visibleSegments.length} `) + console.log(`re-rendering (${visibleSegments.length} strictly visible, ${loadedSegments.length} loaded in total)`) return ( - {visibleSegments.map((s) => + {loadedSegments.map((s) => { if (r) { diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx index ae07c1dc..ea3879ad 100644 --- a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx @@ -35,7 +35,7 @@ export function LeftBarTrackScale() { setLeftBarTrackScale(r) } }} - position={[-leftBarTrackScaleWidth, contentHeight / 2, -2]} + position={[-leftBarTrackScaleWidth, contentHeight / 2, 0]} > {horizontalTrackLines.map((lineGeometry, idx) => ( diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 0a99dfd9..8ab8cac5 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -47,7 +47,7 @@ export function TopBarTimeScale() { setTopBarTimelineScale(r) } }} - position={[-leftBarTrackScaleWidth, 0, 0]} + position={[-leftBarTrackScaleWidth, 0, -3]} onWheel={(e) => { if (e.offsetY > topBarTimeScaleHeight) { return } diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/aitube-timeline/src/hooks/index.ts index 5beef493..51446681 100644 --- a/packages/aitube-timeline/src/hooks/index.ts +++ b/packages/aitube-timeline/src/hooks/index.ts @@ -2,4 +2,4 @@ export { useAxis } from "./useAxis" export { useVerticalGridLines } from "./useVerticalGridLines" export { useHorizontalGridLines } from "./useHorizontalGridLines" export { useTimelineState } from "./useTimelineState" -export { useVisibleSegments } from "./useVisibleSegments" \ No newline at end of file +export { useSegmentLoader } from "./useSegmentLoader" \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts index ccb912c6..7f956afc 100644 --- a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts +++ b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts @@ -18,8 +18,8 @@ export const useCursorGeometry = () => { for (let i = 0; i < 3; i++) { const verticalLinePoints = [ - new THREE.Vector3(i, 60, 7), - new THREE.Vector3(i, -contentHeight, 7) + new THREE.Vector3(i, 60, 1), + new THREE.Vector3(i, -contentHeight, 1) ]; const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); diff --git a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts similarity index 68% rename from packages/aitube-timeline/src/hooks/useVisibleSegments.ts rename to packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 8afaeb8f..535e74ec 100644 --- a/packages/aitube-timeline/src/hooks/useVisibleSegments.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -8,11 +8,15 @@ import { similar, sliceSegments } from "@/utils" import { useTimelineState } from "./useTimelineState" -export const useVisibleSegments = ({ +export const useSegmentLoader = ({ refreshRateInMs, }: { refreshRateInMs: number -}): ClapSegment[] => { +}): + { + visibleSegments: ClapSegment[] + loadedSegments: ClapSegment[] + }=> { // to make it react to screen width change // however, this doesn't seem to work well const { size: canvasSize, viewport } = useThree() @@ -26,6 +30,9 @@ export const useVisibleSegments = ({ // console.log(`segmentsChanged:`, segmentsChanged) + const loadedSegments = useTimelineState((s) => s.loadedSegments) + const setLoadedSegments = useTimelineState((s) => s.setLoadedSegments) + const visibleSegments = useTimelineState((s) => s.visibleSegments) const setVisibleSegments = useTimelineState((s) => s.setVisibleSegments) @@ -50,85 +57,22 @@ export const useVisibleSegments = ({ position: THREE.Vector3 scale: THREE.Vector3 initialized: boolean - beforeTimeInMs: number - afterTimeInMs: number + beforeTimeWithBufferInMs: number + afterTimeWithBufferInMs: number + beforeTimeWithoutBufferInMs: number + afterTimeWithoutBufferInMs: number timeout: NodeJS.Timeout }>({ position: new THREE.Vector3(), scale: new THREE.Vector3(), initialized: false, - beforeTimeInMs: 0, - afterTimeInMs: 0, + beforeTimeWithBufferInMs: 0, + afterTimeWithBufferInMs: 0, + beforeTimeWithoutBufferInMs: 0, + afterTimeWithoutBufferInMs: 0, timeout: 0 as unknown as NodeJS.Timeout, }) - /* - - for some reason, this: - - controls.addEventListener("change", onChange) - - doesn't work.. - - useEffect(() => { - const previous = cameraRef.current - if (!previous || previous.initialized || !controls) { return } - - previous.initialized = true - - console.log("getting ready..", { - previous, - camera, - controls - }) - // Fires when the camera has been transformed by the controls. - const onChange = () => { - console.log("onChange!") - // we can adjust this threshold to only re compute the geometry - // when a significant shift has been done by the user - const epsilonPaneThreshold = 5 - - // now the zoom is tricky because it may be equivalent to a large paning, - // if we are in a zoom out - const epsilonZoomThreshold = 1 - - const cameraDidntPaneALot = similar(previous.position, camera.position, epsilonPaneThreshold) - const cameraDidntZoomALot = similar(previous.scale, camera.scale, epsilonZoomThreshold) - - if (cameraDidntPaneALot && cameraDidntZoomALot) { return } - - previous.position.copy(camera.position) - previous.scale.copy(camera.scale) - - console.log("the camera has changed a lot!") - } - - // Fires when an interaction was initiated. - const onStart = () => { - console.log("onStart!") - } - - // Fires when an interaction has finished. - const onEnd = () => { - console.log("onEnd!") - } - - controls.addEventListener("change", onChange) - controls.addEventListener("start", onStart) - controls.addEventListener("end", onEnd) - - return () => { - controls.removeEventListener("change", onChange) - controls.removeEventListener("start", onStart) - controls.removeEventListener("chaendnge", onEnd) - } - }, [controls]) - */ - - - // TODO we should use: - // controls.addEventListener("change", onChange) - // instead, but it doesn't work for some reason.. const sync = async (forceRerendering?: boolean) => { if (!stateRef.current) { return } @@ -180,6 +124,8 @@ export const useVisibleSegments = ({ const cellIndex = Math.max(0, pixelX / cellWidthInPixelBasedOnZoom) + // we actually don't use the camera.zoom anymore, so.. + const securityMargin = // this is useful for horizontal scroll only maxPossibleNumberOfVisibleHorizontalCells @@ -192,25 +138,45 @@ export const useVisibleSegments = ({ // to take that into account too. (camera.zoom * 8) // 8 because 4 on left and 4 on right + const { segments } = useTimelineState.getState() + // we only keep segments within a given range // those are not necessarily visible (there is a security margin) - const afterSteps = Math.floor(Math.max(0, cellIndex - securityMargin)) - const beforeSteps = Math.floor(cellIndex + maxPossibleNumberOfVisibleHorizontalCells + securityMargin) + const afterStepsWithBuffer = Math.floor(Math.max(0, cellIndex - securityMargin)) + const beforeStepsWithBuffer = Math.floor(cellIndex + maxPossibleNumberOfVisibleHorizontalCells + securityMargin) - const afterTimeInMs = afterSteps * DEFAULT_DURATION_IN_MS_PER_STEP - const beforeTimeInMs = beforeSteps * DEFAULT_DURATION_IN_MS_PER_STEP + const afterTimeWithBufferInMs = afterStepsWithBuffer * DEFAULT_DURATION_IN_MS_PER_STEP + const beforeTimeWithBufferInMs = beforeStepsWithBuffer * DEFAULT_DURATION_IN_MS_PER_STEP - if (state.afterTimeInMs !== afterTimeInMs || state.beforeTimeInMs !== beforeTimeInMs || forceRerendering) { - state.afterTimeInMs = afterTimeInMs - state.beforeTimeInMs = beforeTimeInMs + if (state.afterTimeWithBufferInMs !== afterTimeWithBufferInMs || state.beforeTimeWithBufferInMs !== beforeTimeWithBufferInMs || forceRerendering) { + state.afterTimeWithBufferInMs = afterTimeWithBufferInMs + state.beforeTimeWithBufferInMs = beforeTimeWithBufferInMs - const { segments, visibleSegments: previouslyVisibleSegments } = useTimelineState.getState() - const visibleSegments = await sliceSegments({ + const loadedSegments = await sliceSegments({ segments, - visibleSegments: previouslyVisibleSegments, - ...state + afterTimeInMs: afterTimeWithBufferInMs, + beforeTimeInMs: beforeTimeWithBufferInMs }) + setLoadedSegments(loadedSegments) + } + + const afterStepsWithoutBuffer = Math.floor(Math.max(0, cellIndex)) + const beforeStepsWithoutBuffer = Math.floor(cellIndex + maxPossibleNumberOfVisibleHorizontalCells) + + const afterTimeWithoutBufferInMs = afterStepsWithoutBuffer * DEFAULT_DURATION_IN_MS_PER_STEP + const beforeTimeWithoutBufferInMs = beforeStepsWithoutBuffer * DEFAULT_DURATION_IN_MS_PER_STEP + + if (state.afterTimeWithoutBufferInMs !== afterTimeWithoutBufferInMs || state.beforeTimeWithoutBufferInMs !== beforeTimeWithoutBufferInMs || forceRerendering) { + state.afterTimeWithoutBufferInMs = afterTimeWithoutBufferInMs + state.beforeTimeWithoutBufferInMs = beforeTimeWithoutBufferInMs + + const visibleSegments = await sliceSegments({ + segments: loadedSegments, // <- yeah, to save compute we sub-filter this previously filtered set + afterTimeInMs: afterTimeWithoutBufferInMs, + beforeTimeInMs: beforeTimeWithoutBufferInMs + }) + setVisibleSegments(visibleSegments) } } @@ -249,5 +215,5 @@ export const useVisibleSegments = ({ fn() }, [cellHeight, cellWidth, segmentsChanged]) - return visibleSegments -}; \ No newline at end of file + return { visibleSegments, loadedSegments } +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimelineState.ts index ac2efe1c..01bef482 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimelineState.ts @@ -172,13 +172,11 @@ export const useTimelineState = create((set, get) => ({ const isEmpty = segments.length === 0 - - const visibleSegments: ClapSegment[] = [] - set({ clap, segments, - visibleSegments, + loadedSegments: [], + visibleSegments: [], segmentsChanged: 1, isEmpty, @@ -223,8 +221,9 @@ export const useTimelineState = create((set, get) => ({ }, setSegments: (segments: ClapSegment[] = []) => { - set({ segments, visibleSegments: [] }) + set({ segments, loadedSegments: [] }) }, + setLoadedSegments: (loadedSegments: ClapSegment[] = []) => { set({ loadedSegments }) }, setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, getCellHeight: (trackNumber?: number): number => { @@ -421,9 +420,9 @@ export const useTimelineState = create((set, get) => ({ return objectUrl.length }, - setStoryboardRenderingStrategy: (storyboardRenderingStrategy: RenderingStrategy) => { + setImageRenderingStrategy: (imageRenderingStrategy: RenderingStrategy) => { set({ - storyboardRenderingStrategy: storyboardRenderingStrategy || RenderingStrategy.ON_DEMAND + imageRenderingStrategy: imageRenderingStrategy || RenderingStrategy.ON_DEMAND }) }, setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => { @@ -431,6 +430,21 @@ export const useTimelineState = create((set, get) => ({ videoRenderingStrategy: videoRenderingStrategy || RenderingStrategy.ON_DEMAND }) }, + setSoundRenderingStrategy: (soundRenderingStrategy: RenderingStrategy) => { + set({ + soundRenderingStrategy: soundRenderingStrategy || RenderingStrategy.ON_DEMAND + }) + }, + setVoiceRenderingStrategy: (voiceRenderingStrategy: RenderingStrategy) => { + set({ + voiceRenderingStrategy: voiceRenderingStrategy || RenderingStrategy.ON_DEMAND + }) + }, + setMusicRenderingStrategy: (musicRenderingStrategy: RenderingStrategy) => { + set({ + musicRenderingStrategy: musicRenderingStrategy || RenderingStrategy.ON_DEMAND + }) + }, setSegmentRenderer: (segmentRenderer: SegmentRenderer) => { set({ segmentRenderer }) }, @@ -490,6 +504,31 @@ export const useTimelineState = create((set, get) => ({ return newSegment }, + findStuffToRender: async () => { + // note: this run independently for the manual re-render, + // which the user can always do + const { + imageRenderingStrategy, + videoRenderingStrategy, + soundRenderingStrategy, + voiceRenderingStrategy, + musicRenderingStrategy, + segments, + loadedSegments, + } = get() + + if (imageRenderingStrategy === RenderingStrategy.ON_DEMAND) { + // for now this has its own workflow, managed elsewhere + } else if (imageRenderingStrategy === RenderingStrategy.ON_SCREEN_ONLY) { + + } else if (imageRenderingStrategy === RenderingStrategy.ON_SCREEN_THEN_SURROUNDING) { + + } else if (imageRenderingStrategy === RenderingStrategy.ON_SCREEN_THEN_ALL) { + + } else { + // do nothing + } + }, findFreeTrack: ({ startTimeInMs, endTimeInMs diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index bf19e599..852b912a 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -30,7 +30,7 @@ export { useVerticalGridLines, useHorizontalGridLines, useTimelineState, - useVisibleSegments, + useSegmentLoader, } from "./hooks" export { diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index bd1ed614..44e316cc 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -49,6 +49,7 @@ export type TimelineStoreState = { segments: ClapSegment[] segmentsChanged: number + loadedSegments: ClapSegment[] visibleSegments: ClapSegment[] nbIdentifiedTracks: number @@ -124,8 +125,11 @@ export type TimelineStoreState = { // position of the current timestamp cursorTimestampAt: number - storyboardRenderingStrategy: RenderingStrategy + imageRenderingStrategy: RenderingStrategy videoRenderingStrategy: RenderingStrategy + soundRenderingStrategy: RenderingStrategy + voiceRenderingStrategy: RenderingStrategy + musicRenderingStrategy: RenderingStrategy segmentRenderer?: SegmentRenderer } @@ -135,6 +139,7 @@ export type TimelineStoreModifiers = { setClap: (clap?: ClapProject) => Promise setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: ClapSegment[]) => void + setLoadedSegments: (loadedSegments?: ClapSegment[]) => void setVisibleSegments: (visibleSegments?: ClapSegment[]) => void getCellHeight: (trackNumber?: number) => number getVerticalCellPosition: (start: number, end: number) => number @@ -164,10 +169,14 @@ export type TimelineStoreModifiers = { // some extra text to append to the file name extraLabel?: string }) => Promise - setStoryboardRenderingStrategy: (storyboardRenderingStrategy: RenderingStrategy) => void + setImageRenderingStrategy: (imageRenderingStrategy: RenderingStrategy) => void setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => void + setSoundRenderingStrategy: (soundRenderingStrategy: RenderingStrategy) => void + setVoiceRenderingStrategy: (voiceRenderingStrategy: RenderingStrategy) => void + setMusicRenderingStrategy: (musicRenderingStrategy: RenderingStrategy) => void setSegmentRenderer: (segmentRenderer: SegmentRenderer) => void renderSegment: (segment: ClapSegment) => Promise + findStuffToRender: () => Promise findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number } diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 44547f5b..9316d40a 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -1,10 +1,9 @@ - import * as THREE from "three" import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { TimelineStoreState } from "@/types/timeline" import { RenderingStrategy } from "@/types" -import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, NB_MAX_SHOTS } from "@/constants/grid" +import { NB_MAX_SHOTS } from "@/constants/grid" // those settings will change between .clap project reloads export function getDefaultProjectState() { @@ -12,6 +11,7 @@ export function getDefaultProjectState() { clap: undefined, segments: [], segmentsChanged: 0, + loadedSegments: [], visibleSegments: [], isEmpty: true, @@ -69,8 +69,11 @@ export function getDefaultPreferencesState() { topBarTimelineScale: undefined, leftBarTrackScale: undefined, timelineCursor: undefined, - storyboardRenderingStrategy: RenderingStrategy.ON_DEMAND, + imageRenderingStrategy: RenderingStrategy.ON_DEMAND, videoRenderingStrategy: RenderingStrategy.ON_DEMAND, + soundRenderingStrategy: RenderingStrategy.ON_DEMAND, + voiceRenderingStrategy: RenderingStrategy.ON_DEMAND, + musicRenderingStrategy: RenderingStrategy.ON_DEMAND, segmentRenderer: undefined, } } diff --git a/packages/aitube-timeline/src/utils/sliceSegments.ts b/packages/aitube-timeline/src/utils/sliceSegments.ts index aa325a13..54757a5a 100644 --- a/packages/aitube-timeline/src/utils/sliceSegments.ts +++ b/packages/aitube-timeline/src/utils/sliceSegments.ts @@ -6,14 +6,11 @@ export function sliceSegments({ segments, afterTimeInMs, beforeTimeInMs, - visibleSegments, }: { segments: ClapSegment[] afterTimeInMs: number beforeTimeInMs: number - visibleSegments: ClapSegment[] }): ClapSegment[] { - // console.log(`sliceSegments(): extracting [${afterTimeInMs}:${beforeTimeInMs}] out of ${segments.length} segments`) const result = filterSegmentsWithinRange( ClapSegmentFilteringMode.ANY, afterTimeInMs, From 9cfdce38053752e88dc5626ea30dd5050fc8dab0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 8 Jun 2024 11:37:53 +0200 Subject: [PATCH 121/346] 0.0.25 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/types.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 3e045cdd..9f4bdbb5 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.24", + "version": "0.0.25", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 0cf3fc01..20c5135e 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -126,6 +126,7 @@ export enum ClapOutputType { export enum ClapSegmentStatus { TO_GENERATE = "to_generate", + IN_PROGRESS = "in_progress", TO_INTERPOLATE = "to_interpolate", TO_UPSCALE = "to_upscale", COMPLETED = "completed", From 18811db5dd4c7b70fa908de7237e2d8a58deaef9 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 8 Jun 2024 11:39:33 +0200 Subject: [PATCH 122/346] 0.0.16 --- packages/aitube-engine/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 1b477506f182109ef4b167df4187b29c9a14dea6..5d3f84c768c6895d3e6d0a2881781ee1ab05ed96 100755 GIT binary patch delta 325 zcmV-L0lNOwh5^)u0gx^rK;n?igKH)**MXeTz~fY?T0a&YVHfL-xWR9Dnv_Ygu}+o+ z0R)p#11qx-2ABqu0U47~11GZ(4%G%gB~~Fqb9wZ&PZS{>Rjq>DD#R&< zoW3+)sDvf@A1I66S}lYXSr!|{Gu*#c)QL>Lkhzd(18ZUPObG4dxIo8$vn3S>2|(;1 zFw2)wvl~1-b<^J5BE@fiI7wyj!o<;3PY9f)>?soIQN}$fY*nR`hy;&MA+li{fTtN+ zSv>Gl6-}-eFb=bA9(VyjccS6FHm}WzWmKc?6Lu$gE!`R((F%!pe&K5OOE{2mB{mpZ z(bMj##~W2Y$y(b5{4JAFP!r$X<}>EH1_H%Evn3$<4*@lkATTolF|$-Kya)p{E-f`e+nxOgtZru}+o+ zlcWSRvls@D29qcVFtgYU5CH)glTiaFvk(r|20)Q%izhYI(K`Q(x{E_m?fgN5v zDdE{3_KcbSvuz%D0YHe!vB>$Ahf>xxNmeMWt445=XYh-d7n{@o&99nc(a}ifQ%!p~ zsbP58zt=%IzH;1BfsntWY)3NgLphG?O4OGXXHOR4}{<12HZ#vlBV) U2b1zUAhRJsBLM+4vqeG=0cmiLMF0Q* diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 0af827a1..be274793 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.15", + "version": "0.0.16", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,12 +14,12 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.0", + "prettier": "^3.3.1", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.24" + "@aitube/clap": "0.0.25" }, "repository": { "type": "git", From c172f8ff1566375555810279d19fbc4d4f297903 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 8 Jun 2024 11:41:05 +0200 Subject: [PATCH 123/346] 0.0.34 --- packages/aitube-client/bun.lockb | Bin 18708 -> 18708 bytes packages/aitube-client/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index bb08f64c7519f528c9340aae731ddc793f942078..8c83a65577aca37e3704f4612413aada7b76edce 100755 GIT binary patch delta 320 zcmV-G0l)r~k^z*G0gx^rHUf`;MN+YqLLJhU$7HzBg|IUO@_JBxBiXh3E8%ruu};Rjq>DD#R&< zoW3+)sDvf@A1I66S}lYXSr!|{Gu*#c)QL>Lkhzd(18ZUPObG4dxIo8$vjrFk2|(;1 zFw2)wvl~1-b<^J5BE@fiI7wyj!o<;3PY9f)>?soIQN}$fY*nR`hy;&MA+li{fTtN+ zSv>Gl6-}-eFb=a#A$S2mccS6FHm}WzWmKc?6Lu$gE!`R((F%!pe&K5OOE{2mB{mpZ z(bMj##~W2Y$y(b5{4JAFP!r$X<}>EH1_H%Evjrn65dk%`Ff^bF12ir$v(rBA2LUmY Sz(OCh;YK3?0X4G)NDl$5c!X*I delta 316 zcmV-C0mJ^3k^z*G0gx^rLSfou_Ta(VC`ZDlVz8gW7p!!)EQBS|mN&e{cEu};hYI(K`Q(x{E_m?fgN5v zDdE{3_KcbSvrQp*0YHe!vB>$Ahf>xxNmeMWt445=XYh-d7n{@o&99nc(a}ifQ%!p~ zsbP58zt=%IzH;1BfsntWY)3NgL Date: Sat, 8 Jun 2024 11:48:04 +0200 Subject: [PATCH 124/346] 0.0.4 --- packages/aitube-colors/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-colors/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 832eb697ad8f4d2eb3a0ba56198854a095136f5a..8e27631276df5c494d3578d675266e17511f2bbc 100755 GIT binary patch delta 914 zcmcc8#(1TTae|(L!=njjo3qsnt~buPc;Io!iYR+A*+lWzy*m!(SInB?xpAXk7Ne*Y zHvBQs!n0<~2-= zERzG7wKof}O<`kXp8SwQd-4Sy2}T~Ep!#G1ULIa6pjjdeU^5x`z@ihFIT*Vq&*Zgd zJTqC6*M9O1UI9i)hn%J}KO8!8F~px^&eAuU zLN5c4*=pv5E}h)L((kXhDN&|jxnxwN&4*x7-*w^!e3NtKB6r^XcCz}Z3CH5a_Te|o8K?4ghv8$YwQh1g-I zGDe_38UFGA1Jddsk3#{=#*>GiU&&0cFFjVF?Z|X&g8#0djaTf=yHYa}dqig4DOqyJ z>_Tz9o#g7048=f$ql^;|7u)sE$TVTLo5osR7^OXHvaGzsfV)-yU5j9QTH(GySK%JLRB+~sEe21tvW6pYJW27HtQeV z$$8JyeTeV>h1=1{=suN~Q{8_x=$UFWE-D_o5O*+V2c!g|hmfV$`c56eX({Hu(xcyVU9#To&_ImH!hNmj)HrFcb=4CY4Y^m4I z$g2r75)>2~AbRpy{UAou$qELB%*J|#n?npzSSDXG5%Yy5T38BYVyrVV&@(jBvw$UI zSegaOnCcms>6tKK>d^vP0R)q!O^q0hH~X0$VrDkcGuSL_`Gy^2-6UK2$%>BBl16$Z z=~WITl?AEA`sKw?MqYkO>g0pw(vu4u*(a}d6lOG;yx%c*a-pNiWF037pqpKtEEtVJ JM$C2E4gk*MK0g2e delta 916 zcmcc8#(1TTae|)08pHYtT%UeL9Vq=j<8;$n1~DD$jP!G=iF2YChwvFi9@*%Z#VBgS z&A`CPz|dd_q=BemGmzlfe3mhoQDX7w8I|+1E@e*CkLp$1YHP`vZ*%Nb;H=%7EtuCZ zOrKeQ8ty<5T0CyHeV}U#U<0n!0}^tnCw&RpqxbjfF{ z@=@yvww_N~K1CPkxQS?MMv2wWa@Cx>L}53J#Ecx}TYv9-Q@2JkRCBT>(9j$5y!Ahe z*F<`-WXl`1B{c3#I4WpSHDk)_!4doNnZi?-GyBgd-WM4T>EoU|}!K;+@~g#G9Trtz~9*aIB}}+*fSJ7xWun`{Lv5 z^>UTa?%CCMFX>9|yd&F`v1?1EN9rWmhu3O1xidJYN*620g>0@>*v-pmxY<&#osm}q zXskLAgJ{jkXZ3>^jVCJ@7&05_nQjg-NMV_L$wbT-mTX~Zl!>v>%qV*~(8=bd;7f z&?`x=aww@RNG;aS%TGy#GRuo6A2gSqT;Rw)`JbcS Date: Sat, 8 Jun 2024 11:49:08 +0200 Subject: [PATCH 125/346] 0.0.12 --- packages/broadway/bun.lockb | Bin 32802 -> 32802 bytes packages/broadway/package.json | 8 ++++---- .../broadway/src/factories/createSegment.ts | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 0ff01dbb30226bc46a2c7a4b916513e9a5541450..7937afd26c913affc2bcf6bf007c70eb1402fea7 100755 GIT binary patch delta 1137 zcmZ3~z_h4=X@Z`@hrkn4T=+L@s+{uFSBlr1>f!#b@=t2zg^J3)3v;T!T;Axnic$1E zF9QQN14Dxe9|HpqkbVZ_b8hBkn#?3IQ9r6zZL6&%XTHs`SAny3FFrk^a(>pO%*{Jk z*03_NOuopfy?FxH6gEcY$q(7JCkF^hF!BHe)h7$EaR~kbnqvhtPlN$%E(0G-hS6cN zq>w#RBj4m%f_9rDgeEXfPGQ&BEFcoWHhBf7!Q>fI0*sPi#TTR`fKob}_sBLdasrKE zumNJm&2weuGof&088;^>II}sZhABD~SAN;*FQOQPK8Yw1y%=pg!uq&ND`zP$2kindt_}Pc!?UNl2$LlvgRpa1vc%xu&dV1hyX&al; z%lGam9nG(|@J#)1=*Yzoe~vjz-)IWG3_ND5nG?EnatBMlzv8AunTF+(QIR$uf<=AT zi5u`u)-{l*=V>n8fgWY}$NvvV>w|m_1uPp+9)5l$Gr_*}ScSGD z)3FKuyMi`eu{ZBZ%}DGKnRTaR$sw}~#r1ZQt4lHz0}YNcPCQ&}*FPiEgxPKyYk6Um z_N>Ww4J0P}8hSGtPM&BGzIleBER(~L+aFb&r*tMCYxSN|%E6%Wsn25iu{k|mCza=1 zzWPM#glu5^cj27(2dBwaSv+%NKGb+-*){8K`Pyx-6|6TndTMU|YP^A?J}q6nY1z`_ zuR8zlHCsL>!0hPDbe6rT{vr%zzxrhUG9M@^U-xiXPv(h(HN0iq;g-oP8#g=MIlU#o zH|mGqW*NnuNL~(x`4>pDlrMU?*KGaS&eV{_?}W?LD|PQm$z9~?tf+gK_1)WILZPae zMAXI0?<7|pmkzZ*8FicWkM88a0O9+0pBX>f#m02hVY02QgyW{_gxL~*7H>H6j{idU zTA5Xo4l)-WyQ^}ChgZe=>3nv-WPufthTE)nC8yomkm>YWEj@1kl&^PHu9g_-0IRG zz-XXnpl33343oR#r6*rV7H2fx{35xOjoC!cU~@v&8+JzH$rtk#C+8JO zOB(5wq*pnVR2HNb>z5Zp8F~3BsgoPCWG3$`Vw?PLdd_VhSp*)32^_-Jk>jfB1CkN)sPcE$&U^NC=01TEH0Ob;_ Av;Y7A delta 1142 zcmZ3~z_h4=X@Z_YGHdxaZNx|47k^$~^^B?mhFWKm~ic$0< zF9QQ714F|zAk7V=Gx!)7csBDgO=gl=f&z?OVBQ2lp2;#oHiCLU6Rm(IivZQ} zfG|`o=j5A$_M0PwCNNIckTBRRAringc?G}0l#S-ERdGGApTdzY4ugJow;rbA@A16x#jwWAD`m!mnSQsbylM34KL-t ze=6t2PJVxH`^VQ_SH5oivqVNz?9mIwS2H z{83Bgw@e?kDg^`{=yQAUow?HY=#tM?<)hXUY(1Z}e2Om6aTC$jj1sG#<*GS%iNbCc zi5WS{xBlMwrf!X7sNv+72H~4$7|Jp^Ft{1Y-+e3*{QU3QMIk(5pSR`(bP8Sx4bhPM zZO+X4t{|At;q_Yk4$F^H<{y9QAj1PWiaz z7H3@MnNYC~bI+Sf&uiCcG%Ri6xb^4uq6TlLcPB0$&$6H0u|GDwPv0?TveAN|?O9z$ zZ;hNUELfr?S%BoWU{EYW0n5+gHIW`H+44qh35`1wjtW{-&6sle85^VNe{C+|pU;;5 zn)+T^T%=Lb^3tO5)1~_TjbKP3{cNsnW#? zav_Y9C)#b>>|>`Q!DzF&FzhxXuL013`ale#4JSuN{F5?fV2}ZFfGNHq*vNlwbE`{( z0HcAPfu8Z?!bl%xBR$j22O|Ag#X&g@maUi=>x>Na42|?GK2GM2mz0L(M1;H+&`1!- zm~0;}xw$Cbk%h^aVRCo8^yCZ4;*3U{UnG~ZF&pX`ZBEE~!w#}!a$vsv7 z^eTsv%7WBl{k;5?R4B82^22nQ$$N{~Cwmv`P2N`|$!IkBMp5o$+j{oR4aKvVCmYo% vOx{o-FuAUjWAeIk?#;2~``H0oj diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 3f39768a..991f6148 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.11", + "version": "0.0.12", "description": "Convert a script to a clap file", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", @@ -15,13 +15,13 @@ "devDependencies": { "@aitube/io": "0.0.1", "bun-types": "latest", - "prettier": "^3.2.5", + "prettier": "^3.3.1", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.23", - "@aitube/colors": "0.0.3" + "@aitube/clap": "0.0.25", + "@aitube/colors": "0.0.4" }, "repository": { "type": "git", diff --git a/packages/broadway/src/factories/createSegment.ts b/packages/broadway/src/factories/createSegment.ts index b5bb260f..194c4ddc 100644 --- a/packages/broadway/src/factories/createSegment.ts +++ b/packages/broadway/src/factories/createSegment.ts @@ -1,3 +1,4 @@ +// this is a deprecated module, we should get rid of it import { getSegment, segmentCategories, ClapSegmentCategorySettings } from "@aitube/colors" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants/general" From a522ff9e7aedea22dad0b042363869753a6cdf92 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 8 Jun 2024 19:55:14 +0200 Subject: [PATCH 126/346] 0.0.17 --- packages/aitube-timeline/bun.lockb | Bin 159621 -> 160224 bytes packages/aitube-timeline/package.json | 20 ++++++------- packages/aitube-timeline/src/ClapTimeline.tsx | 6 ++-- .../src/components/camera/TimelineCamera.tsx | 4 +-- .../src/components/cells/Cell.tsx | 20 ++++++------- .../src/components/cells/ImageCell.tsx | 2 +- .../src/components/cells/RedrawButton.tsx | 4 +-- .../components/controls/TimelineControls.tsx | 10 +++---- .../scroller/HorizontalScroller.tsx | 14 ++++----- .../components/scroller/VerticalScroller.tsx | 10 +++---- .../src/components/timeline/Cells.tsx | 4 +-- .../src/components/timeline/Cursor.tsx | 6 ++-- .../src/components/timeline/CursorWeird.tsx | 2 +- .../src/components/timeline/Grid.tsx | 6 ++-- .../components/timeline/LeftBarTrackScale.tsx | 14 ++++----- .../src/components/timeline/Timeline.tsx | 8 ++--- .../components/timeline/TopBarTimeScale.tsx | 18 +++++------ packages/aitube-timeline/src/hooks/index.ts | 2 +- packages/aitube-timeline/src/hooks/useAxis.ts | 6 ++-- .../src/hooks/useCursorGeometry.ts | 4 +-- .../src/hooks/useHorizontalGridLines.ts | 8 ++--- .../src/hooks/useHorizontalTrackLines.ts | 6 ++-- .../src/hooks/useHoveredSegment.ts | 4 +-- .../src/hooks/useSegmentLoader.ts | 28 +++++++++--------- .../src/hooks/useTimeScaleGraduations.ts | 6 ++-- .../{useTimelineState.ts => useTimeline.ts} | 13 +++++--- .../src/hooks/useVerticalGridLines.ts | 10 +++---- packages/aitube-timeline/src/index.tsx | 8 +++-- packages/aitube-timeline/src/types/index.ts | 3 ++ .../aitube-timeline/src/types/timeline.ts | 3 +- .../src/utils/getDefaultState.ts | 1 + .../src/utils/getTextLength.ts | 4 +-- 32 files changed, 134 insertions(+), 120 deletions(-) rename packages/aitube-timeline/src/hooks/{useTimelineState.ts => useTimeline.ts} (97%) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index dec2d2f8dbbcded64be11f279a7e5de2c34ca986..2f7012c910744a171a9335c52399bdf044b58bcb 100755 GIT binary patch delta 15874 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 S)}m-*EUO>{Wot6~Z)M7HY%o7F-KMj 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 const handleIsCreated = () => { - useTimelineState.setState({ isReady: true }) + useTimeline.setState({ isReady: true }) } return ( @@ -108,7 +108,7 @@ export function ClapTimeline({ // crude fix to ignore global X-Y scroll events when we are over the timeline if (posY <= topBarTimeScaleHeight) { return } - useTimelineState.getState().handleMouseWheel({ + useTimeline.getState().handleMouseWheel({ deltaX: wheelEvent.deltaX, deltaY: wheelEvent.deltaY }) diff --git a/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx b/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx index 5caf9979..0370d69a 100644 --- a/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx +++ b/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx @@ -1,9 +1,9 @@ import { OrthographicCamera } from "@react-three/drei" -import { useTimelineState } from "@/hooks" +import { useTimeline } from "@/hooks" export function TimelineCamera() { - const setTimelineCamera = useTimelineState(s => s.setTimelineCamera) + const setTimelineCamera = useTimeline(s => s.setTimelineCamera) return ( { diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 67993982..c247dd25 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -6,7 +6,7 @@ import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { ImageCell } from "./ImageCell" import { VideoCell } from "./VideoCell" import { TextCell } from "./TextCell" -import { useTimelineState } from "@/hooks" +import { useTimeline } from "@/hooks" import { useHoveredSegment } from "@/hooks/useHoveredSegment" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" import { RedrawButton } from "./RedrawButton" @@ -18,18 +18,18 @@ export function Cell({ segment: ClapSegment }) { - const getSegmentColorScheme = useTimelineState(s => s.getSegmentColorScheme) + const getSegmentColorScheme = useTimeline(s => s.getSegmentColorScheme) const colorScheme = getSegmentColorScheme(s) - const cellWidth = useTimelineState((s) => s.cellWidth) - const getCellHeight = useTimelineState((s) => s.getCellHeight) - const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) + const cellWidth = useTimeline((s) => s.cellWidth) + const getCellHeight = useTimeline((s) => s.getCellHeight) + const getVerticalCellPosition = useTimeline((s) => s.getVerticalCellPosition) const cellHeight = getCellHeight(s.track) const verticalCellPosition = getVerticalCellPosition(0, s.track) // used to react to changes impacting tracks - const tracks = useTimelineState(s => s.tracks) + const tracks = useTimeline(s => s.tracks) const durationInSteps = ( (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP @@ -41,7 +41,7 @@ export function Cell({ const widthInPx = durationInSteps * cellWidth - const currentZoomLevel = useTimelineState(s => s.currentZoomLevel) + const currentZoomLevel = useTimeline(s => s.currentZoomLevel) // we need to round this one to avoid *too* many re-renders const widthInPxAfterZoom = Math.round(currentZoomLevel * durationInSteps * cellWidth) @@ -50,8 +50,8 @@ export function Cell({ // note: this is not reactive (as a general rule, we never want to be reactive in here) // note: as a general rule, we should avoid "reactive" state updates like this - const isResizing = useTimelineState(s => s.isResizing) - // const isResizing = useTimelineState.getState().isResizing + const isResizing = useTimeline(s => s.isResizing) + // const isResizing = useTimeline.getState().isResizing const SpecializedCell = s.assetUrl.startsWith("data:image/") @@ -60,7 +60,7 @@ export function Cell({ ? VideoCell : TextCell - const setHoveredSegment = useTimelineState(s => s.setHoveredSegment) + const setHoveredSegment = useTimeline(s => s.setHoveredSegment) // cells are rendered often (eg. whenever we mouse the mouse from one cell to another) // because we need to handle their color change on hover / transition diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/aitube-timeline/src/components/cells/ImageCell.tsx index 09883c0a..56e3fca7 100644 --- a/packages/aitube-timeline/src/components/cells/ImageCell.tsx +++ b/packages/aitube-timeline/src/components/cells/ImageCell.tsx @@ -19,7 +19,7 @@ export function ImageCell({ // const ref = useRef, Material | Material[], Object3DEventMap>>(null) /* - const renderSegment = useTimelineState(s => s.renderSegment) + const renderSegment = useTimeline(s => s.renderSegment) const [inProgress, setInProgress] = useState(false) // const [isButtonHovered, setButtonHovered] = useState(false) diff --git a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx index 0aff7a2e..e3dea8b8 100644 --- a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx +++ b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx @@ -1,4 +1,4 @@ -import { useTimelineState } from "@/hooks" +import { useTimeline } from "@/hooks" import { ClapSegment } from "@aitube/clap" import { Circle, Text } from "@react-three/drei" import { invalidate } from "@react-three/fiber" @@ -22,7 +22,7 @@ export function RedrawButton({ // onClick: () => void }) { const [_isPending, startTransition] = useTransition() - const renderSegment = useTimelineState(s => s.renderSegment) + const renderSegment = useTimeline(s => s.renderSegment) const [inProgress, setInProgress] = useState(false) // const [isButtonHovered, setButtonHovered] = useState(false) diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index ab2ccc0e..eb03ccae 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -1,4 +1,4 @@ -import { useTimelineState } from "@/hooks" +import { useTimeline } from "@/hooks" import { MapControls } from "@react-three/drei" import { TimelineControlsImpl } from "./types" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" @@ -44,7 +44,7 @@ export function TimelineControls({ width, height, cursorTimestampAt, - } = useTimelineState.getState() + } = useTimeline.getState() const now = performance.now() // new Date().getTime(), const elapsedTimeInMs = now - resizeStartedAt @@ -53,7 +53,7 @@ export function TimelineControls({ const isResizing = elapsedTimeInMs < delayThreshold // console.log(`now=${now}, resizeStartedAt=${resizeStartedAt}, elapsedTimeInMs=${elapsedTimeInMs}, delayThreshold=${delayThreshold}, isResizing=${isResizing}`) if (!timelineCamera || !timelineControls) { - useTimelineState.setState({ isResizing }) + useTimeline.setState({ isResizing }) return } @@ -104,7 +104,7 @@ export function TimelineControls({ timelineCamera.position.setY(scrollY) timelineControls.target.setY(scrollY) - useTimelineState.setState({ + useTimeline.setState({ scrollX, scrollY, isResizing @@ -132,7 +132,7 @@ export function TimelineControls({ }, 1) - const setTimelineControls = useTimelineState(s => s.setTimelineControls) + const setTimelineControls = useTimeline(s => s.setTimelineControls) // TODO: we should create a new class extending from MapControls // and add some custom code to put limits, to avoid going out of bounds // I also don't like how scroll is working on macOS, because the mouse wheel diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx index 374b7441..2f762256 100644 --- a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -1,14 +1,14 @@ import { HorizontalSlider } from "@/components/slider" -import { useTimelineState } from "@/hooks/useTimelineState" +import { useTimeline } from "@/hooks/useTimeline" export function HorizontalScroller() { - const timelineCamera = useTimelineState(s => s.timelineCamera) - const timelineControls = useTimelineState(s => s.timelineControls) + const timelineCamera = useTimeline(s => s.timelineCamera) + const timelineControls = useTimeline(s => s.timelineControls) - const minHorizontalZoomLevel = useTimelineState((s) => s.minHorizontalZoomLevel) - const maxHorizontalZoomLevel = useTimelineState((s) => s.maxHorizontalZoomLevel) - const cellWidth = useTimelineState((s) => s.cellWidth) - const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) + const minHorizontalZoomLevel = useTimeline((s) => s.minHorizontalZoomLevel) + const maxHorizontalZoomLevel = useTimeline((s) => s.maxHorizontalZoomLevel) + const cellWidth = useTimeline((s) => s.cellWidth) + const setHorizontalZoomLevel = useTimeline((s) => s.setHorizontalZoomLevel) if (!timelineCamera || !timelineControls) { return null } diff --git a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx index 4b64560a..42c1e37f 100644 --- a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx @@ -1,14 +1,14 @@ import { useThree } from "@react-three/fiber" import { VerticalSlider } from "@/components/slider" -import { useTimelineState } from "@/hooks/useTimelineState" +import { useTimeline } from "@/hooks/useTimeline" export function VerticalScroller() { - const timelineCamera = useTimelineState(s => s.timelineCamera) - const timelineControls = useTimelineState(s => s.timelineControls) + const timelineCamera = useTimeline(s => s.timelineCamera) + const timelineControls = useTimeline(s => s.timelineControls) - const cellWidth = useTimelineState((s) => s.cellWidth) - const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) + const cellWidth = useTimeline((s) => s.cellWidth) + const setHorizontalZoomLevel = useTimeline((s) => s.setHorizontalZoomLevel) // TODO: we want to control two things: // on mouse click & drag, we want to move horizontally inside the timeline diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index 33cfb22d..9a89dca5 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -1,7 +1,7 @@ import { useSegmentLoader, - useTimelineState + useTimeline } from "@/hooks" import { Cell } from "@/components/cells" @@ -16,7 +16,7 @@ export function Cells() { // to avoid having to re-compute const refreshRateInMs = 500 - const contentHeight = useTimelineState(s => s.contentHeight) + const contentHeight = useTimeline(s => s.contentHeight) // note: this one is async, so it creates a delay // we could cheat by detecting the cell width change and apply it diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx index 7c9b61b3..96dcf692 100644 --- a/packages/aitube-timeline/src/components/timeline/Cursor.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -1,16 +1,16 @@ import React from "react" import { - useTimelineState + useTimeline } from "@/hooks" import { useCursorGeometry } from "@/hooks/useCursorGeometry" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" export function Cursor() { - const setTimelineCursor = useTimelineState(s => s.setTimelineCursor) + const setTimelineCursor = useTimeline(s => s.setTimelineCursor) - const contentHeight = useTimelineState(s => s.contentHeight) + const contentHeight = useTimeline(s => s.contentHeight) const cursorGeometries = useCursorGeometry() // console.log(`re-rendering `) diff --git a/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx b/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx index 033f2a9e..b2eb25bd 100644 --- a/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx +++ b/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx @@ -1,7 +1,7 @@ import React from "react" import { - useTimelineState + useTimeline } from "@/hooks" import { hslToHex } from "@/utils" diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/aitube-timeline/src/components/timeline/Grid.tsx index 33d8ec2c..2a2c20b5 100644 --- a/packages/aitube-timeline/src/components/timeline/Grid.tsx +++ b/packages/aitube-timeline/src/components/timeline/Grid.tsx @@ -5,14 +5,14 @@ import { useAxis, useVerticalGridLines, useHorizontalGridLines, - useTimelineState + useTimeline } from "@/hooks" import { hslToHex } from "@/utils" export function Grid() { - const typicalSegmentDurationInSteps = useTimelineState(s => s.typicalSegmentDurationInSteps) - const contentHeight = useTimelineState(s => s.contentHeight) + const typicalSegmentDurationInSteps = useTimeline(s => s.typicalSegmentDurationInSteps) + const contentHeight = useTimeline(s => s.contentHeight) const axis = useAxis() diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx index ea3879ad..d11a66fc 100644 --- a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx @@ -2,7 +2,7 @@ import React from "react" import { Plane, Text } from "@react-three/drei" import { -useTimelineState +useTimeline } from "@/hooks" import { leftBarTrackScaleWidth } from "@/constants/themes" @@ -13,17 +13,17 @@ import { hslToHex } from "@/utils" export function LeftBarTrackScale() { // console.log(`re-rendering `) - const contentHeight = useTimelineState((s) => s.contentHeight) + const contentHeight = useTimeline((s) => s.contentHeight) - const getCellHeight = useTimelineState((s) => s.getCellHeight) + const getCellHeight = useTimeline((s) => s.getCellHeight) - const getVerticalCellPosition = useTimelineState((s) => s.getVerticalCellPosition) + const getVerticalCellPosition = useTimeline((s) => s.getVerticalCellPosition) - const tracks = useTimelineState(s => s.tracks) - const toggleTrackVisibility = useTimelineState((s) => s.toggleTrackVisibility) + const tracks = useTimeline(s => s.tracks) + const toggleTrackVisibility = useTimeline((s) => s.toggleTrackVisibility) - const setLeftBarTrackScale = useTimelineState(s => s.setLeftBarTrackScale) + const setLeftBarTrackScale = useTimeline(s => s.setLeftBarTrackScale) const horizontalTrackLines = useHorizontaTrackLines() diff --git a/packages/aitube-timeline/src/components/timeline/Timeline.tsx b/packages/aitube-timeline/src/components/timeline/Timeline.tsx index a5dc9136..d420d6a8 100644 --- a/packages/aitube-timeline/src/components/timeline/Timeline.tsx +++ b/packages/aitube-timeline/src/components/timeline/Timeline.tsx @@ -4,7 +4,7 @@ import { useFrame, useThree } from "@react-three/fiber" import { DEFAULT_NB_TRACKS } from "@/constants" import { - useTimelineState + useTimeline } from "@/hooks" @@ -19,13 +19,13 @@ import { Cursor } from "./Cursor" export function Timeline({ width, height }: { width: number; height: number }) { const { size } = useThree() - const setContainerSize = useTimelineState(s => s.setContainerSize) + const setContainerSize = useTimeline(s => s.setContainerSize) useEffect(() => { setContainerSize({ width, height }) }, [width, height, setContainerSize]) - const contentHeight = useTimelineState(s => s.contentHeight) - const contentWidth = useTimelineState(s => s.contentWidth) + const contentHeight = useTimeline(s => s.contentHeight) + const contentWidth = useTimeline(s => s.contentWidth) // console.log(`re-rendering `) return ( diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 8ab8cac5..98f6d828 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -3,7 +3,7 @@ import React, { useRef } from "react" import { Plane, Text } from "@react-three/drei" import { -useTimelineState +useTimeline } from "@/hooks" import { hslToHex } from "@/utils" @@ -18,12 +18,12 @@ export function TopBarTimeScale() { // const { size } = useThree() // we should use the non-reactive version - const cellWidth = useTimelineState((s) => s.cellWidth) - // const cellWidth = useTimelineState.getState().horizontalZoomLevel - const contentWidth = useTimelineState((s) => s.contentWidth) - const contentHeight = useTimelineState((s) => s.contentHeight) + const cellWidth = useTimeline((s) => s.cellWidth) + // const cellWidth = useTimeline.getState().horizontalZoomLevel + const contentWidth = useTimeline((s) => s.contentWidth) + const contentHeight = useTimeline((s) => s.contentHeight) - const isResizing = useTimelineState(s => s.isResizing) + const isResizing = useTimeline(s => s.isResizing) const unit = 10 @@ -34,11 +34,11 @@ export function TopBarTimeScale() { let timestampInMs = 0 - const setHorizontalZoomLevel = useTimelineState((s) => s.setHorizontalZoomLevel) + const setHorizontalZoomLevel = useTimeline((s) => s.setHorizontalZoomLevel) // console.log(`re-rendering `) - const setTopBarTimelineScale = useTimelineState(s => s.setTopBarTimelineScale) + const setTopBarTimelineScale = useTimeline(s => s.setTopBarTimelineScale) return ( { const [axis, setAxis] = useState([] as THREE.BufferGeometry[]); - const contentHeight = useTimelineState(s => s.contentHeight) - const contentWidth = useTimelineState(s => s.contentWidth) + const contentHeight = useTimeline(s => s.contentHeight) + const contentWidth = useTimeline(s => s.contentWidth) useEffect(() => { const horizontalTop = new THREE.BufferGeometry().setFromPoints([ diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts index 7f956afc..e3da06bd 100644 --- a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts +++ b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from "react" import * as THREE from "three" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" import { useThree } from "@react-three/fiber"; import { leftBarTrackScaleWidth } from "@/constants/themes"; @@ -10,7 +10,7 @@ export const useCursorGeometry = () => { const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const contentHeight = useTimelineState(s => s.contentHeight) + const contentHeight = useTimeline(s => s.contentHeight) useEffect(() => { diff --git a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts index af2d251e..3c41d311 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts @@ -1,14 +1,14 @@ import { useEffect, useState } from "react" import * as THREE from "three" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" export const useHorizontalGridLines = () => { - const contentWidth = useTimelineState(s => s.contentWidth) - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const contentWidth = useTimeline(s => s.contentWidth) + const getVerticalCellPosition = useTimeline(s => s.getVerticalCellPosition) - const tracks = useTimelineState(s => s.tracks) + const tracks = useTimeline(s => s.tracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts index b9bd7c45..32a6d9c4 100644 --- a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts +++ b/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts @@ -1,13 +1,13 @@ import { useEffect, useState } from "react" import * as THREE from "three" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" import { leftBarTrackScaleWidth } from "@/constants/themes" export const useHorizontaTrackLines = () => { - const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const getVerticalCellPosition = useTimeline(s => s.getVerticalCellPosition) - const tracks = useTimelineState(s => s.tracks) + const tracks = useTimeline(s => s.tracks) const [lines, setLines] = useState([] as THREE.BufferGeometry[]); diff --git a/packages/aitube-timeline/src/hooks/useHoveredSegment.ts b/packages/aitube-timeline/src/hooks/useHoveredSegment.ts index 0a2da196..dfb782c5 100644 --- a/packages/aitube-timeline/src/hooks/useHoveredSegment.ts +++ b/packages/aitube-timeline/src/hooks/useHoveredSegment.ts @@ -1,8 +1,8 @@ import { useEffect } from "react" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" export function useHoveredSegment(segmentId: string): boolean { - const hoveredSegment = useTimelineState(s => s.hoveredSegment) + const hoveredSegment = useTimeline(s => s.hoveredSegment) useEffect(() => { const cursor = hoveredSegment ? 'pointer' : 'auto' diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 535e74ec..edbc1ea4 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -6,7 +6,7 @@ import { ClapSegment } from "@aitube/clap" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { similar, sliceSegments } from "@/utils" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" export const useSegmentLoader = ({ refreshRateInMs, @@ -25,32 +25,32 @@ export const useSegmentLoader = ({ // this will help us in case of fast canvas resize (eg. resize using the mouse) const size = { width: typeof window !== "undefined" ? window.innerWidth : canvasSize.width } - const segments = useTimelineState((s) => s.segments) - const segmentsChanged = useTimelineState((s) => s.segmentsChanged) + const segments = useTimeline((s) => s.segments) + const segmentsChanged = useTimeline((s) => s.segmentsChanged) // console.log(`segmentsChanged:`, segmentsChanged) - const loadedSegments = useTimelineState((s) => s.loadedSegments) - const setLoadedSegments = useTimelineState((s) => s.setLoadedSegments) + const loadedSegments = useTimeline((s) => s.loadedSegments) + const setLoadedSegments = useTimeline((s) => s.setLoadedSegments) - const visibleSegments = useTimelineState((s) => s.visibleSegments) - const setVisibleSegments = useTimelineState((s) => s.setVisibleSegments) + const visibleSegments = useTimeline((s) => s.visibleSegments) + const setVisibleSegments = useTimeline((s) => s.setVisibleSegments) const controls = useThree((state) => state.controls) // we do a little trick here, to put the camera zoom inside our Zustand store const camera = useThree(({ camera }) => camera) - const cellWidth = useTimelineState(s => s.cellWidth) - const getCellHeight = useTimelineState(s => s.getCellHeight) - // const getVerticalCellPosition = useTimelineState(s => s.getVerticalCellPosition) + const cellWidth = useTimeline(s => s.cellWidth) + const getCellHeight = useTimeline(s => s.getCellHeight) + // const getVerticalCellPosition = useTimeline(s => s.getVerticalCellPosition) // note: only the average height change will be detected const cellHeight = getCellHeight() // TODO: maybe refactor this, put it inside the Zustand state useEffect(() => { - useTimelineState.setState({ currentZoomLevel: camera.zoom }) + useTimeline.setState({ currentZoomLevel: camera.zoom }) }, [camera]) const stateRef = useRef<{ @@ -77,10 +77,10 @@ export const useSegmentLoader = ({ if (!stateRef.current) { return } // TODO: replace our usage of stateRef.current - // by useTimelineState.getState() + // by useTimeline.getState() const state = stateRef.current - const cellWidth = useTimelineState.getState().cellWidth + const cellWidth = useTimeline.getState().cellWidth // we can adjust this threshold to only re compute the geometry // when a significant shift has been done by the user @@ -138,7 +138,7 @@ export const useSegmentLoader = ({ // to take that into account too. (camera.zoom * 8) // 8 because 4 on left and 4 on right - const { segments } = useTimelineState.getState() + const { segments } = useTimeline.getState() // we only keep segments within a given range // those are not necessarily visible (there is a security margin) diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts index fbb7a384..9b896690 100644 --- a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts +++ b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from "react" import * as THREE from "three" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" // note: those bug for loop just to render graduations might not be efficient // maybe either we pre-compute everything and we let the runtime figure out what to render on screen, @@ -11,8 +11,8 @@ export const useTimeScaleGraduations = ({ }: { unit: number }) => { - const cellWidth = useTimelineState(s => s.cellWidth) - const nbMaxShots = useTimelineState(s => s.nbMaxShots) + const cellWidth = useTimeline(s => s.cellWidth) + const nbMaxShots = useTimeline(s => s.nbMaxShots) const [timeScaleGraduations, setTimeScaleGraduations] = useState([] as THREE.BufferGeometry[]); diff --git a/packages/aitube-timeline/src/hooks/useTimelineState.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts similarity index 97% rename from packages/aitube-timeline/src/hooks/useTimelineState.ts rename to packages/aitube-timeline/src/hooks/useTimeline.ts index 01bef482..4868dd8e 100644 --- a/packages/aitube-timeline/src/hooks/useTimelineState.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -15,7 +15,7 @@ import { TimelineCursorImpl } from "@/components/timeline/types" import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" import { findFreeTrack } from "@/utils/findFreeTrack" -export const useTimelineState = create((set, get) => ({ +export const useTimeline = create((set, get) => ({ ...getDefaultState(), setClap: async (clap?: ClapProject) => { @@ -25,15 +25,15 @@ export const useTimelineState = create((set, get) => ({ }) if (!clap || !Array.isArray(clap?.segments)) { - console.log(`useTimelineState: no clap to show`) + console.log(`useTimeline: no clap to show`) return } - (window as any).useTimelineState = useTimelineState + (window as any).useTimeline = useTimeline set({ isLoading: true }) - console.log(`useTimelineState: setting the clap to`, clap) + console.log(`useTimeline: setting the clap to`, clap) // we remove the big/long video const segments = removeFinalVideos(clap) @@ -53,6 +53,8 @@ export const useTimelineState = create((set, get) => ({ let defaultSegmentDurationInSteps = get().defaultSegmentDurationInSteps + let totalDurationInMs = 0 + // TODO: this whole approach is a bit weak, // having an heuristic is okay but we should do it: // track by track @@ -60,6 +62,8 @@ export const useTimelineState = create((set, get) => ({ // do something for images/videos that don't have the right ratio, // eg. add black banding for (const s of segments) { + totalDurationInMs = s.endTimeInMs > totalDurationInMs ? s.endTimeInMs : totalDurationInMs + if (s.category === ClapSegmentCategory.CAMERA) { const durationInSteps = ( (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP @@ -178,6 +182,7 @@ export const useTimelineState = create((set, get) => ({ loadedSegments: [], visibleSegments: [], segmentsChanged: 1, + totalDurationInMs, isEmpty, isLoading: false, diff --git a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts index 8eacd63c..5208f1ba 100644 --- a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts +++ b/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts @@ -1,16 +1,16 @@ import { useEffect, useState } from "react" import * as THREE from "three" -import { useTimelineState } from "./useTimelineState" +import { useTimeline } from "./useTimeline" import { NB_MAX_SHOTS } from "@/constants/grid" export const useVerticalGridLines = () => { - const cellWidth = useTimelineState(s => s.cellWidth) - const contentHeight = useTimelineState(s => s.contentHeight) - const tracks = useTimelineState(s => s.tracks) + const cellWidth = useTimeline(s => s.cellWidth) + const contentHeight = useTimeline(s => s.contentHeight) + const tracks = useTimeline(s => s.tracks) const [gridlines, setGridLines] = useState([] as THREE.BufferGeometry[]); - const nbMaxShots = useTimelineState(s => s.nbMaxShots) + const nbMaxShots = useTimeline(s => s.nbMaxShots) useEffect(() => { diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 852b912a..fad34e59 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -29,7 +29,7 @@ export { useAxis, useVerticalGridLines, useHorizontalGridLines, - useTimelineState, + useTimeline, useSegmentLoader, } from "./hooks" @@ -56,6 +56,9 @@ export { } from "./utils" export { + Track, + Tracks, + ContentSizeMetrics, RenderedCell, TimelineStore, TimelineStoreState, @@ -64,8 +67,9 @@ export { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, - type SegmentRenderer + type SegmentRenderer, } from "./types" + export { ClapTimeline } from "./ClapTimeline" diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index 7af46d73..a353a0cc 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -4,6 +4,9 @@ export { } from "./grid" export { + Track, + Tracks, + ContentSizeMetrics, TimelineStore, TimelineStoreState, TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 44e316cc..46f55072 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,5 +1,5 @@ import * as THREE from "three" -import { ClapEntity, ClapProject, ClapSegment } from "@aitube/clap" +import { ClapProject, ClapSegment } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" @@ -49,6 +49,7 @@ export type TimelineStoreState = { segments: ClapSegment[] segmentsChanged: number + totalDurationInMs: number loadedSegments: ClapSegment[] visibleSegments: ClapSegment[] nbIdentifiedTracks: number diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 9316d40a..350c9ed7 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -11,6 +11,7 @@ export function getDefaultProjectState() { clap: undefined, segments: [], segmentsChanged: 0, + totalDurationInMs: 0, loadedSegments: [], visibleSegments: [], diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/aitube-timeline/src/utils/getTextLength.ts index bb3463ca..b0da9bef 100644 --- a/packages/aitube-timeline/src/utils/getTextLength.ts +++ b/packages/aitube-timeline/src/utils/getTextLength.ts @@ -7,7 +7,7 @@ * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 */ -import { useTimelineState } from ".." +import { useTimeline } from ".." function getTextWidthInCanvas(text: string, font: string) { if (typeof window === "undefined") { @@ -43,7 +43,7 @@ const webglFontWidthFactor = 1.7 */ export function getWebGLCharWidth(char: string = ""): number { - const cellWidthInPixels = useTimelineState.getState().cellWidth + const cellWidthInPixels = useTimeline.getState().cellWidth let responsiveHack = 1.5 From 06363e13206959d85280b1523b09deab1b4cafe6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 9 Jun 2024 13:45:19 +0200 Subject: [PATCH 127/346] 0.0.18 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/Cell.tsx | 2 +- .../src/components/cells/TextCell.tsx | 2 +- .../components/controls/TimelineControls.tsx | 14 ++-- .../aitube-timeline/src/components/index.ts | 4 +- .../src/components/timeline/Cursor.tsx | 4 +- .../components/timeline/TopBarTimeScale.tsx | 54 +++++++++++-- .../src/components/timeline/index.ts | 3 +- .../src/components/timeline/types.ts | 14 +++- .../aitube-timeline/src/hooks/useTimeline.ts | 27 +++++-- packages/aitube-timeline/src/index.tsx | 3 +- .../aitube-timeline/src/types/timeline.ts | 80 ++++++++++++------- .../src/utils/getDefaultState.ts | 20 +++-- 13 files changed, 162 insertions(+), 67 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 7bf10944..841e2582 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.17", + "version": "0.0.18", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index c247dd25..70340a28 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -112,7 +112,7 @@ export function Cell({ onClick={(e) => { - console.log('click on cell ' + s.id) + // console.log('click on cell ' + s.id) e.stopPropagation() return false }} diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 3519404d..f7f11a30 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -146,7 +146,7 @@ export function TextCell({ // in the function which computes a character's width fontWeight={400} onClick={(e) => { - console.log('click on text in cell ' + s.id) + // 'click on text in cell ' + s.id) e.stopPropagation() return false }} diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index eb03ccae..50d11d55 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -39,11 +39,11 @@ export function TimelineControls({ timelineCursor, contentHeight, leftBarTrackScale, - topBarTimelineScale, + topBarTimeScale, resizeStartedAt, width, height, - cursorTimestampAt, + cursorTimestampAtInMs, } = useTimeline.getState() const now = performance.now() // new Date().getTime(), @@ -113,15 +113,13 @@ export function TimelineControls({ if (timelineCursor) { - const positionInSteps = ( - (cursorTimestampAt * 1000) / DEFAULT_DURATION_IN_MS_PER_STEP + timelineCursor.position.x = ( + (cursorTimestampAtInMs) / DEFAULT_DURATION_IN_MS_PER_STEP ) * cellWidth - - timelineCursor.position.x = positionInSteps } - if (topBarTimelineScale) { - topBarTimelineScale.position.y = (-topBarTimeScaleHeight + scrollY) + (size.height / 2) + if (topBarTimeScale) { + topBarTimeScale.position.y = (-topBarTimeScaleHeight + scrollY) + (size.height / 2) } if (leftBarTrackScale) { diff --git a/packages/aitube-timeline/src/components/index.ts b/packages/aitube-timeline/src/components/index.ts index 273bbcb1..f5ff2aad 100644 --- a/packages/aitube-timeline/src/components/index.ts +++ b/packages/aitube-timeline/src/components/index.ts @@ -4,9 +4,9 @@ export { ImageCell, VideoCell, TextCell, - SpecializedCellProps + type SpecializedCellProps } from "./cells" export { TimelineControls } from "./controls" export { HorizontalScroller, VerticalScroller } from "./scroller" -export { Timeline, TopBarTimeScale, Cells, Grid } from "./timeline" \ No newline at end of file +export { Timeline, TopBarTimeScale, Cells, Grid, type JumpAt } from "./timeline" \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx index 96dcf692..08e545dc 100644 --- a/packages/aitube-timeline/src/components/timeline/Cursor.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -5,7 +5,7 @@ import { } from "@/hooks" import { useCursorGeometry } from "@/hooks/useCursorGeometry" -import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" +import { leftBarTrackScaleWidth } from "@/constants/themes" export function Cursor() { const setTimelineCursor = useTimeline(s => s.setTimelineCursor) @@ -21,7 +21,7 @@ export function Cursor() { position={[ leftBarTrackScaleWidth, (contentHeight / 2), - -5 + -4 ]} ref={r => { if (r) { diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 98f6d828..7ed2dfe2 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -10,12 +10,17 @@ import { hslToHex } from "@/utils" import { useTimeScaleGraduations } from "@/hooks/useTimeScaleGraduations" import { DEFAULT_DURATION_IN_MS_PER_STEP, NB_MAX_SHOTS } from "@/constants/grid" import { formatTimestamp } from "@/utils/formatTimestamp" -import { useFrame, useThree } from "@react-three/fiber" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" +import { useThree } from "@react-three/fiber" export function TopBarTimeScale() { - // const { size } = useThree() + const { size } = useThree() + + const jumpAt = useTimeline(s => s.jumpAt) + const togglePlayback = useTimeline(s => s.togglePlayback) + + const wasPlayingRef = useRef(undefined) // we should use the non-reactive version const cellWidth = useTimeline((s) => s.cellWidth) @@ -32,19 +37,21 @@ export function TopBarTimeScale() { unit }); - let timestampInMs = 0 + let timestampInMs = -DEFAULT_DURATION_IN_MS_PER_STEP const setHorizontalZoomLevel = useTimeline((s) => s.setHorizontalZoomLevel) // console.log(`re-rendering `) - const setTopBarTimelineScale = useTimeline(s => s.setTopBarTimelineScale) + const setCursorTimestampAtInMs = useTimeline(s => s.setCursorTimestampAtInMs) + const setIsDraggingCursor = useTimeline(s => s.setIsDraggingCursor) + const setTopBarTimeScale = useTimeline(s => s.setTopBarTimeScale) return ( { if (r) { - setTopBarTimelineScale(r) + setTopBarTimeScale(r) } }} position={[-leftBarTrackScaleWidth, 0, -3]} @@ -60,6 +67,43 @@ export function TopBarTimeScale() { ) e.stopPropagation() }} + onPointerDown={(e) => { + const cursorX = e.point.x + (size.width / 2) + const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP + const { wasPlaying } = togglePlayback(false) + wasPlayingRef.current = wasPlaying + setCursorTimestampAtInMs(cursorTimestampAtInMs) + setIsDraggingCursor(true) + jumpAt(cursorTimestampAtInMs) + e.stopPropagation() + return false + }} + onPointerUp={(e) => { + setIsDraggingCursor(false) + if (typeof wasPlayingRef.current === "boolean") { + if (wasPlayingRef.current) { + togglePlayback(true) + } + } + e.stopPropagation() + return false + }} + onPointerMove={e => { + // TODO move this into the whole parent container? + // the problem is.. are we still gonna get events + + // console.log(e) + // handle the "timeline cursor drag" + if (e.pressure > 0) { + const cursorX = e.point.x + (size.width / 2) + const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP + // console.log(`setCursorTimestampAtInMs(${cursorTimestampAtInMs})`) + setCursorTimestampAtInMs(cursorTimestampAtInMs) + jumpAt(cursorTimestampAtInMs) + } + e.stopPropagation() + return false + }} > \ No newline at end of file +export type TimelineCursorImpl = Group + +// application-provided callback used to seek into a specific timestamp +export type JumpAt = (jumpAtInMs: number) => void + +// application-provided callback used to determine if we are playing back a stream or not +export type IsPlaying = () => boolean + +// application-provided callback used to toggle the playback +export type TogglePlayback = (forcePlaying?: boolean) => { + wasPlaying: boolean + isPlaying: boolean +} diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 4868dd8e..9a411fc6 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -11,7 +11,7 @@ import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, Seg import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" -import { TimelineCursorImpl } from "@/components/timeline/types" +import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" import { findFreeTrack } from "@/utils/findFreeTrack" @@ -33,7 +33,7 @@ export const useTimeline = create((set, get) => ({ set({ isLoading: true }) - console.log(`useTimeline: setting the clap to`, clap) + // console.log(`useTimeline: setting the clap to`, clap) // we remove the big/long video const segments = removeFinalVideos(clap) @@ -313,8 +313,8 @@ export const useTimeline = create((set, get) => ({ setTimelineControls: (timelineControls?: TimelineControlsImpl) => { set({ timelineControls }) }, - setTopBarTimelineScale: (topBarTimelineScale?: THREE.Group) => { - set({ topBarTimelineScale }) + setTopBarTimeScale: (topBarTimeScale?: THREE.Group) => { + set({ topBarTimeScale }) }, setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => { set({ leftBarTrackScale }) @@ -376,10 +376,23 @@ export const useTimeline = create((set, get) => ({ setTimelineCursor: (timelineCursor?: TimelineCursorImpl) => { set({ timelineCursor }) }, - setCursorTimestampAt: (cursorTimestampAt: number) => { - set({ cursorTimestampAt }) + setIsDraggingCursor: (isDraggingCursor: boolean) => { + set({ isDraggingCursor }) + }, + setCursorTimestampAtInMs: (cursorTimestampAtInMs: number = 0) => { + if (cursorTimestampAtInMs !== get().cursorTimestampAtInMs) { + set({ cursorTimestampAtInMs }) + } + }, + setJumpAt: (jumpAt: JumpAt) => { + set({ jumpAt }) + }, + setIsPlaying: (isPlaying: IsPlaying) => { + set({ isPlaying }) + }, + setTogglePlayback: (togglePlayback: TogglePlayback) => { + set({ togglePlayback }) }, - // this function has an issue, it saves stuff as .txt, which is bad saveClapAs: async ({ embedded, diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index fad34e59..3576af9d 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -10,7 +10,8 @@ export { ImageCell, VideoCell, TextCell, - type SpecializedCellProps + type SpecializedCellProps, + type JumpAt } from "./components" export { diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 46f55072..4ee90c61 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -4,7 +4,7 @@ import { ClapProject, ClapSegment } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" -import { TimelineCursorImpl } from "@/components/timeline/types" +import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" import { RenderingStrategy, SegmentRenderer } from "./rendering" export type Track = { @@ -34,18 +34,10 @@ export type ContentSizeMetrics = { defaultPreviewHeight: number } -export type TimelineStoreState = { - // used to track the timeline state - // this helps informing parent app user - // that the timeline has been recreated inside the React tree for instance - isReady: boolean - // container width and height - width: number - height: number - + +export type TimelineStoreProjectState = { clap?: ClapProject - theme: ClapTimelineTheme segments: ClapSegment[] segmentsChanged: number @@ -90,6 +82,38 @@ export type TimelineStoreState = { hoveredSegment?: ClapSegment + isDraggingCursor: boolean + + // used to track current camera position, at zoom level 1.0 + scrollX: number + scrollY: number + + // used to determine how long it has been since we touch the scroll + // we use this information to render the grid faster, by disabling all text + // until a given debouncing time has elapsed + resizeStartedAt: number + isResizing: boolean + + // the final video, if available + finalVideo?: ClapSegment + + // position of the current timestamp + cursorTimestampAtInMs: number +} + + +export type TimelineStorePreferencesState = { + // used to track the timeline state + // this helps informing parent app user + // that the timeline has been recreated inside the React tree for instance + isReady: boolean + + // container width and height + width: number + height: number + + theme: ClapTimelineTheme + /** * The timeline camera * @@ -107,34 +131,24 @@ export type TimelineStoreState = { // ref to the cursor element timelineCursor?: TimelineCursorImpl - // used to track current camera position, at zoom level 1.0 - scrollX: number - scrollY: number - - // used to determine how long it has been since we touch the scroll - // we use this information to render the grid faster, by disabling all text - // until a given debouncing time has elapsed - resizeStartedAt: number - isResizing: boolean - - topBarTimelineScale?: THREE.Group + topBarTimeScale?: THREE.Group leftBarTrackScale?: THREE.Group - // the final video, if available - finalVideo?: ClapSegment - - // position of the current timestamp - cursorTimestampAt: number - imageRenderingStrategy: RenderingStrategy videoRenderingStrategy: RenderingStrategy soundRenderingStrategy: RenderingStrategy voiceRenderingStrategy: RenderingStrategy musicRenderingStrategy: RenderingStrategy - segmentRenderer?: SegmentRenderer + // those can be overridden + segmentRenderer: SegmentRenderer + jumpAt: JumpAt + isPlaying: IsPlaying + togglePlayback: TogglePlayback } +export type TimelineStoreState = TimelineStoreProjectState & TimelineStorePreferencesState + export type TimelineStoreModifiers = { setClap: (clap?: ClapProject) => Promise @@ -148,13 +162,17 @@ export type TimelineStoreModifiers = { setHoveredSegment: (hoveredSegment?: ClapSegment) => void setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => void setTimelineControls: (timelineControls?: TimelineControlsImpl) => void - setTopBarTimelineScale: (topBarTimelineScale?: THREE.Group) => void + setTopBarTimeScale: (topBarTimeScale?: THREE.Group) => void setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => void handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number; deltaY: number }) => void toggleTrackVisibility: (trackId: number) => void setContainerSize: ({ width, height }: { width: number; height: number }) => void setTimelineCursor: (timelineCursor?: TimelineCursorImpl) => void - setCursorTimestampAt: (cursorTimestampAt: number) => void + setIsDraggingCursor: (isDraggingCursor: boolean) => void + setCursorTimestampAtInMs: (cursorTimestampAtInMs?: number) => void + setJumpAt: (jumpAt: JumpAt) => void + setIsPlaying: (isPlaying: IsPlaying) => void + setTogglePlayback: (togglePlayback: TogglePlayback) => void saveClapAs: (params: { // if embedded is true, the file will be larger, as all the content, // image, video, audio.. diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 350c9ed7..a719a0fa 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -1,12 +1,12 @@ import * as THREE from "three" import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" -import { TimelineStoreState } from "@/types/timeline" +import { TimelineStorePreferencesState, TimelineStoreProjectState, TimelineStoreState } from "@/types/timeline" import { RenderingStrategy } from "@/types" import { NB_MAX_SHOTS } from "@/constants/grid" // those settings will change between .clap project reloads -export function getDefaultProjectState() { +export function getDefaultProjectState(): TimelineStoreProjectState { return { clap: undefined, segments: [], @@ -55,27 +55,35 @@ export function getDefaultProjectState() { finalVideo: undefined, - cursorTimestampAt: 0, + cursorTimestampAtInMs: 0, + isDraggingCursor: false, } } // those settings will NOT changes between .clap project reloads -export function getDefaultPreferencesState() { +export function getDefaultPreferencesState(): TimelineStorePreferencesState { return { isReady: false, width: 1024, height: 800, theme: pastel, timelineControls: undefined, - topBarTimelineScale: undefined, + topBarTimeScale: undefined, leftBarTrackScale: undefined, timelineCursor: undefined, + imageRenderingStrategy: RenderingStrategy.ON_DEMAND, videoRenderingStrategy: RenderingStrategy.ON_DEMAND, soundRenderingStrategy: RenderingStrategy.ON_DEMAND, voiceRenderingStrategy: RenderingStrategy.ON_DEMAND, musicRenderingStrategy: RenderingStrategy.ON_DEMAND, - segmentRenderer: undefined, + + // note: those are stateless functions, use as empty + // mocls that are normally overriden at runtime + segmentRenderer: async (params) => params.segment, + jumpAt: () => {}, + isPlaying: () => false, + togglePlayback: () => ({ wasPlaying: false, isPlaying: false }) } } From ecd10483d9948c4a0815aeaf003fb300ae6f28d0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 9 Jun 2024 16:54:05 +0200 Subject: [PATCH 128/346] 0.0.19 --- packages/aitube-timeline/bun.lockb | Bin 160224 -> 159709 bytes packages/aitube-timeline/package.json | 2 +- .../components/controls/TimelineControls.tsx | 7 ++- .../components/timeline/TopBarTimeScale.tsx | 48 ++++++++++++++++-- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 2f7012c910744a171a9335c52399bdf044b58bcb..174459a8c4973bb1f63210574296cdae27d14db2 100755 GIT binary patch delta 15131 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 tLH=n|vv83J^bZLP3=9ejjA@CKLF(j$iM&q delta 15558 zcmeHud3;S**Z@o z60#oT9LV~R<8*tH&g1p+HoDzUw>v^Mg#U}0TD@D4PT&_H$$l7;+TE&`FN381W@Y4UA1oO&vEzlH%)1k_Y)ixL%ZXYNPMh;0pNLx}4-JNoYB@91=Bid+7EQ3=%`m?FUJ#(%V(5=LcB} zocbX75aqO*dEls;I~$VvD}f(mPVPhuiW)ctNfrKGLzV^@f};WH4doiqIt|DhlRzCf z>2kvGl)=N1X(<`WS;>(3uv0*jF`Kp$f2)RftFD;GCNMRJq$#u0yR|h!OgYs zE`n39sd_!TAkA+?Mo@Ors8lIw?65IOV>6Ov*ip|hH#%5rAP|z)<0LP&a&j2gLR;44 zj4@-AF@1M=B?fywLT@UESX^-hxWRRhopvwBqxsvO39EO=oNqF zr3O#0U!t_`Zs>AMP-@!Xq)fP`ri@C-lx}cV(}^wNE;T*bJ>I2eG26zOb(;T@R$4g2 zlQM#^9>XjvYe~JADO|MN+M3CZ-bL$e;%m5kJw}V(W2837db)gvvpSw^FZZhB6gM7= zO-WK`f_8Zr0#4VNc*us3UyRVon`UV#n3_U4EJ+pM6lgxruH%_wY2{yQBQ4cd!Y4~o zQ+Qv2Yz*lLiJ8fLG)YfgT^@y`_1rsE>vc0YrSw2ZO6dhU9}kJ^L2frlY>;}nZJ^~2%Ca3}D0=L;#bBe1@RUtOYn|V( z!MAs6BL`XWpE||Lqpf&=do0_;Q{0X00nc|gDv<_BYJ=7pPwyMe3_QRimL1_K9!A4a zT*lk;Q64b{D;r7bsA^rIbyl@S(6rJoU)maB)-=B%(6rJm(6k!&p>t=(z$Y@ew|;hLM=uclaou7{f_ueN@fU!D5>Tt(R&$2d%%V1t61BREV<*=M{Gwwlg7z&}=wbLJ!bW0iN2Mjf%VGOrpOZ3EI?UFX7q(KblD z)*v-_m1~ro?ZQU{#3~1LqYba}kCJm-`A;yOK*~~j)Z|s}QA#a0jTwl^9o_iWz*uDq zjBja;1w<(?z+%DBNW)IUn;4o1O9ywE+0M(fn?3jG-QObTki& zZo|BIKxiy3Fe#x%LmKX7WBFb87()fL-lQp!zLNBYIsi;9+rU%8jI4_1hZ&UtO{L!C_`wNgsEU5VAi}aFiJTE))|cP!o+ARe-!b% zt}%u6na*JSEyF`v&r@(Fih7E5daLEzalut&E0yu(eaeYK!=3RWKk7Zw8oA?Y*#BlyVHL zoyw}3M;W|==n8^0Ql>zo&eWw>iomoH(?EU(qdFK!^C+b~Zo|Z^)K#7d_L{nO=b>ra zg0fM;?U^RbK!catw%{Y$#2Ti;7(*8rR>CXW7}+E4-_|Ji3gIK##>%rp_|~?u$`6=W zs%XX2v3^dWmVuxdr3VN3{}dOiq~pF%$$>#eMJXje8 zDl1{6{?xI^7b5wH&{#uFJSDVNgKP(l)=AxQN){M7BhN6n9Xi7$0LlFnOxxPTqESf? z3T!+WwW4|MfJ&{@P_HV#=$?{#NeF7i13JbkgYnow7XhRI)@TD5%`|oclI0c{HKwJ9 zCo-ZhFEGZiBA(L8Smf8arxm~9;>R1i+7xZ+wy+-03JWP3o@muTi9sa^$3|Y^5=iBS z>lv64!J4peqH?25zI9xzG9uHG-8AWU!6@sjd3yV3Hja-NAFGTXr!8|W$~~nVjAB)p z!EQXt_}w-!hIe0Tr=cN-VQVx2zN*&mrM3bZQmRdi@;zy236})yBvY0o4FFU3pi%^e z4M6FJr1=R<-wRlE-)u{oAnjNpugo^G?c9H&k=>!Qq4`AWKWJi%VKlT@Rof1&BWcR7 z(7LMqV6qKkCQH%?^{V+4+5lC1dx|6_s@gtiZ>hV{ZmM=)!S$tev<(PdRx#8TQHIlC z2nZLZx;ff@((H*~-PC5blU>!GLBj}e;NQS2~t$T zQ>ru=kbz`?j#nl54FyOJ1Lz=0{wYLokgN%$0kouJ0rJNlRgWA}r~sQuJzkaMh|Qx` zz}8R?lH@-LpmLztTBLD!(l8 z{WEH*b8uNVeXYBYq*%Yz?N@a>Nh_d2w_n%o|38w3bi*E^0Dsry<7x)kMC!q~dNmCrP}!F5@Aos3)CtX$@)CIZ0ZUzB(sK?GM!LgCMDB zh%Sf9*m~5#FtYv|Nga*WD~^Grb5wiLH&J0LTbwo8lWc+X5kcvu{ z`P4AHz;;)7;a6rJy~>t1xZKG=cd^>MVx^hihNZ(Q6SL)ctIT}ahqnA7m_3jC(9G)c z$P%o_51oSisZYi7>856&*U5NB7etTQt=o`kbI zFTvS^JFGXeMmz;)PhN_1WA3uS%)EFy&ffeK&OY4hBQx{m**G`h7jSOM{WqFfGd>Mx zKmIk&{ycP(nFa89I0y0yoSXAjo6RhU=iwa8D{*eYE`I>&+APnEBg#ZTTKBGiQ6v+@{!;C+{_}KD-cY zA6SE86MKgz6(hcVh!3nkci4ycN)X>Z6C21&!OFmzl$cl&PcK1y`w<`5VD7aa@f|>X z`%NsFUjVxd7IDDDhVf|!5Z^(>2bRJ^4v`-*FSm;iX_@U`xMSNw5?^6?dk5_=*2J28}!W+`OGQ@WZ z@qvB7<4z&I(}?es2`|8_z#fD3K5b&0uRD$S&LF-sCj5_E!WqPO7V&`z&dwsfbBOP( zi7n@aVEe!toHMbNJn0@rxy1ryuMr(HmN7ZD#=J`cT!_&!H`7fty8zY4J1U>!a;;hl2c z=ZNnT;se{s<1Qh-FA(1)6D#CZV2{Cie__IFxOHD3zAq8qmnOD{Cwz(czCwIp#hl^V zWOEtuePt?2ynNHpE-uY_?zz<2^&h$3xpBD5!1>2!%u6!6-~3? zC1&8AN9QKCe>ePjRl8+(#@`#YGP~K(#6!>Jl%iSR-F9uads5;`=Vu#sow#RT{$7Fm z)j$PaN#>RI2 zd{^9!ik&-GzJGRDVg0=2ZmCPIj&!!h)t5;x?CC0;CYCp3X3^P+*^1{48IoLdaf0D7 z848?W$PiD+u*DgM{?0Ir6Zy_CyzK&mtqTkjL?0IzY+PYDM22jkxWcfH45M6Om?TQb zFx(9W4>uU5h!i&%oZVqKM}{2X;toR@8K$_yFio5yLzV{&K^`#75ZN9u_%(vzDj8-8 z|3)xeCd2$jFw7BOlVPqW3~fDOm?!3W!VujUhPz~VPqb58-~YZDDZ}Xizj5*;sZl}9~hR1d>>|JON*H=>&5te^_{L& zqtQvD(^7`u^$`BVw8JY$dSpw^7&I;=b%^w_LA>x~ZxxpZvgSl6+aH)%}?2+V1nz{s;RQr0QX=g`WdtW~L;M zt>GmW1hS@vd@uZLK&?z&-luANgV-`=NDIOcUlwGkV@Yj+v2?{NdgYbwv;k{p1X{oN z{cyI-mNXirRk2?j6Fo(uFAG&Tk_$)q5>b}N@a}pM8|LpqbAV&2nt zl^$Dmh`dFtUfZ2|(KNk?{vuHR#Qu z3kbcjq(kVHU7?QvsF7u`(S+c+SsJO^R_K22;G+OKR_cBp&_@GQ_e0&*2zoqp8o(O8 zF49oyNh?FfwYsq}bi8v{2enSOd4W#^sI&FD%^Ug{fI8ct+kBwE0i8PgNViE#q2O4& zN{n8~yv3!(EYm1JZn{OI09iV69;Xq39Jh-q9^s?z0K!1JC1?BmRy^hz)y%|BZf5>pchf}GRq_q1dCCAL^1t8LbzBWaG}{F?h4i;2U}D64!8z<58MUr z0lx!}fvlLEsQ@ z1UL#z2BrX+z;U21M(7PZL>)DAp(g-u0KEXZK3D^vqnxf@N0}t9tzb${A}V)8K`S5` zI=%1o0!pA09}Li*+z&}xj<#4TKwF5mOb?(ZK)WIX7za!OvH;o@vj3)n6JrK=cS45y0^S27>gT9mG2ZZ0&9i2zM07EoQt7|7P*;Y!xR zmXfe8Kv$^RB6JmV@=&1u14k`Lx+2;Ewm>tWspzwcnQdD^tqnv2QR2`l7L(Hk>RZ6; zKsz87XbTv1Jr43UpaakzcmwDH^aMHqJ%EltH-PM9>kOCx$}ZyFfq0-dK=r9^0`Mli z5$~lN-i9;-wAJ1L`T%`_en29S2Yduj{!!vA0Nw*AC$|Fy!27@&fbw%2uoV~zz-C}0@DZ>9 zAUkoAv=lpm9l$Q25ZDb+Tit*?z+NB`D4~Z61&ShOt-;e+iuigB8_euP+qEnlEPX9A zI@qE7Ti_~S0PIBRS~fU|0{`#Fw0FApH@EEZ8QqZKg2I$e+06d3I zllKhx1E5KsEM~1^K1tL>O}JR9lN)6fH7S7FD5IpP1!);dBKQMWCn(L*dfT`dCg0DAhOCpCJ4qbIv}fw{tA6LZ4f8l@YVn<(Fi$$NRS zB}Zz2DlSkR9mr%0P$1NgYHq>a6>*zbJx6+=aRJIV7B&?>e+s>RLEkB}P?H02C^UA?} zt350~vk!S~#lYg4_HuQ}=$fJ*>bmK_%+Eb0-Rsn}Qf^o6u}plhow-CXLERVh8HF zSw3*v+GC}tz%bYj@du42%T6@h!NMXeKlMLQzoBFQ50+22Vl9J1qiL2WnkaB;FYhv^8_4X&K9W0+TL^Ugj4*R3LV|B@X(S0Wd zVfhB)&F_w^oAY3rYqi5OF%1rKgSuiB`f#^=L}7pZLTK}6XP#9%#@7|)J6V{!pPogc~LG(Ft z&#>ydyMAZ@SsxsV-Q=wO4Q@`j)V=?&rz+GP5kgJ(a}oE@l$+&Si7nYL(!$re#aXcd zs7bv)6kdhQ#ogIeeLTv2{B+XrV{b3sC^H5Ndd~H872ob=&OJJTW6g4h^f`WPwf$Oy z%)(%40E^{&iQb>z@tv4fw-36H)*>4V4_kPI)~fnBpksY2l)zFSmJ)FY-9}oz&3K;5 zc8&3Fe+3R$Wg5BVD-I9u3ZJ8jcL_=&5iLq2H&F)zayc#C%kBv;3|;zQwWiE~k&zS9@2-^-z?;LDpx* z-SUx1U$*L-j=!%NqYo2(utuV85i;XXhS>_2D_o8AHe@GHF#w*jx2MP|Vqq*_Y%5~j z<;jhUpBAy1jQuQf_Ml6o$Jqmj+ww(0Lqi{rc#j#UWELG95k)ieLY#wRMSBt_cJTdbzKmajBi%JP(}vvzHR2kn7yJj8ly-)}Ui zTXJb(kjoX#*EXJj0l`x*g((Ob` zlwk|j?e6`2%K6^vDAcq#E=Ix6&GMB@#oTW)3*%4Qs1A{|kA4&D;2_)ih=awL3(Lni ztwT+3x=y>cUF}iba9w@GeR!ZtWgiQyHP=`BG~%@;B6c6Py5%b!Px<uiJ= za~N%FHJsfopYlX64O;AV+z}gVYKWGD@HmVb?1rd1j2M3rwU4mw5jT)~wGm#6&9O&+ zoHb|)dO&v2;4NPnjcmJkZu;lneu|O^t)xWEKY|vPh|Nb>2PM0;_Vdwu;^7e%Ui{io zcB}?2`-T&2S&hiZXtDML3-buad)2{7sYyeUpQRpu-u<1dfoP7l4K|kgNYt>{@Co}y z)}D`s>5oZbP#JSYzDz0m^F4ua(p)SNg=H+q!^1ou47c`+JKUpJ7(76g!<~Q4IU8xMw*Vtq0;F zE?;D>_>`&m!9`Z929&*DvhB4+-|yLU_Kqm1K`L(>k@KhycqTa3l~eTvv|4A1QGuOa~3bIvzAP& zX|XZYue&bfrdh)326~Ol(%wnui>Mp;^Q%IPyn&^S7il*khKM!9#*300Y>&k_Ud+46 zs2vi*_eZQy8)5tr_bUB6rre~N$4#5Z4s0khS|AKjvV8fp+Aj6N+^z=}RhNtx^HJ5! z@=4Uh-b1bP20FZ7?XX#t!hszX-;lT>aw;Jn3Hw{P;afhy%1=li+`<0Qoa$QPlSTVm zYyj&cLVt#TA5nUnd7<{TTdae|y8jn~JgFbIzaFV_(d$G7l52YSzc z;`h%3@RA)Ti&}SBd%cDja|elIm?qx8!@_En-_!ooDE~#2-C^zU7XTf?<}M47r#BR> z@3PgccV%k#3^{Ptz@?k(+&KYmkBqVZdfA*mmYzBEIXGR&q&t^xo<83;M7poF**U$~ z@gDQD64(06*5b6EoLk)bSGF*+IKf|DVeJ?aoH=YF?qear;UOU*p%Kwh#m__JW6t7@ gUs>bgYh7eFXRW4jpzO#ZM4_+jUHnIqeBJgx0N8LC;s5{u diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 841e2582..2320c9b7 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.18", + "version": "0.0.19", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index 50d11d55..2a7819a8 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -70,7 +70,7 @@ export function TimelineControls({ // note: contentHeight seems to depends on cellWidth zoop, // because when we change the horizontal "zoom" (the cellWidth) // this messes up our calculation - const maxHeight = contentHeight // 820 + const maxHeight = Math.max(670, contentHeight) // 820 const minHeight = 0 const maxTopBottomSize = maxHeight / 2 if (height >= maxHeight) { @@ -94,7 +94,10 @@ export function TimelineControls({ // but make sure the timeline still works properly when you change its height, // horizontal zoom, and number of tracks -topBottomSize + PROMPT_STEP_HEIGHT_IN_PX, // to take to top time scroll bar into account - topBottomSize + 38, + + // the +38px as here to represent the top scroll bar, + // but I'm not so sure we need it anymore? + topBottomSize //+ 38, ) // console.log(`scrollY=${Math.round(scrollY)}`) diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 7ed2dfe2..22bbc442 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -1,4 +1,4 @@ -import React, { useRef } from "react" +import React, { useEffect, useRef } from "react" import { Plane, Text } from "@react-three/drei" @@ -26,8 +26,7 @@ export function TopBarTimeScale() { const cellWidth = useTimeline((s) => s.cellWidth) // const cellWidth = useTimeline.getState().horizontalZoomLevel const contentWidth = useTimeline((s) => s.contentWidth) - const contentHeight = useTimeline((s) => s.contentHeight) - + const isResizing = useTimeline(s => s.isResizing) const unit = 10 @@ -47,6 +46,48 @@ export function TopBarTimeScale() { const setIsDraggingCursor = useTimeline(s => s.setIsDraggingCursor) const setTopBarTimeScale = useTimeline(s => s.setTopBarTimeScale) + // it can be annoying to have to be exactly on the right top bar track when dragging the cursor + // to improve the UX, we allow the user to move the mouse ANYWHERE on the screen while doing so + useEffect(() => { + const onMouseMove = (evt: MouseEvent) => { + const { + isDraggingCursor, + timelineCursor, + topBarTimeScale, + timelineCamera + } = useTimeline.getState() + if (!timelineCursor || !isDraggingCursor || !topBarTimeScale || !timelineCamera) { return } + + // if we are actualling pressing a button + if (evt.buttons) { + const mouseX = evt.x + + const newPositionOfTheCursorX = mouseX //- leftBarTrackScaleWidth + // TODO: take the left column into account for the calculation + + const positionInsideTheTimelineX = newPositionOfTheCursorX + timelineCamera.position.x + + const newCursorTimestampAtInMs = (positionInsideTheTimelineX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP + + setCursorTimestampAtInMs(newCursorTimestampAtInMs) + jumpAt(newCursorTimestampAtInMs) + } else { + // user stopped pressing the mouse outside the timeline area + + setIsDraggingCursor(false) + if (typeof wasPlayingRef.current === "boolean") { + if (wasPlayingRef.current) { + togglePlayback(true) + } + } + } + } + document.addEventListener("mousemove", onMouseMove) + return () => { + document.removeEventListener("mousemove", onMouseMove) + } + }, []) + return ( { @@ -97,7 +138,6 @@ export function TopBarTimeScale() { if (e.pressure > 0) { const cursorX = e.point.x + (size.width / 2) const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP - // console.log(`setCursorTimestampAtInMs(${cursorTimestampAtInMs})`) setCursorTimestampAtInMs(cursorTimestampAtInMs) jumpAt(cursorTimestampAtInMs) } From 6fa8f7760b4044f60ad57e4943a32131840d00a2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 10 Jun 2024 17:09:38 +0200 Subject: [PATCH 129/346] less logs --- packages/aitube-engine/package.json | 2 +- packages/aitube-engine/src/prompts/getVideoPrompt.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index be274793..c6b605af 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.16", + "version": "0.0.17", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index e5eadb07..0db197db 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -12,7 +12,8 @@ import { getCharacterPrompt } from "@/prompts/getCharacterPrompt" export function getVideoPrompt( segments: ClapSegment[] = [], entitiesIndex: Record = {}, - extraPositivePrompt: string[] = [] + extraPositivePrompt: string[] = [], + debug: boolean = false, ): string { // console.log("entitiesIndex:", entitiesIndex) @@ -52,7 +53,7 @@ export function getVideoPrompt( // if we can't find the entity, then we are unable // to make any assumption about the gender, age or appearance if (!entity) { - console.log("ERROR: this is a dialogue, but couldn't find the entity!") + // console.log("ERROR: this is a dialogue, but couldn't find the entity!") return `portrait of a person speaking, blurry background, bokeh` } @@ -71,7 +72,7 @@ export function getVideoPrompt( // if we can't find the location's entity, we default to returning the prompt if (!entity) { - console.log("ERROR: this is a location, but couldn't find the entity!") + // console.log("ERROR: this is a location, but couldn't find the entity!") return segment.prompt } From 5bd0a1c1693307d4394f3663a4ac6369fd6ec5b4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 10 Jun 2024 22:50:58 +0200 Subject: [PATCH 130/346] 0.0.20 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/Cell.tsx | 16 ++- .../src/components/cells/ImageCell.tsx | 4 +- .../src/components/cells/RedrawButton.tsx | 11 +- .../src/components/timeline/Cells.tsx | 6 +- packages/aitube-timeline/src/hooks/index.ts | 1 + .../src/hooks/useSegmentChanges.ts | 44 +++++++ .../src/hooks/useSegmentLoader.ts | 5 +- .../aitube-timeline/src/hooks/useTimeline.ts | 124 ++---------------- packages/aitube-timeline/src/index.tsx | 3 +- packages/aitube-timeline/src/types/index.ts | 2 +- .../aitube-timeline/src/types/rendering.ts | 23 ++-- .../aitube-timeline/src/types/timeline.ts | 31 ++--- .../src/utils/getDefaultState.ts | 13 +- .../aitube-timeline/src/utils/throttle.ts | 51 +++---- 15 files changed, 148 insertions(+), 188 deletions(-) create mode 100644 packages/aitube-timeline/src/hooks/useSegmentChanges.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 2320c9b7..fd60225a 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.19", + "version": "0.0.20", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 70340a28..c98da401 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -11,6 +11,7 @@ import { useHoveredSegment } from "@/hooks/useHoveredSegment" import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" import { RedrawButton } from "./RedrawButton" import { Suspense } from "react" +import { useSegmentChanges } from "@/hooks/useSegmentChanges" export function Cell({ segment: s @@ -18,6 +19,14 @@ export function Cell({ segment: ClapSegment }) { + + // TODO JULIAN: we should optimize this component because it causes + // some performance issues due to the numerous re-renders + + + // this is only used to react to changes in the segment + const segmentChanged = useSegmentChanges(s) + const getSegmentColorScheme = useTimeline(s => s.getSegmentColorScheme) const colorScheme = getSegmentColorScheme(s) @@ -129,7 +138,7 @@ export function Cell({ // onUpdate={(self) => console.log('props have been updated')} > }> - - {(s.category === ClapSegmentCategory.STORYBOARD + { + // TODO also add the buttons to Dialogue, Sound, Music etc.. + // also maybe fix the display, as when zoomed out it doesn't look good + (s.category === ClapSegmentCategory.STORYBOARD || s.category === ClapSegmentCategory.VIDEO) && , Material | Material[], Object3DEventMap>>(null) /* - const renderSegment = useTimeline(s => s.renderSegment) + const resolveSegment = useTimeline(s => s.resolveSegment) const [inProgress, setInProgress] = useState(false) // const [isButtonHovered, setButtonHovered] = useState(false) @@ -27,7 +27,7 @@ export function ImageCell({ setInProgress(true) try { // console.log(`click on RedrawButton for segment ` + segment.id) - const segment = await renderSegment(s) + const segment = await resolveSegment(s) if (ref.current) { // update the image src } diff --git a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx index e3dea8b8..59ab0ca9 100644 --- a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx +++ b/packages/aitube-timeline/src/components/cells/RedrawButton.tsx @@ -22,7 +22,7 @@ export function RedrawButton({ // onClick: () => void }) { const [_isPending, startTransition] = useTransition() - const renderSegment = useTimeline(s => s.renderSegment) + const resolveSegment = useTimeline(s => s.resolveSegment) const [inProgress, setInProgress] = useState(false) // const [isButtonHovered, setButtonHovered] = useState(false) @@ -33,19 +33,22 @@ export function RedrawButton({ }) try { // console.log(`click on RedrawButton for segment ` + segment.id) - const newSegment = await renderSegment(segment) + const newSegment = await resolveSegment(segment) // if (ref.current) { // update the image src // } - // note that this will poison-pill the current - invalidate() + // note that this will poison-pill the current element, + // since we transform a text mesh node into an image node + // TODO: we should only have one mesh to avoid this + // invalidate() // ref.current.url } catch (err) { } finally { startTransition(() => { + // this fail/trigger an error, since the parent element will be destroyed setInProgress(false) }) } diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index 9a89dca5..a6063a95 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -5,6 +5,7 @@ import { } from "@/hooks" import { Cell } from "@/components/cells" +import { Suspense } from "react"; export function Cells() { @@ -35,7 +36,7 @@ export function Cells() { })) */ - console.log(`re-rendering (${visibleSegments.length} strictly visible, ${loadedSegments.length} loaded in total)`) + // console.log(`re-rendering (${visibleSegments.length} strictly visible, ${loadedSegments.length} loaded in total)`) return ( {loadedSegments.map((s) => - }> + )} ); diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/aitube-timeline/src/hooks/index.ts index 771b3ad0..95a0e6bd 100644 --- a/packages/aitube-timeline/src/hooks/index.ts +++ b/packages/aitube-timeline/src/hooks/index.ts @@ -2,4 +2,5 @@ export { useAxis } from "./useAxis" export { useVerticalGridLines } from "./useVerticalGridLines" export { useHorizontalGridLines } from "./useHorizontalGridLines" export { useTimeline } from "./useTimeline" +export { useSegmentChanges } from "./useSegmentChanges" export { useSegmentLoader } from "./useSegmentLoader" \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useSegmentChanges.ts b/packages/aitube-timeline/src/hooks/useSegmentChanges.ts new file mode 100644 index 00000000..e46ba135 --- /dev/null +++ b/packages/aitube-timeline/src/hooks/useSegmentChanges.ts @@ -0,0 +1,44 @@ +import { useEffect, useRef, useState } from "react" + +import { useTimeline } from "./useTimeline" +import { ClapSegment } from "@aitube/clap" + +function getKey(segment: ClapSegment) { + const keyItems = [ + segment.id, + segment.label, + segment.prompt, + segment.assetUrl.slice(0, 1024), + segment.status + ] + + const hash = keyItems.join("::") + + return hash +} + +/** + * Can be used to subscribe to individual changes in a segment + * + * Note: it is not efficient to track everything + * + * @param segment + * @returns + */ +export function useSegmentChanges(segment: ClapSegment): number { + const [changes, setChanges] = useState(0) + const silentChangesInSegments = useTimeline(s => s.silentChangesInSegments) + + const changesRef = useRef(0) + const hashRef = useRef(getKey(segment)) + + useEffect(() => { + // at this stage, *ANY* segment might have changed + // so we need to recompute some kind of hash change + const newHash = getKey(segment) + if (hashRef.current === newHash) { return } + setChanges(changesRef.current++) + }, [silentChangesInSegments]) + + return changes +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index edbc1ea4..076aef77 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -172,11 +172,10 @@ export const useSegmentLoader = ({ state.beforeTimeWithoutBufferInMs = beforeTimeWithoutBufferInMs const visibleSegments = await sliceSegments({ - segments: loadedSegments, // <- yeah, to save compute we sub-filter this previously filtered set + segments: segments, // <- apparently we cannot use the loadedSegments which is supposedly larger? weird afterTimeInMs: afterTimeWithoutBufferInMs, beforeTimeInMs: beforeTimeWithoutBufferInMs }) - setVisibleSegments(visibleSegments) } } @@ -190,7 +189,7 @@ export const useSegmentLoader = ({ // console.log("scheduling a sync(false)") // we could also use useInterval, but we need something async-friendly const fn = async () => { - // we want a relatively "high" refresh rate in order to get smooth camera movement + // we want a relatively low refresh rate (high delay) in order to get smooth camera movement // eg a rate of 500ms // // ideally I would say we should also debounce the call, to defer diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 9a411fc6..f164d2c6 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -1,19 +1,20 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapEntity, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, newClap, serializeClap } from "@aitube/clap" +import { ClapEntity, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, ClapSegmentStatus, filterSegments, newClap, serializeClap } from "@aitube/clap" import { TimelineStore, Tracks } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideos" import { hslToHex } from "@/utils/hslToHex" -import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, SegmentRenderer } from "@/types" +import { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, SegmentResolver } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" import { findFreeTrack } from "@/utils/findFreeTrack" +import { RenderableSegmentCategory } from "@/types/rendering" export const useTimeline = create((set, get) => ({ ...getDefaultState(), @@ -307,6 +308,10 @@ export const useTimeline = create((set, get) => ({ } }, + trackSilentChangeInSegments: () => { + const { silentChangesInSegments } = get() + set({ silentChangesInSegments: silentChangesInSegments + 1 }) + }, setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => { set({ timelineCamera }) }, @@ -438,114 +443,13 @@ export const useTimeline = create((set, get) => ({ return objectUrl.length }, - setImageRenderingStrategy: (imageRenderingStrategy: RenderingStrategy) => { - set({ - imageRenderingStrategy: imageRenderingStrategy || RenderingStrategy.ON_DEMAND - }) - }, - setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => { - set({ - videoRenderingStrategy: videoRenderingStrategy || RenderingStrategy.ON_DEMAND - }) - }, - setSoundRenderingStrategy: (soundRenderingStrategy: RenderingStrategy) => { - set({ - soundRenderingStrategy: soundRenderingStrategy || RenderingStrategy.ON_DEMAND - }) - }, - setVoiceRenderingStrategy: (voiceRenderingStrategy: RenderingStrategy) => { - set({ - voiceRenderingStrategy: voiceRenderingStrategy || RenderingStrategy.ON_DEMAND - }) - }, - setMusicRenderingStrategy: (musicRenderingStrategy: RenderingStrategy) => { - set({ - musicRenderingStrategy: musicRenderingStrategy || RenderingStrategy.ON_DEMAND - }) - }, - setSegmentRenderer: (segmentRenderer: SegmentRenderer) => { - set({ segmentRenderer }) - }, - renderSegment: async (segment: ClapSegment): Promise => { - const { segmentRenderer, clap, segments } = get() - - if (!segmentRenderer || !clap) { - return segment - // throw new Error(`please call setSegmentRender(...) first`) - } - - const entities = clap.entityIndex || {} - - const speakingCharactersIds = segments.map(s => - s.category === ClapSegmentCategory.DIALOGUE ? s.entityId : null - ).filter(id => id) as string[] - - const generalCharactersIds = segments.map(s => - s.category === ClapSegmentCategory.CHARACTER ? s.entityId : null - ).filter(id => id) as string[] - - const mainCharacterId: string | undefined = speakingCharactersIds.at(0) || generalCharactersIds.at(0) || undefined - - const mainCharacterEntity: ClapEntity | undefined = mainCharacterId ? (entities[mainCharacterId] || undefined) : undefined - - const { - id, - assetUrl, - assetDurationInMs, - assetFileFormat, - assetSourceType, - status - } = await segmentRenderer({ - segment, - - // the slice to use for rendering - segments: filterSegments(ClapSegmentFilteringMode.ANY, segment, segments), - - entities, - - speakingCharactersIds, - generalCharactersIds, - mainCharacterId, - mainCharacterEntity, - meta: clap.meta - }) - - // note: this actually modifies the old object in-place - const newSegment = Object.assign(segment, { - id, - assetUrl, - assetDurationInMs, - assetFileFormat, - assetSourceType, - status - }) - - return newSegment + setSegmentResolver: (segmentResolver: SegmentResolver) => { + set({ segmentResolver }) }, - findStuffToRender: async () => { - // note: this run independently for the manual re-render, - // which the user can always do - const { - imageRenderingStrategy, - videoRenderingStrategy, - soundRenderingStrategy, - voiceRenderingStrategy, - musicRenderingStrategy, - segments, - loadedSegments, - } = get() - - if (imageRenderingStrategy === RenderingStrategy.ON_DEMAND) { - // for now this has its own workflow, managed elsewhere - } else if (imageRenderingStrategy === RenderingStrategy.ON_SCREEN_ONLY) { - - } else if (imageRenderingStrategy === RenderingStrategy.ON_SCREEN_THEN_SURROUNDING) { - - } else if (imageRenderingStrategy === RenderingStrategy.ON_SCREEN_THEN_ALL) { - - } else { - // do nothing - } + resolveSegment: async (segment: ClapSegment): Promise => { + const { segmentResolver } = get() + if (!segmentResolver) { return segment } + return segmentResolver(segment) }, findFreeTrack: ({ startTimeInMs, @@ -556,5 +460,5 @@ export const useTimeline = create((set, get) => ({ }): number => { const { segments } = get() return findFreeTrack({ segments, startTimeInMs, endTimeInMs }) - } + }, })) diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 3576af9d..ab6ff55d 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -31,6 +31,7 @@ export { useVerticalGridLines, useHorizontalGridLines, useTimeline, + useSegmentChanges, useSegmentLoader, } from "./hooks" @@ -68,7 +69,7 @@ export { ClapSegmentCategoryHues, ClapSegmentColorScheme, RenderingStrategy, - type SegmentRenderer, + type SegmentResolver, } from "./types" diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index a353a0cc..000fd492 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -20,5 +20,5 @@ export { export { RenderingStrategy, - SegmentRenderer + SegmentResolver } from "./rendering" \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/aitube-timeline/src/types/rendering.ts index 19d4cc5e..0ce9e113 100644 --- a/packages/aitube-timeline/src/types/rendering.ts +++ b/packages/aitube-timeline/src/types/rendering.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapMeta, ClapSegment } from "@aitube/clap" +import { ClapEntity, ClapMeta, ClapSegment, ClapSegmentCategory } from "@aitube/clap" export enum RenderingStrategy { @@ -24,18 +24,11 @@ export enum RenderingStrategy { ON_SCREEN_THEN_ALL = "ON_SCREEN_THEN_ALL", } -export type SegmentRenderer = (params: { - segment: ClapSegment +export type SegmentResolver = (segment: ClapSegment) => Promise - // the slice to use for rendering - segments: ClapSegment[] - - entities: Record - - speakingCharactersIds: string[] - generalCharactersIds: string[] - mainCharacterId?: string - mainCharacterEntity?: ClapEntity - - meta: ClapMeta -}) => Promise \ No newline at end of file +export type RenderableSegmentCategory = + | ClapSegmentCategory.VIDEO + | ClapSegmentCategory.STORYBOARD + | ClapSegmentCategory.DIALOGUE + | ClapSegmentCategory.SOUND + | ClapSegmentCategory.MUSIC \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 4ee90c61..088d5af8 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -5,7 +5,7 @@ import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" -import { RenderingStrategy, SegmentRenderer } from "./rendering" +import { RenderingStrategy, SegmentResolver } from "./rendering" export type Track = { id: number @@ -82,6 +82,10 @@ export type TimelineStoreProjectState = { hoveredSegment?: ClapSegment + // used to track silent in-line changes in the segments + // that way we don't need to re-draw the whole thing + silentChangesInSegments: number + isDraggingCursor: boolean // used to track current camera position, at zoom level 1.0 @@ -134,14 +138,8 @@ export type TimelineStorePreferencesState = { topBarTimeScale?: THREE.Group leftBarTrackScale?: THREE.Group - imageRenderingStrategy: RenderingStrategy - videoRenderingStrategy: RenderingStrategy - soundRenderingStrategy: RenderingStrategy - voiceRenderingStrategy: RenderingStrategy - musicRenderingStrategy: RenderingStrategy - // those can be overridden - segmentRenderer: SegmentRenderer + segmentResolver: SegmentResolver jumpAt: JumpAt isPlaying: IsPlaying togglePlayback: TogglePlayback @@ -160,6 +158,11 @@ export type TimelineStoreModifiers = { getVerticalCellPosition: (start: number, end: number) => number getSegmentColorScheme: (segment?: ClapSegment) => ClapSegmentColorScheme setHoveredSegment: (hoveredSegment?: ClapSegment) => void + + // used to track silent in-line changes in the segments + // that way we don't need to re-draw the whole thing + trackSilentChangeInSegments: () => void + setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => void setTimelineControls: (timelineControls?: TimelineControlsImpl) => void setTopBarTimeScale: (topBarTimeScale?: THREE.Group) => void @@ -188,15 +191,9 @@ export type TimelineStoreModifiers = { // some extra text to append to the file name extraLabel?: string }) => Promise - setImageRenderingStrategy: (imageRenderingStrategy: RenderingStrategy) => void - setVideoRenderingStrategy: (videoRenderingStrategy: RenderingStrategy) => void - setSoundRenderingStrategy: (soundRenderingStrategy: RenderingStrategy) => void - setVoiceRenderingStrategy: (voiceRenderingStrategy: RenderingStrategy) => void - setMusicRenderingStrategy: (musicRenderingStrategy: RenderingStrategy) => void - setSegmentRenderer: (segmentRenderer: SegmentRenderer) => void - renderSegment: (segment: ClapSegment) => Promise - findStuffToRender: () => Promise - findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number + setSegmentResolver: (segmentResolver: SegmentResolver) => void + resolveSegment: (segment: ClapSegment) => Promise + findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index a719a0fa..1b97c19d 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -47,6 +47,11 @@ export function getDefaultProjectState(): TimelineStoreProjectState { currentZoomLevel: 1.0, hoveredSegment: undefined, + + // used to track silent in-line changes in the segments + // that way we don't need to re-draw the whole thing + silentChangesInSegments: 0, + scrollX: 0, scrollY: 450, @@ -72,15 +77,9 @@ export function getDefaultPreferencesState(): TimelineStorePreferencesState { leftBarTrackScale: undefined, timelineCursor: undefined, - imageRenderingStrategy: RenderingStrategy.ON_DEMAND, - videoRenderingStrategy: RenderingStrategy.ON_DEMAND, - soundRenderingStrategy: RenderingStrategy.ON_DEMAND, - voiceRenderingStrategy: RenderingStrategy.ON_DEMAND, - musicRenderingStrategy: RenderingStrategy.ON_DEMAND, - // note: those are stateless functions, use as empty // mocls that are normally overriden at runtime - segmentRenderer: async (params) => params.segment, + segmentResolver: async (segment) => segment, jumpAt: () => {}, isPlaying: () => false, togglePlayback: () => ({ wasPlaying: false, isPlaying: false }) diff --git a/packages/aitube-timeline/src/utils/throttle.ts b/packages/aitube-timeline/src/utils/throttle.ts index 1be77633..c68d2db4 100644 --- a/packages/aitube-timeline/src/utils/throttle.ts +++ b/packages/aitube-timeline/src/utils/throttle.ts @@ -1,24 +1,29 @@ -export function throttle(wait: number, fn: T): T { - let inThrottle: boolean - let lastFn: ReturnType - let lastTime: number - const result = function (this: any) { - const context = this - const args = arguments - if (!inThrottle) { - (fn as any).apply(context, args) - lastTime = Date.now() - inThrottle = true - } else { - clearTimeout(lastFn) - lastFn = setTimeout(() => { - if (Date.now() - lastTime >= wait) { - (fn as any).apply(context, args) - lastTime = Date.now() - } - }, Math.max(wait - (Date.now() - lastTime), 0)) - } - } +export const throttle = ( + fn: (...args: A) => R, + delay: number +): [(...args: A) => R | undefined, () => void] => { + let wait = false; + let timeout: undefined | number; + let cancelled = false; - return result as unknown as T -} \ No newline at end of file + return [ + (...args: A) => { + if (cancelled) return undefined; + if (wait) return undefined; + + const val = fn(...args); + + wait = true; + + timeout = window.setTimeout(() => { + wait = false; + }, delay); + + return val; + }, + () => { + cancelled = true; + clearTimeout(timeout); + }, + ]; +}; \ No newline at end of file From 05f957c97b6834246d37eb628adf6d55c066d791 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 01:59:13 +0200 Subject: [PATCH 131/346] 0.0.18 --- packages/aitube-engine/package.json | 2 +- .../aitube-engine/src/prompts/getVideoPrompt.ts | 15 ++++++++++++--- .../aitube-engine/src/prompts/priorities.ts | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 packages/aitube-engine/src/prompts/priorities.ts diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index c6b605af..7b1bd78c 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.17", + "version": "0.0.18", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index 0db197db..23c5093c 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -1,8 +1,10 @@ -import { ClapEntity, ClapSegment, ClapSegmentCategory } from "@aitube/clap" +import { ClapEntity, ClapOutputType, ClapSegment, ClapSegmentCategory } from "@aitube/clap" import { deduplicatePrompt } from "@/utils/deduplicatePrompt" import { getCharacterPrompt } from "@/prompts/getCharacterPrompt" +import { SegmentCategoryPromptPriority } from "./priorities" + /** * Construct a video prompt from a list of active segments * @@ -22,11 +24,12 @@ export function getVideoPrompt( // we ignore unrelated categories (music, dialogue) or non-prompt items (eg. an audio sample) const tmp = segments .filter(({ category, outputType }) => { - if (outputType === "audio") { + if (outputType === ClapOutputType.AUDIO) { return false } if ( + category === ClapSegmentCategory.STORYBOARD || category === ClapSegmentCategory.CHARACTER || category === ClapSegmentCategory.LOCATION || category === ClapSegmentCategory.TIME || @@ -43,7 +46,13 @@ export function getVideoPrompt( return false }) - tmp.sort((a, b) => b.label.localeCompare(a.label)) + // this step is *SUPER* important, it determines the order of the prompt! + tmp.sort((segment1, segment2) => { + const priority1 = SegmentCategoryPromptPriority[segment1.category || SegmentCategoryPromptPriority.generic] || 0 + const priority2 = SegmentCategoryPromptPriority[segment2.category || SegmentCategoryPromptPriority.generic] || 0 + + return priority2 - priority1 + }) let videoPrompt = tmp.map(segment => { const entity: ClapEntity | undefined = entitiesIndex[segment?.entityId || ""] || undefined diff --git a/packages/aitube-engine/src/prompts/priorities.ts b/packages/aitube-engine/src/prompts/priorities.ts new file mode 100644 index 00000000..59479fb2 --- /dev/null +++ b/packages/aitube-engine/src/prompts/priorities.ts @@ -0,0 +1,17 @@ +import { ClapSegmentCategory } from "@aitube/clap" + +export const SegmentCategoryPromptPriority: Partial> = { + // maybe we should also a priority for the video, + // if it has a prompt.. no? + [ClapSegmentCategory.STORYBOARD]: 11, + [ClapSegmentCategory.CAMERA]: 10, + [ClapSegmentCategory.CHARACTER]: 9, + [ClapSegmentCategory.LOCATION]: 8, + [ClapSegmentCategory.ACTION]: 7, + [ClapSegmentCategory.TIME]: 6, + [ClapSegmentCategory.STYLE]: 5, + [ClapSegmentCategory.LIGHTING]: 4, + [ClapSegmentCategory.WEATHER]: 3, + [ClapSegmentCategory.ERA]: 2, // <- era is @deprecated + [ClapSegmentCategory.GENERIC]: 1 +} \ No newline at end of file From f2c28e94879252ed601f77ea61b213defe501432 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 12:44:18 +0200 Subject: [PATCH 132/346] 0.0.26 --- packages/aitube-clap/bun.lockb | Bin 16869 -> 16869 bytes packages/aitube-clap/package.json | 8 ++++--- .../aitube-clap/src/utils/filterSegments.ts | 9 +++++++- .../src/utils/filterSegmentsWithinRange.ts | 20 ++++++++++-------- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index bdba6a46c021a7b9c81255d6282ba0c2e97933ec..c1fd175ebe68cffc29739108d273224cb2c30f24 100755 GIT binary patch delta 332 zcmV-S0ki()g8}7(0gx^rdmc*2mKpuX{(^i25qTJkl2OnS=_yYtx>`!LE#kxYu};PX z0R)pl11qyY2ABquR0=4v4HyBF*aIk&Py+@LqO+bbj2bHCv>XljZ8T$q)ro`D||n zFi2nL<|Au#ks3rws>v-FOk0qE2Dlg z$xNFB!&b(_$pU{)3Zc{%lUi|1vo1gy0R=TKbZ2^#ksz3dfR6b9 delta 327 zcmV-N0l5Cvq%Pz29sC_FtZ2^5CM}^2rRQi4w(i(k!g!6eXT~<*f3wgYDl3~RC5HQvCoJJ zG9vayKXqDg0p&B>9V-zL zgd{c4;I_%XcjwLD=}FkS)1HZ5V$(4LOSJ|~)h*KRvhnKimw7=d{3!g9^2&i7UOXw` z*&g(~0lEDLU#@!^`3=JeZ<(~&mV-ToWF}6Fp zV`kd0X+rxZXI{UQ^}-}&w(Gr}faN5vlRyJ2vq&J%4goWh7%wvcFtbcA(Fg-EE;6$q ZIPM3N!8#zbE (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) && (category ? s.category === category : true)) + return array.filter(s => (startTimeInMs <= s.startTimeInMs && s.startTimeInMs < endTimeInMs) && ((category && s?.category) ? s.category === category : true)) case ClapSegmentFilteringMode.END: - return array.filter(s => (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) && (category ? s.category === category : true)) + return array.filter(s => (startTimeInMs < s.endTimeInMs && s.endTimeInMs <= endTimeInMs) && ((category && s?.category) ? s.category === category : true)) case ClapSegmentFilteringMode.BOTH: - return array.filter(s => (startTimeInMs <= s.startTimeInMs && s.endTimeInMs <= endTimeInMs) && (category ? s.category === category : true)) + return array.filter(s => (startTimeInMs <= s.startTimeInMs && s.endTimeInMs <= endTimeInMs) && ((category && s?.category) ? s.category === category : true)) // less efficient version is: // array.filter(s => - // (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + // (startTimeInMs <= s.startTimeInMs && s.startTimeInMs < endTimeInMs) // && - // (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + // (startTimeInMs < s.endTimeInMs && s.endTimeInMs <= endTimeInMs) // && - // (category ? s.category === category : true) + // ((category && s?.category) ? s.category === category : true) // ) case ClapSegmentFilteringMode.ANY: return array.filter(s => ( - (startTimeInMs <= s.startTimeInMs && s.startTimeInMs <= endTimeInMs) + (startTimeInMs <= s.startTimeInMs && s.startTimeInMs < endTimeInMs) || - (startTimeInMs <= s.endTimeInMs && s.endTimeInMs <= endTimeInMs) - ) && (category ? s.category === category : true) + (startTimeInMs < s.endTimeInMs && s.endTimeInMs <= endTimeInMs) + ) && ((category && s?.category) ? s.category === category : true) ) default: throw new Error(`unknown ClapSegmentFilteringMode "${mode}"`) From 12070f45d00a3c5f0f52a9d49171cb3c4daf95ed Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 12:45:31 +0200 Subject: [PATCH 133/346] 0.0.19 --- packages/aitube-engine/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 5d3f84c768c6895d3e6d0a2881781ee1ab05ed96..0ea1e8a825e33aa85e01c74539b3a73ae872ec27 100755 GIT binary patch delta 347 zcmV-h0i^!ah5^)u0gx^r2>{fTIM|^K&%B`9fKUdz!O)OdDFm!c7MG7k6`pcC+wac7Sw#+^RKOq?VKA>bS`e1ylKKZw4?(U+3l{Yjly%K(lQgcmaRx!ZQsf zVof|_Dd>eZYm~nAVkKQ5@&qaSYl&*#eF-pyYu8FBiy>kAWB5(QhCoqgd6r=06rux} z2@3JGfpXsg00031{tx~E001ih0000000000000DN9CmJcgUwU2G^gy!$iUibIc8bo zNCmcdZT~NkzX>a&elp2Sn*s500)I{lq0|uLboeuk7ED; delta 347 zcmV-h0i^!ah5^)u0gx^rK;n?igKH)**MXeTz~fY?T0a&YVHfL-xWR9Dnv_Ygu})eH zljH~}v(O9}0Rb74Q3EHF5DplVBnT+8P!8P>K8J8$3L9)85=7#czK&NoDZD z#L-kw2%M$tDH7>X#yu%)Ri%@N1dmT4vSA#6rx{vVJn&N$O|BO(4zq0@cmaQRqT#(Z zug!^NRHN<_b|-l)-5MUz3W<1r;cE9wIFNBAHW*sb)9$Lr8&yBaTH6KuEt64D6W`tD zGv>Mm0>wZ900031{tx~E001ih0000000000000ECdtjRw{G+hM?hnw5tsJV7!2@x| z-6Y%$4J13|p9fB35U5!(wmTWRV`kd0X+rxZXI{UQ^}-}&w(Gr}faN5vvwa|<4*@lk tATTolF|$-K`2+zovraX$3jr~bJs-0nK_dYHHIqd`H~}+~Js*>uLbsx%jimqp diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 7b1bd78c..fb299c39 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.18", + "version": "0.0.19", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,12 +14,12 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.1", + "prettier": "^3.3.2", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.25" + "@aitube/clap": "0.0.26" }, "repository": { "type": "git", From 4cf632df0825b22ba45cc10ebee554a24dd632dc Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 12:46:32 +0200 Subject: [PATCH 134/346] 0.0.5 --- packages/aitube-colors/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-colors/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 8e27631276df5c494d3578d675266e17511f2bbc..1b28f90a95c5d603ca40bc4aee058483a0bfac56 100755 GIT binary patch delta 347 zcmV-h0i^!ah5^)u0gx^r2>{fTIM|^K&%B`9fKUdz!O)OdDFm!c7MG7k6`pcC+wac7Sw#+^RKOq?VKA>bS`e1ylKKZw4?(U+3l{Yjly%K(lQgcmaRx!ZQsf zVof|_Dd>eZYm~nAVkKQ5@&qaSYl&*#eF-pyYu8FBiy>kAWB5(QhCoqgd6r=06rux} z2@3JGfpXsg00031{tx~E001ih0000000000000DN9CmJcgUwU2G^gy!$iUibIc8bo zNCmcdZT~NkzX>a&elp2Sn*s500)I{lq0|uLboeuk7ED; delta 347 zcmV-h0i^!ah5^)u0gx^rK;n?igKH)**MXeTz~fY?T0a&YVHfL-xWR9Dnv_Ygu})eH zljH~}v(O9}0Rb74Q3EHF5DplVBnT+8P!8P>K8J8$3L9)85=7#czK&NoDZD z#L-kw2%M$tDH7>X#yu%)Ri%@N1dmT4vSA#6rx{vVJn&N$O|BO(4zq0@cmaQRqT#(Z zug!^NRHN<_b|-l)-5MUz3W<1r;cE9wIFNBAHW*sb)9$Lr8&yBaTH6KuEt64D6W`tD zGv>Mm0>wZ900031{tx~E001ih0000000000000ECdtjRw{G+hM?hnw5tsJV7!2@x| z-6Y%$4J13|p9fB35U5!(wmTWRV`kd0X+rxZXI{UQ^}-}&w(Gr}faN5vvwa|<4*@lk tATTolF|$-K`2+zovraX$3jr~bJs-0nK_dYHHIqd`H~}+~Js*>uLbsx%jimqp diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 872f2d5f..651169d0 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,12 +14,12 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.1", + "prettier": "^3.3.2", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.25" + "@aitube/clap": "0.0.26" }, "repository": { "type": "git", From bd5bf88a0d79c36f9e58e04564bf812d3e6ec8e8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 12:48:00 +0200 Subject: [PATCH 135/346] 0.0.13 --- packages/broadway/bun.lockb | Bin 32802 -> 32802 bytes packages/broadway/package.json | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 7937afd26c913affc2bcf6bf007c70eb1402fea7..02ea97e5e39baa788906ef770ebe498a94cae0fe 100755 GIT binary patch delta 494 zcmVbGJHysOtrMo6~cv!-zu}<0$ zlV}+*vse)j2>}I@(FG@ykQx{P8k5llCzDVU36t3x50fYeD3jm?1hc#yrUJ9N9WxR@ ztOZ^jgB-uW6IYjc)4+vxf4u&Y&!u;WiQPkXv+!PafOLM`sx@1rmXqb`xXBO&Q~7Lf z1~5op=jJ18bdk?Mvn?=q41YmCR@1N+pB211gRqF6Gc8k}B)+Cmc%Z02s2?c>Y8>7- z72f0+i-yz}j>+A;EarG#4ef(<@X~e-9(^egu9E=(009905B>oF08;<}0000000000 z00iv9GYuwUO*~^M=!G_Gl)m+1C0!u$1S$J#iE7_{2{46g*GedhAsJ!&WB5(QhCoqg zd6r=06rux}2@3JGfpXuIJv|sfXdHHKdV|eVvNWgc%E-XlYdL0F<46Uzcy0eLk-rHm zqkb~UOq&G5R>s500)I{lq0|M1T+hFfK4IHIs2!P60Brz*+MN0yY4Xi(ea)&|?yd9?soIQN}$fY*nR`hy;&MA+li{fTtN+ zSv>Gl6-}-eFb=aVFnA1qW@jgYrlrT~iT}Mer<_nW#p!1Ry=6}n0CxJ09Q^~pa(Axb zri^LG!F&yN3s*T~1hKP1+{?63Od5uKgn9#1^g|O zQBV`#-R3jqx&{KpK$AT^7(udoV4E2Hqp-y8573LP9IBGR198UPB-{)QBs=Aw2To%U zs97<#JGx_L+OTOt`zB{zzm)aDBxSbiy`6yNB(4FIkv_JwOg;-68Z`g_8~^|S4gdgv zQ!-DTgM~zZ5CJeQFfKHcaam3QF|)u~^9ceq0F#Sf8vu<*( j43iRWAd-IxlSO|J0X36RZy%F&e-H&TE_7#llaW4{^2Ev0 diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 991f6148..760245ad 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.12", + "version": "0.0.13", "description": "Convert a script to a clap file", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", @@ -15,13 +15,13 @@ "devDependencies": { "@aitube/io": "0.0.1", "bun-types": "latest", - "prettier": "^3.3.1", + "prettier": "^3.3.2", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.25", - "@aitube/colors": "0.0.4" + "@aitube/clap": "0.0.26", + "@aitube/colors": "0.0.5" }, "repository": { "type": "git", From ef6bea8bbc5d8318f7e5721506832ab521f26979 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 12:51:41 +0200 Subject: [PATCH 136/346] 0.0.35 --- packages/aitube-client/bun.lockb | Bin 18708 -> 18708 bytes packages/aitube-client/package.json | 8 +++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 8c83a65577aca37e3704f4612413aada7b76edce..9c09b0a2d4f54fd42614d62f5aeed2158680c6b5 100755 GIT binary patch delta 349 zcmV-j0iyntk^z*G0gx^rVfmifWkHN}gIl4&x*R(kh$Ek~(6MYb9*g8a@4~uFu}+!| zlVl4hvk(p#0RbA5kpm}_P!AZB=mapcm=ARkK&%B`9fKUdz!O)OdDFm!c7MG7k6`pcC+wac7Sw#+^RKOq?VKA>bS`e1ylKKZw4?(U+3l{Yjly%K(kFDcmaRx!ZQsf zVof|_Dd>eZYm~nAVkKQ5@&qaSYl&*#eF-pyYu8FBiy>kAWB5(QhCoqgd6r=06rux} z2@3JGfpXsg00031{tx~E001ul0000000000000DN9CmJcgUwU2G^gy!$iUibIc8bo zNCmcdZT~NkzX>a&elp2Sn*s500)I{lq0|8J8$3L9)85=7#czK&NoDZD z#L-kw2%M$tDH7>X#yu%)Ri%@N1dmT4vSA#6rx{vVJn&N$O|BO(4zo=mcmaQRqT#(Z zug!^NRHN<_b|-l)-5MUz3W<1r;cE9wIFNBAHW*sb)9$Lr8&yBaTH6KuEt64D6W`tD zGv>Mm0>wZ900031{tx~E001ul0000000000000ECdtjRw{G+hM?hnw5tsJV7!2@x| z-6Y%$4J13|p9fB35U5!(wmTWRV`kd0X+rxZXI{UQ^}-}&w(Gr}faN5vvt1+75CJul vFf=m(FtcPdVFdv*v&K353;{8dz(OCh;YK3?0X35aNH_sAlfXhBlU+!+^y`jt diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index b7e10116..9c87e41d 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.34", + "version": "0.0.35", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,18 +14,20 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.0", + "prettier": "^3.3.2", "rimraf": "^5.0.7", "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.25" + "@aitube/clap": "0.0.26" }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-client.git" }, "keywords": [ + "Clapper.app", + "AiTube.at", "OpenClap", "AI cinema", "file format", From b2b20a63874cc1d1ef6bf0396e1b435e49ce8c1f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 13:09:53 +0200 Subject: [PATCH 137/346] 0.0.21 --- packages/aitube-timeline/bun.lockb | Bin 159709 -> 159709 bytes packages/aitube-timeline/package.json | 6 +++--- .../aitube-timeline/src/hooks/useTimeline.ts | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 174459a8c4973bb1f63210574296cdae27d14db2..3cde0a496d4fea7583afc9b85eb7545bf679b9bd 100755 GIT binary patch delta 14137 zcmeHucT`o^w*FaL4sb+}BGN^~LXj>-g##qEcw#{%h_Qf(h=K^H!3svP#8|jXU3SIZ z6;Tm8V!;->F&Z@_CTgNa6jW^aeRH3))%$+A z=GGm}T;Ikc2lQC;Fsf4}^4vv^DTI^;Ied@Y|4$AooEwg&t9saX{lmQr=BZCYBlf zB0U>FxNe{ytz|hR`Mw>JlJHwdGS$dK?q{8sm71QFI9R1hNy`{W9ZR{!s73BJRFfye zlE;ju(w<&=J~%CLithNRH@w$yuk37n=) zGxW3Y(YG6#?K37ZJx!IEl`@Wh570S@P?!%I>F0~?5sxl=~p^Adqh?; zBKn9wfU)QO^}g+f#M0(<#UvEweg+u@Nz2s=l8o{&$X-GE*y$iC?_5w$PFovfYPOFY zm8q@t?MzWlY4XlZFB5}hrvmfRl1C4xD8-?G8niRWu8=hFpycEcKB?KNYD33Ac$wPO z?axsCbaxGMgil&VQsPK7O-oHr9jUs@nXw(4&mD|i*<=2haS7YZnMsD{{MLGRh9qYD zU_DZlrB$-=eO4DQGBIJ2b(7*%rq_%t3;g=bYQ8(7wI(C{#P2bS_wyWc|J;j(mM+IU z9&}4fSoPPng3{>C9a8&cMYdRKZrAR?@@=C}_RwDNc6PB^zud`x-{l8MeJY;kxsG2G z%X!;}?n7rSo<6YQ8%=%J2G6~$J%ZTGUkYzd9^4^d!Hu$`s>dChKaisAU%d+GaXKWq z!lb+Ca6kR1sg>4yFPnFEy3v*)1FYHvg6X<_8^{i&tl8(JBs|5n`F;w3ZHPLEktJ0NX5?{4W)oM$;iDt>9* zO2fBw43~V2`0pLH(r_d0<*a4vc&c+GtL7V>BQ+svl`0&o!FXn$Fs9~SE?Rb&r@BO{ zk6=gc%F|uisx3@as?TMu&wFj%d+q6aO^apiEVr8ut&^->c(2(b3G`(N@3jr@wI}bj zFl3v)UEX`G0$K;XEyz{9*6Y2t_`UWMw03g4rno=!+K~6!miO8dS$pIb&Mf#)cddFD zZo@Bmx_evo325=M=4z#sjfK`zE;|RUpR9S|*^(-299p8RRYTL)#$cC9k<0c%OO`bk z>@)*pZTx%fCNzDIFk7WoK+{|B1X>*RkUBQxn_6huZ2q7{B)h>qJt8FwJ3iDyE2Y`- zO&(hI9e;o_V|(u9sgJP3erwq=b`~&rq~4AfYjktj-k>R z2R_tGtJ!ZTH04#Ep;E3R{~d+Luys&+81pLUP)%KIy2RAPqz+Delebp00fk@a2lEQm zyaUsMVHB@WDcqS4ZK>5v!zTR+3MHO7K8!zT87b9w;a)yk&1ZPx(tsvBz$a9bZ(x{g zLYOH?6sj9Lfs#M&C$wo#m;;J{$n+1g2jy3lIHpbtqJt&S2QL$v;G5A{d?yh<=fGsOA({Cosl~62go;QN{bLkrlo;FFmEzgq&$03i%`u` zuqc^TwG36e`OsEH3pD{6O(w6urWj0bF&Xj)81;c6EkiZ!@C+qpBro+8uutT*I}c62 zCX|vIJX1!9D7=mFm-N0zQRC3)4u)bgtr7U~RA7~@h(MZ=06n@P#Xzfr7qy0kJ8NM+x zQe%ckGntON2CLW~j1mSWA{2|k+VJ$2Z8cY*(b6E1;I1`{A%?6#pYCA#Fi{%L1)~vg zfB1%K&Kj6}b4jMb{P$?BCKC^BN)8wq8mcJ;qr}lW@Bqw^v2d;##wCVT^9_{}L%7$c zTFnv^(tNTl(!~%yG(f91#v{Is>|_)){q2R@PLl&hjged0HmpN5tyd0+5p&AmEkHA#49pnU-;fHhhTMv=zdfMmG`MuX|o z!xb6Phi{E+%Zhnw$4KtcsXNbc^e^7f>4K5es1C1mXwFyaG<;*1`gMLfb&CJw(2O^B zG%dd0rJjbFquQG&_lT=!U*S7c^^88M^ysT}q+y2q6Wj1HE56^? zvJQXg;a}{LFxQmta`MpIF~qVVbA%l&^mgP<$z>{)3YjNgAImx@K?caz-$^^v=nVD$ z1DPui@jn>gzun&&J^QKj^Fz^J|L4*$|34W(OVS^}E14<@kbq=>u8$?P8w`+40q7!0 z?Nf>1B54d{0JNl80JYBs=*lI9Dn=8-^|7ReUjZa@0J=z0`*8r3j|b=?N#%+|e<#VX zNdR3W(cV}!1q$O4U)v>8@l^W3^|7RBrUA`?tpHsgOB!~&T&kC3#!dq#N&Slfi68vh zPPS{0q4w`2wJrf@lzjm4{QyO=44{i7l^-R7>tjjQ9Ft4+lG+_NaL9qON(I#LBtQ)+ z0J=z0`DuX4&j56NEH&U)Qh_F92#)Yv8XS=^{z>uK}sJS$?R=zqd_0#%w$J~?ZS!h@NnQ0jB&CKIeILiemYQ?h z>mAkf+%e;oOXB!_l(b)}!|QIr(m1|wnK`cktIwmC#W731XjuB4)t|6VKXvp1UJrBAaFI?VJ-58oZk6F>fSfW83 zcsvHolLvI<8hJn}cjBq5Fp((@?#vx9IOf6NE_@6I#M1(LBks92#>7;Whc>SKv*mId z=#BZt6;w{+xN$3a95SW}KP8Wo2i=`lEu;2P(3|pF7)Gs|aRzH7xo2};hMsxylc@!t zv^I`;@E`E&$phBKF)uy?zuvqOzb$#|^>NIH7vR^IKftdakKPc+{P`mM2JkBU2J+7~ z#<3t?h~HMc7QewfW>Xvs;T!QA%Gu^P7RKZ8+nN_`j^lf`V4b$;SX-XBC5{i-YR->? zMR2RFaom2JIUluE$0B(dSOr+KZ8{dsGq=U@obBfPD%hvoZF?N|*kR7|x9eDYei7_C zSnv)V>&PeVh~v|X%=xcipYebqNKEFuEbi5MmK3MymI@X03>_ko!BPYPR@#x|> z-f5RPUt6qWF}w=wC0Oh(9qY*pcg67yyUn?Jw~oc~nB8%__a1Y;8!V2qJ#pN$#GEJZ z(Xn`51hyB&LD3!oO1U&$p=iyG(XIe8eVBjJbRye{}AFcLnFy zel>l@txrc6Kj}X@Z{)-uHwAyWW&!{8_r0eq)jey|GK~E@4Y>E4`>>G(=cAAwO!cll zCH??jhCwSz5vEcdOXQiQ2-7}<2`q`b?L(OMBTV~rESX;fyAJl~fR3eb&;1C~0dqcU zzmBEyAHc#6n)3+M4dXKoAWUHG59(MtFF1%W9YUDEGI;bMgy}HCbV$cCc@@}8u-L;o zmdy(fBTPpSrXxBwipLy5n92|)u&+2PLzs>tOl3MYh8KbD1+zV>W8-+@QG}@+VFH`L zt;!LmV@QK?9n0lqU=?7^j_KGWo_P%Z9fyBlleyb*_;&*S9oMmZei7_CSnvrQo5m-d zfPW{E24FLIz)AR5fiyU&V>5Xr*nP0}6*_zxDyV>er{Evh93FiN{+)(@r*!!IR|WPG zEcUdHab9>D{+)q;XLR^GLChKWcNYGE3C_;KzjN^Ktd1?>MPPfuY|rV~5}tSt{(T4k zz?N~V@8I8g`1hTTt>9%~6=2QI>sTSrJP-daz(26n-0cGVy9oa-=-66*5$rlx@I@V4 z&nI1kf0y7N*hU_33I1J%f0uOlt3@T)eX#bIb@-T8a2ftxfq!7zdGrX4b{1C8HFV{J~SxhQ_~Iwxzqhs_v^|_cu93 zYWF?ue!2B_=(x-qNeL0QhgbJqvSd*Hzz&ytePmvZVjHB<2(z+-ojuYwnPz>n;p7*N zyR+AK?)THlTbnhD>$Q7xHpIKm^mC(kx~+1U?;cirDQc{4n@iXd_aU)nDc8LZ5A5{i zwK=@YBm3MH4(~>Pd*S3Sb^nOJ_lCalZB!_87IkLE+pk+E!uZXD7BekUpaS(w4nue>uqe z*h5ywHD1^>N^jOI=8qF+@`jf$|HwQIbmcO#oe+1QjVv#B>DA-X=q+BMwaaff7nYia zo&I#};Q5KudawTLoM+c3rya6lYl`Mh_-1`kmB)n%y+`8B*8AuFZn(JmPT z>-0HwpXdtDpAMed4tc7dta&VyNmjo?{(Gx zmG~&6+#;?n{+c~AN&bi-f0<<2za6Y93dhb?6441CzPcwdnt+mhx7 zTRQvWt@ESl^aksH;b?=BZ-ZE`0j!^>{0B?&R6YvLkh2CaobWgSFay3Zl+nk-fg+u= z7Ph5O>6LAkp~@C|ir9!MmMSiCW)m?KB~-cqEhu~rz%WDELPIY{@N|H#MTT~G8CMM# zZu3}M+lf%^fE9-3h>mKk$ehP)*ocz+dCXmEPah}V0Q673>A(zNCNK+_4a@=N0{;Lw zFdtX|2w)+w2v{tt7BCy1l~7j!tARDZT3{Wp9@q$M0yYC%fPTV9umKwSqC=mLgT#En z;@EESNU(0Xh`Z`Ga0mDapzk`50ouV{0zUvZ0Qvw!pJ<)}^wEkwZ_$^#`@jR>A&>=3 z0=@<&13v>7fXl#f-~>QRR|L>!fB}?9iBJXtI&o?ti)4L;W)b_6bry+>7>}+*#b}@w zpbtaEz%C#km;zh{t^ucjlRycu7svxrfFUAyG4uQEE2!1L_W*sjI|ifzw4C`^FE5}5 z`hMU5a1b~Q90BO7=>%XTP%gGEW^Hp5pthFuUwY{)l^alsvSc6$=nTFOlCp}jC=D16 zbVYeLpgTb6k`0Uk#sN9NSYQN@3G_gl7=Y>s)V3%1+$Bt;EMf7ijVN2foE*s81b{q8 zJmt8yg=`~gmM}ka52%(vJ-|!^EM;~s8mNEastZ{kz%D>XR8%d1<|2M6i!*Nx)eHy& zLdC(Q@Hrgn7r>`L6rcqnfJlQL4fzSs9%u*j06qh{108{GKnLJ+fXb)3XtKe;5P+hV3Je2i^=Y-o0F(uEN96!tVSf2WppKM@O6rhKDMYD5Z75SIwY~=O zfJp#FM2Q4>PSKbKkoPp+6ksYa1DFnc1Iz;E0<-oSu;2!`7mI6x*ppdQv z)&U!U^}t$S4X_%Za^fUuDYgUKfE_>)uoIxMJ_mLKdw>L>ls@fiplC$?3f7Yi6+f(C zNz6h-tYkr8nJZbOl?Cd51a1Lpz(SO*WJ!tS_zU1UV9NBjc>;7Qe+AS6WOo$s5>VQb z)17zn5|t;JgVQ}D{aH8ftE;mv4%^vRV*LYr1AYDBu{gY$IWSW( zXA6X*7_b$hrPvA~X^q93t;{}GISs0uq%vauzJd4;aWKXQB&4%)*6Krz;Yewo;W$># zhZ^P3sd8ZJLydAQRXNgSs8M609mc|93$qVaPO>Vez&>^)Dre?C43=Xd8g65O!OHp8{S6vg_nWimYa`amHz14_a3!+M8B4JHuZK_T zI-YL!q2_>?unlXk9GNv9d1+AEch95`4QfRZ8c6o_#o2AJLOF9gbI#kPCGJ+ge`pwA zf5CPHUw=whmG@h8Gt-(++a3GRKsm=7+G1;1;Oh$=KGf_JUADsr<=}6x+lLFMRZnvK z(BO@jga(qWrC5qNoRyQq^?$w?(DKchHy;{ywGyMr^dyQ}_Vh+ysj`CAI z@8zp;Lyq>Iw^m{dC73zS!%_UWli7Fc2#z(&8x&uDbb0-iYTU~xu|Z zD6{%u=xPY%DKQIOos^TKUHy)(ayVVyK%QN;t45TefnReuaSjbb{(WGYM~e{UtniXWO%HY9>#NZsRPT>+ns|6^>z7@I_HaT? zE8h_EG^&YMPJNYg$PN_+np^ohHlqdI13`HAYN9`(Y-?Gxf9#y$3sDo`+lnkpYa$+^ zuak1X`f$r7H`>P9ca~cO`i9}%OSqO`_g^X^&tmD6!@si&cgDV*a30SbSRtoHxkyJl zC*>e`<@B2)i@KgRl^cZ6ee_HeqJd=LE)J9+7Rm|qHUYX`j+5?ek!O@|xX$k430h!E z&0gkhI=!j>NV~P&;4T_Kc9Mi`!T#Br6da<@f&!sa<+W4Tkln`^8adT@EEJ0 zoIZc}a^S52Hm0rQpvh4^A-WvE(4+jskOMI7kyrw%UyO$0%mHQ_;g9~f?cbk5{|~E= zz$@p}r$kU^Q1BSt67(eJ!)IS9vfK_cxSJna=ER(_Cy&dNdby2~nWOfmT-NbVRw zYuPSXJU)nRS2=Nh#Nyt@j>UtjWS0VIHR6Ir_#xVEgT;tL7+c@N-dQ=b9=5<|o?E#! z?yrgd`cy=VL+HWoimF5K@lRoPm~{!hixf12dw%P+M}Es6H~}*tNyvERIQ_7QdDAm5 z|9BEL!TOp~G3zi!m@n2JX6-d&+Q@H(d5=ZSVHQ;K$q{z64t9U_G4??JCe*M*eVpBt z^d!abb|eN?Fh``qgo?k3;J?(eSfuU&#NTd-4+E=KmKrE^d13CMEsPF+28Q z>bc*sM%eGRf5(EPeoe&P@0gE%vKzwgygb=I+X&+tiG}C!>K-IM*xN|7y1;BrWGitq zcfY`V{<*$n&jp72UjLRUu3ut~_@4qwsxPs+b)f9I#!i@FS1zfjWY6ldU~%9f8!vs` zaDAIcOfBy8lT5^E4=Jyt%~Lj=i5}I=Uc9NsyRcskwuBr}w;DF(R5Kf4T7#ch`Z@ZH zIio75nt6!yYGx%4RkH@-el@c&$rzD5d|>t<(W-{IEvRO;;^8yA*4}=Ge~f6Wq4}ec zSpSlli-py!zPMD)8j1lp@h=KrFfY=&iZd_R=VI$i)fyQ<(p+(lRPpGk}I9JP}sE4Vjdc|~N`fCrd zBH(0yHpJM7Q4^yv_xIiJ``!E3ea|n?to5wDc3Eqe8IC)* zZtHH{)-4Tc81&$LfpLI#+w%GMsy_QD%W+3eXg$%t{x2t<`INM4|LLuqp0nM@W+Y8d znm9FM@}!KZqcbuzBP}!q!qp45+kY13Vt9%-yJ9q+Q1ITd5CXkMh4I!)RkiCN@>su&| zVb~4X2r>uK8!}y${UE7ZZ}4g{-rx{TFb1@T-tCD;F_n^3Q{`ft=-`$cf;!!EMkdCHNie)L)n) zGqe6c0X5JLgQJT7w}#9O%trQTKx#u-2QV-i&{_md9V}JljO3Kj$r_C&B_nBO5@aJJ zi2|yIwA1jhwHjrfME-nX%7>(sEl{O1B+YFqB&F;>=42o$(U8X^jhZ$NO{Znx15Ys~ zj8fef^=K|zLsIO1khCbZkTle}&E)#^veHx1(i6vOG~-eyjiLs^xVuHO%w~Q{BomTm zO(*Mle}#`tO`JM4X^f`YM`>nkV#d@dC{ItCmXR`cmgds{W!OWSE2-ZMNf8?%soOhh zy#*~4zwsG?vl7!%HHqotCMTw6B+Y>xQ¨Fi>gWD@d9m124C5b*KzdW;!Wja(WUn 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, get) => ({ ...getDefaultState(), From 774927022844dd430e250615562cd94af5fe9a6f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 18:07:01 +0200 Subject: [PATCH 138/346] 0.0.22 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useTimeline.ts | 25 ++----------------- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 319f38b6..c119eaee 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.21", + "version": "0.0.22", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 0b0ee1b2..bac5bc2b 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -53,7 +53,8 @@ export const useTimeline = create((set, get) => ({ let defaultSegmentDurationInSteps = get().defaultSegmentDurationInSteps - let totalDurationInMs = 0 + // let's trust developers for respecting this + let totalDurationInMs = Math.max(0, clap.meta.durationInMs || 0) // TODO: this whole approach is a bit weak, // having an heuristic is okay but we should do it: @@ -62,7 +63,6 @@ export const useTimeline = create((set, get) => ({ // do something for images/videos that don't have the right ratio, // eg. add black banding for (const s of segments) { - totalDurationInMs = s.endTimeInMs > totalDurationInMs ? s.endTimeInMs : totalDurationInMs if (s.category === ClapSegmentCategory.CAMERA) { const durationInSteps = ( @@ -89,19 +89,6 @@ export const useTimeline = create((set, get) => ({ defaultSegmentLengthInPixels / defaultMediaRatio ) - /* - console.log("WTF:", JSON.parse(JSON.stringify({ - defaultSegmentDurationInSteps, - cellWidth, - defaultPreviewHeight, - defaultCellHeight, - "clap.meta.width": clap.meta.width, - "(clap.meta.height": clap.meta.height, - defaultSegmentLengthInPixels, - defaultMediaRatio - }))) - */ - for (const s of segments) { if (idCollisionDetector.has(s.id)) { @@ -145,14 +132,6 @@ export const useTimeline = create((set, get) => ({ */ } - - } - - if (s.category === ClapSegmentCategory.CAMERA) { - const durationInSteps = ( - (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP - ) - defaultSegmentDurationInSteps = durationInSteps } } From e8be8d4f1acdf963efa464772c7cef2911ea2a0a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 11 Jun 2024 23:19:59 +0200 Subject: [PATCH 139/346] 0.0.23 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/components/cells/Cell.tsx | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index c119eaee..4abb01bb 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.22", + "version": "0.0.23", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index c98da401..ba3ee207 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -157,7 +157,11 @@ export function Cell({ // TODO also add the buttons to Dialogue, Sound, Music etc.. // also maybe fix the display, as when zoomed out it doesn't look good (s.category === ClapSegmentCategory.STORYBOARD - || s.category === ClapSegmentCategory.VIDEO) + || s.category === ClapSegmentCategory.VIDEO + || s.category === ClapSegmentCategory.DIALOGUE + || s.category === ClapSegmentCategory.SOUND + || s.category === ClapSegmentCategory.MUSIC + ) && Date: Thu, 13 Jun 2024 12:06:12 +0200 Subject: [PATCH 140/346] update parser --- packages/broadway/.gitignore | 2 + ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 157453 -> 0 bytes .../src/analysis/analyzeScreenplay.ts | 46 +++++-- .../src/analysis/loadAgeAndGenderDataset.ts | 6 +- .../src/analysis/parseScriptToClap.ts | 15 ++- packages/broadway/src/constants/mocks.ts | 15 ++- .../broadway/src/parsers/eras/database.ts | 121 ++++++++++++------ .../broadway/src/parsers/genres/database.ts | 3 + .../broadway/src/parsers/lights/database.ts | 46 +++++++ .../broadway/src/parsers/music/database.ts | 29 ++++- .../broadway/src/parsers/sounds/database.ts | 110 ++++++++++++++++ .../parsers/utils/createOccurrenceCounter.ts | 5 +- .../broadway/src/parsers/weather/database.ts | 40 +++++- packages/broadway/src/tests/main.test.ts | 21 ++- 14 files changed, 384 insertions(+), 75 deletions(-) delete mode 100644 packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap diff --git a/packages/broadway/.gitignore b/packages/broadway/.gitignore index 5696d8f8..3b1990b8 100644 --- a/packages/broadway/.gitignore +++ b/packages/broadway/.gitignore @@ -1,5 +1,7 @@ # Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore +tests/cache/*.csv + .age_and_gender_dataset_cache # Logs diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap deleted file mode 100644 index cc299c9759ed59bb6593d09b130ce2c70313b628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157453 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
wd#8?-QK@R956x(#toa$AM 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 z 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
l42|-*%U>;dI9r@tR_N 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 E0Jeu)EC2ui diff --git a/packages/broadway/src/analysis/analyzeScreenplay.ts b/packages/broadway/src/analysis/analyzeScreenplay.ts index 4f4301c1..5ed0006d 100644 --- a/packages/broadway/src/analysis/analyzeScreenplay.ts +++ b/packages/broadway/src/analysis/analyzeScreenplay.ts @@ -26,6 +26,8 @@ export async function analyzeScreenplay( screenplay: Screenplay, onProgress?: (value: number, message?: string) => Promise ): Promise<{ + movieGenreLabel: string + extraPositivePrompt: string[] segments: ClapSegment[] entitiesByScreenplayLabel: Record entitiesById: Record @@ -55,18 +57,20 @@ export async function analyzeScreenplay( let movieEras = await getMostProbableEras(screenplay.fullText, 2) let movieEraLabel = Object.keys(movieEras)[0] || "contemporary" - // console.log("movieEras:", movieEras) let movieEra = getEra(movieEraLabel) + // console.log("movieEras:", { movieEras, movieEraLabel, movieEra }) await onProgress?.(progress += 10, "Analyzing genre..") // using the movie genre isn't probably a good idea because thousands of words will be mentionned, // triggering a lot of different and unrelated genres // still this is useful when the genre if a given sequence cannot be guessed let movieGenres = await getMostProbableGenres(screenplay.fullText, 20) - let movieGenreLabel = Object.keys(movieGenres)[0] || "classic" + let movieGenreLabel = Object.keys(movieGenres)[0] || "" let movieGenre = getGenre(movieGenreLabel) await onProgress?.(progress += 10, "Analyzing each scenes..") + const extraPositivePrompt = movieGenreLabel ? [movieGenreLabel]: [] + /* console.log("movie:", { movieEras, @@ -248,17 +252,23 @@ export async function analyzeScreenplay( const sequenceLocation = sequence.location.join(", ") if (sequenceLocation) { - // console.log("new non-empty location detected, so resetting all buffers") - currentDescription = "" // this should be slightly long-lived - currentAction = "" // this should be short lived - currentLocationName = "" - currentLocationType = "UNKNOWN" - currentTime = "" - currentLighting = "" - currentWeather = "" + const weAreStillAtTheSameLocation = sequenceLocation !== currentLocationName + + // we reset those for each shot currentShotType = "" currentSound = "" - currentMusic = "" + currentAction = "" + + // while those last for longer spans of time + if (weAreStillAtTheSameLocation) { + currentDescription = "" + currentLocationName = "" + currentLocationType = "UNKNOWN" + currentTime = "" + currentLighting = "" + currentWeather = "" + currentMusic = "" + } } currentDescription = ( @@ -590,7 +600,11 @@ export async function analyzeScreenplay( const defaultSoundPrompt = event.type === ClapSegmentCategory.DIALOGUE - ? ["people talking"] + + // a generic "people talking" sound isn't very interesting + ? [] + // ? ["people talking"] + // event.description.includes(" SOUND ") // ? event.description : : currentLocationType === "EXTERIOR" && currentTime !== "night" @@ -729,5 +743,11 @@ export async function analyzeScreenplay( // } - return { segments, entitiesByScreenplayLabel, entitiesById } + return { + movieGenreLabel, + extraPositivePrompt, + segments, + entitiesByScreenplayLabel, + entitiesById + } } \ No newline at end of file diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts index 0710fcba..0b633468 100644 --- a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -21,8 +21,10 @@ export const state: { nameToStats: {}, } +const DEFAULT_DOWNLOAD_URL = "https://huggingface.co/datasets/jbilcke-hf/detection-of-age-and-gender/resolve/main/baby-names-us-year-of-birth-full.csv?download=true" + // note: this takes about 140 Mb of memory -export async function loadAgeGenderNameStats() { +export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) { let nameToStats = {} as Record // unfortunately we cannot use this kind of caching for now, @@ -49,8 +51,6 @@ export async function loadAgeGenderNameStats() { // } // } - const url = "https://huggingface.co/datasets/jbilcke-hf/detection-of-age-and-gender/resolve/main/baby-names-us-year-of-birth-full.csv?download=true" - console.log(`downloading age and gender detection dataset from Hugging Face (jbilcke-hf/detection-of-age-and-gender)`) const res = await fetch(url) diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts index 59f53b79..d17b501e 100644 --- a/packages/broadway/src/analysis/parseScriptToClap.ts +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -30,7 +30,7 @@ export async function parseScriptToClap( await onProgressUpdate({ value: 20 }) - const { segments, entitiesById, entitiesByScreenplayLabel } = await analyzeScreenplay( + const { movieGenreLabel, extraPositivePrompt, segments, entitiesById, entitiesByScreenplayLabel } = await analyzeScreenplay( screenplay, async (progress, message) => { // progress is a value between 0 and 100 @@ -46,22 +46,29 @@ export async function parseScriptToClap( await onProgressUpdate({ value: 60 }) + let durationInMs = 0 + segments.forEach(s => { + if (s.endTimeInMs > durationInMs) { + durationInMs = s.endTimeInMs + } + }) + // TODO: return a ClapProject instead const clap = newClap({ meta: { id: UUID(), title: "Untitled", - description: "", + description: `${movieGenreLabel}`, synopsis: "", licence: "All rights reserved by the IP holder", orientation: ClapMediaOrientation.LANDSCAPE, - durationInMs: 0, + durationInMs: segments.filter(s => s.endTimeInMs), width: 1024, height: 576, defaultVideoModel: "", - extraPositivePrompt: [], + extraPositivePrompt: extraPositivePrompt, screenplay, isLoop: false, isInteractive: false, diff --git a/packages/broadway/src/constants/mocks.ts b/packages/broadway/src/constants/mocks.ts index 35145c15..189e518a 100644 --- a/packages/broadway/src/constants/mocks.ts +++ b/packages/broadway/src/constants/mocks.ts @@ -190,8 +190,8 @@ export const mockCategoryPrompts: Record = { "at night, moonlit" ], era: [ - "in 1700", - "during piracy times" + // "in 1700", + // "during piracy times" ], weather: [ "cloudy, soft mist", @@ -211,9 +211,14 @@ export const mockCategoryPrompts: Record = { "sea noises", ], music: [ - "instrumental orchestra for sailing a ship, 1700", - "epic orchestral with strings, 1800", - "suspensful instrumental orchestra, 1700", + "cinematic music", + "adventurous instrumental orchestra", + "epic orchestral with strings", + "cinematic instrumental orchestra", + "suspensful instrumental orchestra", + // "instrumental orchestra for sailing a ship, 1700", + // "epic orchestral with strings, 1800", + // "suspensful instrumental orchestra, 1700", ], transition: [ "cut to" diff --git a/packages/broadway/src/parsers/eras/database.ts b/packages/broadway/src/parsers/eras/database.ts index b149af3d..c3f18311 100644 --- a/packages/broadway/src/parsers/eras/database.ts +++ b/packages/broadway/src/parsers/eras/database.ts @@ -132,12 +132,12 @@ export const data: NamedEntity[] = [ "label": "antiquity", "aliases": { "en": [ - "antiquity", + // "antiquity", "oracle", "atlar", "nobilis", - "tunic", - "toga", + //"tunic", + //"toga", "calceus", "calcei", "proletarii", @@ -430,7 +430,11 @@ export const data: NamedEntity[] = [ "1916", "1917", "1918", - "WW1" + "WW1", + "Western Front", + "French trench", + "German trench", + "German shells" ] }, prompts: { @@ -438,7 +442,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["1914", "1915", "1916", "1917", "1918"], + era: ["during WW1"], // ["1914", "1915", "1916", "1917", "1918"], lighting: [], weather: [], action: [], @@ -465,6 +469,8 @@ export const data: NamedEntity[] = [ "1945", "WW2", "WWII", + "Western Front", + "German shells" ] }, prompts: { @@ -472,7 +478,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["1939", "1940", "1944", "1945"], + era: ["during WW2"], // ["1939", "1940", "1944", "1945"], lighting: [], weather: [], action: [], @@ -483,6 +489,41 @@ export const data: NamedEntity[] = [ camera: ["color footage", "in color"], } }, + { + "label": "The 50s", + "aliases": { + "en": [ + "the fifties", + "50s", + "1950", + "1951", + "1952", + "1953", + "1954", + "1955", + "1956", + "1957", + "1958", + "1959", + "Eisenhower era" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: ["during the 50s"], // ["1950", "1952", "1954", "1955", "1957", "1958", "1959"], + lighting: [], + weather: [], + action: [], + music: ["50s"], + sound: [], + dialogue: [], + style: ["50s", "fifties"], + camera: ["color footage", "in color"], + } + }, { "label": "The 60s", "aliases": { @@ -508,7 +549,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["1960", "1962", "1964", "1965", "1967", "1968", "1969"], + era: ["during the 60s"], // ["1960", "1962", "1964", "1965", "1967", "1968", "1969"], lighting: [], weather: [], action: [], @@ -543,7 +584,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["1970", "1972", "1974", "1975", "1977"], + era: ["during the 70S"], // ["1970", "1972", "1974", "1975", "1977"], lighting: [], weather: [], action: [], @@ -577,7 +618,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["1980", "1982", "1984", "1986"], + era: ["during the 80s"], // ["1980", "1982", "1984", "1986"], lighting: [], weather: [], action: [], @@ -612,7 +653,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["1990", "1992", "1994", "1995", "1996", "1998"], + era: ["during the 1990s"], // ["1990", "1992", "1994", "1995", "1996", "1998"], lighting: [], weather: [], action: [], @@ -648,7 +689,7 @@ export const data: NamedEntity[] = [ location: [], transition: [], time: [], - era: ["2000", "2001", "2002", "2007", "2008"], + era: ["2005 style"], // ["2000", "2001", "2002", "2007", "2008"], lighting: [], weather: [], action: [], @@ -665,44 +706,44 @@ export const data: NamedEntity[] = [ "en": [ "present day", "cash register", - "streetlight", - "streetlights", + // "streetlight", + //"streetlights", "security camera", - "gasoline", + //"gasoline", "gas station", "security footage", "plastic bottle", - "telephone pole", + //"telephone pole", "security console", - "stethoscope", - "chevy", - "christmas lights", - "headphone", - "headphones", - "hearing aid", - "driveway", - "car", - "cars", - "truck", - "trucks", - "bike", - "motorbike", - "phone", + //"stethoscope", + //"chevy", + //"christmas lights", + //"headphone", + //"headphones", + //"hearing aid", + //"driveway", + //"car", + //"cars", + //"truck", + //"trucks", + //"bike", + //"motorbike", + //"phone", "phone company", - "telephone", - "electric", - "electricity", - "electric lines", + //"telephone", + //"electric", + //"electricity", + //"electric lines", "tv", - "television", - "radio", - "toaster", + //"television", + // "radio", + //"toaster", "microwave", - "coffee machine", - "train", - "train station", + //"coffee machine", + // "train", + // "train station", // "camera", <- no, this is used by the script itself! - "photo", + // "photo", ] }, prompts: { diff --git a/packages/broadway/src/parsers/genres/database.ts b/packages/broadway/src/parsers/genres/database.ts index aaef411b..d48b0feb 100644 --- a/packages/broadway/src/parsers/genres/database.ts +++ b/packages/broadway/src/parsers/genres/database.ts @@ -552,6 +552,7 @@ export const data: NamedEntity[] = [ "bomber", "bombers", "bombardier", + "Western Front" ] }, prompts: { @@ -584,6 +585,7 @@ export const data: NamedEntity[] = [ "1917", "1918", "WW1", + "Western Front" ] }, prompts: { @@ -618,6 +620,7 @@ export const data: NamedEntity[] = [ "1945", "WW2", "WWII", + "Western Front" ] }, prompts: { diff --git a/packages/broadway/src/parsers/lights/database.ts b/packages/broadway/src/parsers/lights/database.ts index fab0cef9..1ad63320 100644 --- a/packages/broadway/src/parsers/lights/database.ts +++ b/packages/broadway/src/parsers/lights/database.ts @@ -457,6 +457,52 @@ export const artificalLights: NamedEntity[] = [ camera: [], } }, + { + "label": "braizer", + "aliases": { + "en": [ + "brazier", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "braziers", + "aliases": { + "en": [ + "braziers", + ] + }, + prompts: { + character: [], + transition: [], + location: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, { "label": "candelabre", "aliases": { diff --git a/packages/broadway/src/parsers/music/database.ts b/packages/broadway/src/parsers/music/database.ts index 05e4b2c1..30d2ad8d 100644 --- a/packages/broadway/src/parsers/music/database.ts +++ b/packages/broadway/src/parsers/music/database.ts @@ -54,7 +54,8 @@ export const data: NamedEntity[] = [ "aliases": { "en": [ "spaceship", - "astronaut" + "astronaut", + "blaster" ] }, prompts: { @@ -98,5 +99,31 @@ export const data: NamedEntity[] = [ style: [], camera: [], } + }, + { + "label": "club music", + "aliases": { + "en": [ + "club music", + "dancing in the club", + "entering the nightclub", + "nightclubbers" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } } ] \ No newline at end of file diff --git a/packages/broadway/src/parsers/sounds/database.ts b/packages/broadway/src/parsers/sounds/database.ts index 3c9ae128..818456f0 100644 --- a/packages/broadway/src/parsers/sounds/database.ts +++ b/packages/broadway/src/parsers/sounds/database.ts @@ -822,6 +822,16 @@ export const placeSounds: NamedEntity[] = [ "label": "birds singing", "aliases": { "en": [ + "birds", + "bird", + "birdsong", + "birdsongs", + "bird song", + "bird songs", + "bird singing", + "birds singing", + "singing bird", + "singing birds", "garden", "forest", "meadow", @@ -1635,6 +1645,55 @@ export const actionSounds: NamedEntity[] = [ camera: [], } }, + { + "label": "boots clattering", + "aliases": { + "en": [ + "boots clattering", + "boots footsteps", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "wood clattering", + "aliases": { + "en": [ + "wood clattering", + "clattering over the wood", + "clattering over the wooden", + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, { "label": "liquid pouring", "aliases": { @@ -1697,6 +1756,8 @@ export const actionSounds: NamedEntity[] = [ "aliases": { "en": [ "little laugh", + "lets out a laugh", + "a laugh" ] }, prompts: { @@ -2546,6 +2607,55 @@ export const eventSounds: NamedEntity[] = [ camera: [], } }, + { + "label": "rummaging", + "aliases": { + "en": [ + "rummages in his pocket", + "rummages in his pockets", + "rummages in", + "rummaging" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "breaking bread", + "aliases": { + "en": [ + "breaks the bread" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, ] export const data = [ diff --git a/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts b/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts index 9875b80f..0eb02edd 100644 --- a/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts +++ b/packages/broadway/src/parsers/utils/createOccurrenceCounter.ts @@ -3,7 +3,7 @@ import { SimpleNamedEntityParser, SimpleOccurrencesCounter } from "@/types" export const createOccurrenceCounter = (parser: SimpleNamedEntityParser): SimpleOccurrencesCounter => { return async (input: string, minimumOccurrences: number): Promise> => { - + // console.log("input:", input) const detected = await parser( [ input ], [], @@ -15,7 +15,7 @@ export const createOccurrenceCounter = (parser: SimpleNamedEntityParser): Simple detected.forEach(value => { stats[value] = (stats[value] || 0) + 1 }) - + // console.log("detected:", detected) const finalStats: Record = {} Object.entries(stats) @@ -28,6 +28,7 @@ export const createOccurrenceCounter = (parser: SimpleNamedEntityParser): Simple finalStats[s.key] = s.value }) + //console.log("DEBUG:", stats) return finalStats } } \ No newline at end of file diff --git a/packages/broadway/src/parsers/weather/database.ts b/packages/broadway/src/parsers/weather/database.ts index 30a89808..2dd31b58 100644 --- a/packages/broadway/src/parsers/weather/database.ts +++ b/packages/broadway/src/parsers/weather/database.ts @@ -26,13 +26,15 @@ export const data: NamedEntity[] = [ } }, { - "label": "storm", + "label": "stormy", "aliases": { "en": [ "tempest", "lightning", "thunder", - "storm" + "storm", + "stormy", + "storms" ] }, prompts: { @@ -52,7 +54,31 @@ export const data: NamedEntity[] = [ } }, { - "label": "rain", + "label": "no rain", + "aliases": { + "en": [ + "no rain", + "not raining" + ] + }, + prompts: { + character: [], + location: [], + transition: [], + time: [], + era: [], + lighting: [], + weather: [], + action: [], + music: [], + sound: [], + dialogue: [], + style: [], + camera: [], + } + }, + { + "label": "raining", "aliases": { "en": [ "heavy rain", @@ -78,12 +104,14 @@ export const data: NamedEntity[] = [ } }, { - "label": "fog", + "label": "foggy", "aliases": { "en": [ "fog", "foggy", - "mist" + "mist", + "misty", + "soft mist" ] }, prompts: { @@ -103,7 +131,7 @@ export const data: NamedEntity[] = [ } }, { - "label": "sun", + "label": "sunny", "aliases": { "en": [ "sun", diff --git a/packages/broadway/src/tests/main.test.ts b/packages/broadway/src/tests/main.test.ts index 2c8d94f3..aa960ae5 100644 --- a/packages/broadway/src/tests/main.test.ts +++ b/packages/broadway/src/tests/main.test.ts @@ -8,6 +8,7 @@ import { parseScriptToClap } from ".." require("./bun-shims.js") describe("main demo", async () => { + test("parseScriptToClap", async () => { const scriptName = "Afterglow v10 X Rewrite Bryan E. Harris 2023" const inputScriptFilePath = `./samples/scripts/${scriptName}.txt` @@ -17,7 +18,7 @@ describe("main demo", async () => { const clap: ClapProject = await parseScriptToClap(script) - expect(clap.segments.length).toBe(3010) + expect(clap.segments.length).toBe(2837) const blob = await serializeClap(clap) @@ -33,4 +34,22 @@ describe("main demo", async () => { // we currently don't cache the result, // because this was too much platform-specific (file system caching, so for Node only) 30000) + + + /* + test("julianDemo", async () => { + const inputScriptFilePath = `/Users/jbilcke/Documents/scripts/Raiders of the Lost Ark.txt` + const outputScriptFilePath = `/Users/jbilcke/Documents/clap_playground/Raiders of the Lost Ark.clap` + + // const inputScriptFilePath = `/Users/jbilcke/Documents/scripts/1917.txt` + // const outputScriptFilePath = `/Users/jbilcke/Documents/clap_playground/1917.clap` + + + const script = await readPlainText(inputScriptFilePath) + const clap: ClapProject = await parseScriptToClap(script) + const blob = await serializeClap(clap) + await Bun.write(outputScriptFilePath, blob) + }, + 30000) + */ }) \ No newline at end of file From 38b31476d66d6588dd3c657b62e94e393233260c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 13 Jun 2024 12:06:41 +0200 Subject: [PATCH 141/346] update broadway to 0.0.14 --- packages/broadway/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 760245ad..076533e6 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.13", + "version": "0.0.14", "description": "Convert a script to a clap file", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", From 491ea3fe313046ff17c67721615764a9a128d2a3 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 13 Jun 2024 15:50:49 +0200 Subject: [PATCH 142/346] 0.0.24 --- packages/aitube-timeline/package.json | 2 +- .../components/timeline/TopBarTimeScale.tsx | 12 +++++++++- .../src/hooks/useSegmentLoader.ts | 5 ++++- .../aitube-timeline/src/hooks/useTimeline.ts | 22 ++++++++++++++----- .../aitube-timeline/src/types/timeline.ts | 4 +++- .../src/utils/getDefaultState.ts | 2 +- 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 4abb01bb..257350ce 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.23", + "version": "0.0.24", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 22bbc442..530995d0 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -81,6 +81,8 @@ export function TopBarTimeScale() { } } } + evt.stopPropagation() + return false } document.addEventListener("mousemove", onMouseMove) return () => { @@ -99,6 +101,13 @@ export function TopBarTimeScale() { onWheel={(e) => { if (e.offsetY > topBarTimeScaleHeight) { return } + const disableWheel = true + if (disableWheel) { + console.log(`user tried to change the horizontal scale, but it is disabled due to rescaling bugs (@Julian fix this!)`) + e.stopPropagation() + return false + } + const wheelFactor = 0.3 setHorizontalZoomLevel( @@ -107,6 +116,7 @@ export function TopBarTimeScale() { // ) ) e.stopPropagation() + return false }} onPointerDown={(e) => { const cursorX = e.point.x + (size.width / 2) @@ -114,8 +124,8 @@ export function TopBarTimeScale() { const { wasPlaying } = togglePlayback(false) wasPlayingRef.current = wasPlaying setCursorTimestampAtInMs(cursorTimestampAtInMs) - setIsDraggingCursor(true) jumpAt(cursorTimestampAtInMs) + setIsDraggingCursor(true) e.stopPropagation() return false }} diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 076aef77..59e3fb87 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -27,9 +27,12 @@ export const useSegmentLoader = ({ const segments = useTimeline((s) => s.segments) const segmentsChanged = useTimeline((s) => s.segmentsChanged) - // console.log(`segmentsChanged:`, segmentsChanged) + // why do we have to do this? + //const silentChangesInSegments = useTimeline(s => s.silentChangesInSegments) + //console.log(`silentChangesInSegments:`, silentChangesInSegments) + const loadedSegments = useTimeline((s) => s.loadedSegments) const setLoadedSegments = useTimeline((s) => s.setLoadedSegments) diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index bac5bc2b..b018a92d 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -17,12 +17,19 @@ import { findFreeTrack } from "@/utils/findFreeTrack" export const useTimeline = create((set, get) => ({ ...getDefaultState(), - setClap: async (clap?: ClapProject) => { + + clear: () => { // this re-initialize everything that is related to the current .clap project set({ ...getDefaultProjectState() }) + }, + + setClap: async (clap?: ClapProject) => { + const { clear } = get() + + clear() if (!clap || !Array.isArray(clap?.segments)) { console.log(`useTimeline: no clap to show`) @@ -135,8 +142,6 @@ export const useTimeline = create((set, get) => ({ } } - - for (let id = 0; id < tracks.length; id++) { if (!tracks[id]) { tracks[id] = { @@ -286,9 +291,14 @@ export const useTimeline = create((set, get) => ({ } }, - trackSilentChangeInSegments: () => { - const { silentChangesInSegments } = get() - set({ silentChangesInSegments: silentChangesInSegments + 1 }) + trackSilentChangeInSegment: (segmentId: string) => { + const { silentChangesInSegments, silentChangesInSegment } = get() + set({ + silentChangesInSegments: 1 + silentChangesInSegments, + silentChangesInSegment: Object.assign(silentChangesInSegment, { + [segmentId]: 1 + (silentChangesInSegment[segmentId] || 0) + }) + }) }, setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => { set({ timelineCamera }) diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 088d5af8..5b8b327b 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -85,6 +85,7 @@ export type TimelineStoreProjectState = { // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing silentChangesInSegments: number + silentChangesInSegment: Record isDraggingCursor: boolean @@ -149,6 +150,7 @@ export type TimelineStoreState = TimelineStoreProjectState & TimelineStorePrefer export type TimelineStoreModifiers = { + clear: () => void setClap: (clap?: ClapProject) => Promise setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: ClapSegment[]) => void @@ -161,7 +163,7 @@ export type TimelineStoreModifiers = { // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing - trackSilentChangeInSegments: () => void + trackSilentChangeInSegment: (segmentId: string) => void setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => void setTimelineControls: (timelineControls?: TimelineControlsImpl) => void diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 1b97c19d..3ef1e06a 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -51,7 +51,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing silentChangesInSegments: 0, - + silentChangesInSegment: {}, scrollX: 0, scrollY: 450, From d57ea76d4a92293f313f78373f99266ee12e431a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 15 Jun 2024 01:17:52 +0200 Subject: [PATCH 143/346] add scenes --- packages/broadway/package.json | 2 +- ...low v10 X Rewrite Bryan E. Harris 2023.clap | Bin 0 -> 175097 bytes .../broadway/src/analysis/parseScriptToClap.ts | 8 +++++++- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 076533e6..0356fa4e 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.14", + "version": "0.0.15", "description": "Convert a script to a clap file", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap new file mode 100644 index 0000000000000000000000000000000000000000..a6a7349032bc546a7d50d1c7c631c5e616293799 GIT binary patch literal 175097 zcmZU)Q;;q^ur)lMJ+^0$ZJT>++qP}nwr$(C=Na3!`Mu{{od4oaRaW)7$VFGBlhvIL ze$*eJ{~e%LJ=?B0VvTg}yK)LEBMDxA$>dCr`%VinNSDwz6UzxLKHs8GiGCx6VFVlw z#aMby3h@nhvs+AcYx9hWnxF~fDS$-eXKZcMuD6*qXi%Am4^N}U$Nwaw9UB{)?i$;g z+amoarN*2RoV&B7!wo)VML(o$rqM+o%KUo(bnSbhjxx9BQB(Z}HwJ{^!;Fd4 zf;)D+hA#-jH?oQ8o@B}k1vB0My<;7^lX*D+|GFAlmVsz%66CDCmA)N2zIJA)@%szE z_xYE{mkHN2Y2bOrI#XtlMVb#hZ~fES6{WEWVO@sv$pB<7EeSY!N|_!vvmuYm3Fm-) zhWz|y{q1jemI3amFZ*2+PCCvk)|V^F!Drt@JF10wNCtu#Kb$wkZVDglB~r+)DavC( zHb?_s2ttyhGYtNF-_I?FGdq-lH#f`cb5YRwW@Gm^8TGV1_TsJCp+-6;27hO}&I0_D zw!I+MLm==qiRw7&A^{DL5e;UwMsW^vlf91Y9!zM7)MEq~c&B#QgcoyQTCb-|icU_i z@8i$c_4}(?S=xHlV^WkI{p{SXh$S}8X~Sd23@PK|e=b${Wo!e%M9=8I9U2QJSo~oC zopBmroN~!N8`q|{P)Z=$>7Y49!Kl5lGsrHx<cA{^JIXpipzaJPWu$>c&T(Q zyH+_zh*I-mNHR#zud13F(ZkdAfb*LpPSOiwte;`mu=qvag0+<%bjf^uu5UKQ%rBVGa<0h}PAmcQHDgqh!_6u1|F7;jNq) zJMU_PwS!kDWmNwmW`@mC6OQEh;ZM~Yjg;?cB$}$AQw5`7#o}Pz=^zVG_*+amu4Ijb z0z!NY9aF7BGWU0Ztt_Yb?BdHnWN|J`GGvbdx|HLcX=QIhQIPaRvJqF}5_24+L7Z8I zU^0bPpHezjhrQzMa$tsjeZmc0Dm`d67*H487BsylKRuuOO_wPs3(+JQ6hpP!k!@B zgQN;8#=@?m9uxeX<@{T1vYmQ#@bo>Ds2%L!B(b+b$V3G7ry<`D6Kf)Z+CG3ZFau}! zfgm2~j=F5kfZ?K%p?fpX+v{U{ed4n!OvIzTp_SqJI_M}wK1Yf0IgNvw-JtxyI zQ|i?OLqCjkI~ueG^k^QXa*z!>AmBMGkQoq^zGT#+bid1+}_6pc;4k7G(tFGrh8uj^TlZe{E5Zo4@>d^!y> zUiduf&6s5Qa7j}?V(Q#B4Hz8>;(>8N>F@+b@V)>Ruq%sr^(I-X*X=kpe%)*x-JG7; zo!oEdm!D5-Uh(?pTgW<8Rbj^5UkC4kJy!E?|KiCazybIo7lU&6ATqQ-T&3;K*=19e z9?^4O7uWAyy+BMCBt6WY92{TePmwqxup{>NtoiP7X$xndm2aS@DHZcQ)VE?S@nVvba8(=p=oefar!cf z^gR#*DvF>kT6t0m>Of}vm_;S4DWz@Rd7T5~ptfW`%0c4XZmx7F=pSU!$WwU6I-164 zO<{?CMNRT>w7(-}Xh_|gEWh@b0traS%+ml2kPiN!al~Uxc|I|0=0HpX*mVIXl8QrE zn9A(S6J!;2Psr&X>3&T|nGED)A1tXS=OQ7-lWB?ILn_9Upk>4vg#b{1GAf9(cNutO z?)mZg=IwkN2AaLE&tf=z^VjpdNum1iUx@pVwcI)Xo#du$Csh0Ra5QB?(h||!Krw2t zw?L0E_m|5yax)C-!ADPXh@^S#$cq~T$yf{8`u+=;1cC==(y*4t(LaIObii8N=LwYk z$NRHfHWmfl7nmEpJRKY!O&~CP4Owu?h<149e)XfMN+EsGB?WSj;2o~2cbMVCiz8RC z2rprr#xd|Kloc_{+o>mYr_`SSKU(&es{Iv%s6j^Yy2W=4BKkaoAx*9_Tr_>Bz^Dq) zQ2!Yy2ue$ueOXDO)r1XIy{99em+g^>&sDRux;gyrIfOEdG<;b-y`1mn!ZR*jFLxeU zM?(LxUexw)E7HNv0oR z{ntbkq$BK@!; zuZM(Vl*epOoE9>Hay6p3M-^h4ss&E=NwJpuO;?henVnz6F#r3xu}Ply;m`hJA?GL% z@ejqKBF9Jx=+#VA_>K5HV_GmVeG2O`Y9P#xg~gAjW9oNXx;#kc<-^Q*8@0XRBR!;- zXe7)u)O*oz%YYo3suR#=ps2rDB3)Cs5gpvXAk+fVo=$e(&%QHhde4^+ZwJXXFG*kU zQTCC#)rU#-G}SaW1^AQ(W#l07K(gpGPONf10e1)y=aR0$?)rH577HVNo~1qoWYgR_ zzNy}smu>k zhpaq-02>+!W^u3?Ea6_A7{;`efZA?6`_kg0)xl8KW_rnX#= zD#D$3*4@X8|$-}&bMmScS1o376@Nw1Ew7P!zm^4*&HM9O|=gX%N zQEB`6IDi$a&Op_V@>T@&M<}PUQJz4Yi!2`^AQ>cI3Abn`_QBPK_ zxWd6r=#}=zbuHpgh7r|pS|BxFkTzPj<_L($%BZ*{-r*jdnYegt1G)dWgmXgaJ%i;p zV2Gvl;%aMntEa{^r$zftT4eJ#eXOZ?cP4D8>JDdq@Av)IFVc_S%g?3zP}(@O(d`uD zc5cV-x9sT+ATv&8!pSvRI)un)YI?=27YkvuSK>?t*anIb>h$AfSvprRJ?;C&D?MLw z3tE?9%N!Ha;ru}*TPnsc9b2EE$uaGL8Z|RX@Wo3#ytFp8CZd?uM@MKLea9UzN^(xc zu$6_thdjL8_ks8_9u-^nNmtP`YCPYXy+DW?oQ4epO_QI5N*TY@Hk-Yh|pAxPA^3qiNardRv)q))7SIXOXI^vMQ((7sDQ3N`g+WP zYsL>6LRN6kGEFt?@HVhKQ?~S!GUCm)>pqV_mXG3ZpP*dtI!0e9m?M4o)kw*(A(oyw zu`~SK&GCK*(R|)!mWIER`;}M%+Fq}D*Z)-7?PLmVB!v(80>%}{f>1lQ^mZY<=(yLE z)Fe!qPc_ZR4A2|^2{u%WHS3Z{^!fhy`UXtd{caV{aO$UKQa#hg=$3H z0Sx7m!ZjC4Tz*Q;Xv6qw{;2qP)eDq9Ya`c)P+az{+Z*x0O#*zX8hr9 z8RMI2C>~&gTb#$!L)5`5IZ;*KI?W(lBIA(ZaLgPPI@kcoEyMOOY8WpmC9^TDp0?Ky zJ$~k~mc12hshzn!MhE|FJcRvYl@aK>LaCgpA9iE6@B$~&XS^py@pV1v``+p!`71%9 z>+Vg3Ajn|cp%|`^O?((3hPjq^+>sV=ZZmEMsJ#jimx z0fj*tEJ@xVG-wf>?&s%v1+%!0F(ylkzAM8H@=?|<(o(}oIL(5lF`MIRngQQwDVEDr z&A~EMA$0tg(0DK1K7xxy1f$FlmSf1-n%i=5TxmOE>jFD>wLFO6C8l<|zDo0X{B(4{ z6y&#)o1^>Hp(EDE>ye_O{rhwE$*z`ysGHr(5ArWmEB=U~H#b=+9~E)I8|+ETKNBx7 z^K;XiOA3%(*eU`2d{g?RM9O-HDQ(0w<)0^A;v2U_=Cgdp-|r_>ZSIW9+7IM>X4i(I zo=`r-tYonpebH_x?1%(a2wF=7S*}BHZMskkt ziUtk3Z^N=2wtEjLY4a1FlCcwH_#$^K%>*x#Bocl)H4nWeU^I%=)w4k@#F}S^I%%d# zjf^`P%8H}8db^;dgJCrAjuR=anW@abjW(Y;2u7rRe{dq!uzlk2ej|_{&-C*$scj|#FLtWy-WeSnTh+u_8KXd} zN0Ecb_fiK-NRROSdY$6y@b*_DuO`@ljV}rQg|_7;K+X57ER5h-1}d7Jv5g%R1JtrX z+>WgW3$^K7fem<;Z3q)d_Vbu>rG*DKla#7-DIDgy=}$z50ViDkogwc*f(*TXh&v}Q z1CXnVrxSwJaS)C$z!fa0HVAK4nkXzC`;Bo#NAMap zOus~*YH1P9kf!}U!hsWOgyM+<8m1b$o1Mf+RVypZszIHB6oq(Zh_F7T15Sf8j|IE{ zcRSNTd*7g)?WXtS)&%TRiPJtpa&&jdlI~!|2$2P!Z0NJugptaui*mUTdbX0iINU=q zm*7txMAIi#BcFMr$_VDz`X(aQiK}8K;ul@lU@Ms9(*A}E=@w8$_1|Lj{Ma7ThH^CY z@O5?JRPoSYvNf1EQfl;#uYP-?wZt6g#vsWnYj;fs!n8TAO`VO8gpZDuX}S4|%Q~-Y zT_5C;%Wt*>Zrx$!hkW3Ws&tK7nAqqkIO_C21Fc1Oeo^18w7USD-;@95^O)D+F3zuC z!@XSCq?$^jE$ffEI#Icy_#&oG3b;_JC9c&ygO2*X#SWli%l7LvYLgH6(((sXK2)Vv?z*9S-W&9~k$c4IVL?Hf&037NQRHW%=8B z*qZS}rz?tAj-oLvjW}k{?0Y?YvtmW}DrohV16Z_f*o~l+flT7j43S7E$Q^=H5oZXS z)9jLKoD*8_r4S{moikX*r&2(|l}6dd=rH&COMpUJbc6mHXvVWdbEOhe_GFI{wndo^ zj}H_FNg1|Ak`%P5W<P5x)N|81&AxME_SRY|iI_fO)5#_6(l9XVY04&G}BtjJY&u+J4C z1`U(6WU`Z`&DB+zdza1^E|lH1tHVMv)cD8C(Zy3?VlWz-GwP$fK+LE4xWK@48GDQo znTn@m&GfCb%b(dGLMiV($@!MvY#QbDnv4>~rlA3vTq{Om9Gn?bSB|(+nwOHAKvI<# z-f;@?>WrAla~rNP;42omJNEe3G2^7+ODlQPrA>x_G+S&K%yS#8tfNwoI0yzF=8m}2 zah$lFRAx+i2Bl&#F#W1B&P+BCU9VqcQC>PTjp>aD4eB9_Mx>O=?q7cFJfOsF(3umV zdI8|xgCwlkr3s-o>BEI{?*~f%(C9F$N>HH!pcs7DEfWL7 zSfUrs*;(R~YB^CBm2Jl@hkaU_Pu4H;>6<}_$P92d=2*-Fz8LR_)v{8cLR>L{W`mq2 zg~C0OToVu&Jm|fp49@vXImf@r1KV(jMK)rPBuGhHQuN=Cn> zAI*eM0~kYaNr_a|rw8I@2lz>f}NZ$v=U|UQGHgC+OC|dRN4u7hPD)< z9g(?lLqM{9aijz#h*Dr+PkXCQ`%I?k-PZHBRn1V8Z4mW+T4{T`O8<*-_|S$d$}Iyh zei(%do^v7$%8>!E*Z_h=0yL0_5__JhAmh*t)x8yysr`Q5FuabDDluDL$IFCGl!UC4 z%ki531Wbp8(x1QD0wUH5qp(Hel5~ir9R^#B7m*_KR&DD$$X~J5TMPPD3xzdmZG$oJ z(~6?;Egb$;Hc(7_9jg8FVxFGe^M@gL^wxbp zaCaaB?|Imf^mZb!A)_96Q#wdB0vSq|2_Y_GA^Nh^R!&zK4S_>)6E`~NHCCIf<#P5? z!a>z&6rZPaPsf$p8#5j-x>^Paq?ERrbdQEDAx%@|A=UD zlfW5;QLo9r_{E6&&ws6%gJ?tAN*@`^GtOx$`!5~OfN!?^W2gphNC#!@3#o)u)86Le*kT3oe^3+%VPUM)O0#S=ik&Ys=9s;(dstK5w820<#gxq=Yft`0{bs+o zBmX{S`t&&>YXL&+ya9J@-%3cl3SM>Vi&E>5cM6+Gdgz3jH4=sz3+^s1IIX%ZXSR$k zlYn~5798pvCIpJ#$3oxLk>9uTLQR$QNwD&!Kg<~#9$7C%Rp5cgp^$X4yJmXK4`y$Q zZ!eeXDmJV|AjN#CN?yyg&dAS|sMyhc+0n6hiy)b!o3LUQ2Btv@C79du(hx1Ix{I&- zjU^dx?&;hG*>VoIJF5)!_eVmFBa;EQYi&lErnxC-%GG4)9bW9POQcBpw6+0CLxFQt zd>NtZ*6HdUmHVc)c2aMgHkG&j{M>b`{DYpkeofn$iON>>GuVwWI_`<=$Pbq|I4kj% zqFATc5<(<~nf^&AC@s7ti}L%)k1%a760F(?%Vt)%J1W0P=wjJNPZ?(496g(rPHEZ8 zgWOUeYw}Z~uvIbgcUEsaA|(i|eN|cUVV33HC17Y1$IM9uFuH3oXsYdI7^ZL5$_>I` zNlF-UPmz_MF$T&+ay$-1K&j-WIaH9@_?sb`t%u38zBo3VV#4L_D;obf0$kWzTwpiY zL)O0;cFmUV3VL`w>XsLy9tj1PcpXo$?4QAaXE6ga%sLj0b0_KaC2U(OXySHaEx{Ge zeu?XO0#gz!m~IJE>twx~dFnBZ#(kKX2u`zn+;fh+Rgn^9Jrf$=O`$t#)J)!cMyqd9I)q*GpSDUl`6?a!Hei4lX=5` z6m+*IrLMB?R*dCxT$$+?L&RY|w~MB~jcwcv_~e*5X-f&)1F8;|kR0iQ+`VE7b)WIZ zM%rn4?^&$AJI3G1)>CoGDq__vUMW);h6Q-l3$13b_m@@(t4b>Frg`@gJY75=SZg15 z(;Ze!ScJN)Ars349FrjRe7}$kL!&z_QXsJh+B&@5f0wg)e}J+t$$kaEg;<;zDl}7V z{-+NYd|Y|)-@+MPkJV6mXWEjo5@Z+3_f&S*uI2=zo$vFb>S^$Lo*Zu_6r*#9mkUeu{~}e{A}X+fnK3ZwYapRC)H06Yq0z`EN#$n6 zdcbL!VzauOF0?+kBSrML*C3{d@CfYbt4QO;w*{)7x6ig66|_`6)Sm4jk-B@P z*XKm@O25^?pkR00KF7=ysZSe{+Qb&eL==ZGi6{Ldl;}nk#ww6ry-KB>H07`9Qg{uh z%~4Uy;wPSHn)QW&WLf!&K&d1{QD#W>@1td;M115RAWepF7AT?eM&z)rarvl*-;ng! zf9n;b0fJS|ru%rWc5Mn^&(ZaEd-!NptRmivRJP#o`EW(f`4xefwAUBn!Saf~_~abP zpEHy&!pAsuEDWN?p(*7= zAm!CE(;FdZsj>6ma~7HhdcnWZRjLj+^Jr^U*uV8_Gg&exgrGa-SEeef_VP3g=GB6~ zhh1)E81(c_Q+hiAC=Wjvdro&*JAHgJzIqBes~Xd)>Y42 zN%(8>Tyni!7G$qc(B={$;Z+1KCr=}qtIo*K+&BRX2*^OU)qrvIErMB2_+V~{rHa%Y zAU4xQoc90$_!!;Y2-F$Efvpr^7&Y^QQy7x&fcJ1$l_ z6{J0CYSweuDpe1cQCF*}Xd1otzms1dhCUjdTyUJWRuqvKTuY2(BueNV+D!d8=|m|w z5zR@te?+Vqu5)sCb98lcz5P1X3|8i@5jtopoF4X%4lcIOKdVeV->W2`UF5PDZ$-F- zNqo1dJX*liw{h3~7bPMPGa@FuQ$(GP>$8@Z$`i-sK)EAgEDwY3 zfo2R1;u=vQyfB517uC*V?ad&9D|UdWC`o(ZD$$qkIn_@;@a`7a|En##;mgv|FR_r7 z&>AIn(AQPP>G^W___*93c2PA=aX7gp_i%anIo?aDP`{^DEk(YcB&7p6Ci`%F=9Sr{ zMFinPHfhjAr{;d&`+e6vU6CK2JTAQ0yOl-NsWwV!!3Cw;vh?6@?<5~8H(DYcypeTv zgI8osi)k?84o7b!*Qm}Uvz4W2!3q-beiOSo3YK9!5YP_uhkC;ElxC)Ie@G|%MB6;2xH z)I&42{d}35n;f;{>L2N-2Sx7!|HisM*MXOdv+5N?cq2XVWox3du@Bo zGS)!pY*M6(Cu!x2EO81n9_?zsqc92F9dnP-N2X)gRgXq^ebW>{_Pl7d)jL7XTb;3* z5N3MCk>QaFrbFT#VEwx^NH7>oyk6tvJ3fIWt+&qQTto=gDwT`-e+?oL;KyjJ8Y7?j zDdhDRK^%~GsHq>%ToxIB>L8Ogi{Oqe1zU>e#;&(N8?-7{-$`yPN=^-PKWDs?ol`n; zgXoXHSjG1UvL&4HTBns4;`aRVP}c?kNShti^0 z#2~5M(K*@are)IMO_4hBRXAe+y^s2-Gj@6ARZI;Gs*p4$oxKn@;mPajrAj!r;L-Av?fwC<@p z0UXc}1bhP8u3h^`7r&0ynUwmKl6_`YIvGVqtC&J5d}1#FYBE3DqZCH;kJEKmu2gylx32>4N*Mjeod|yK*${@$o8hVU z=l_v|IF#P}YNXzBTWedZgTPK)Z|8{?foh;5+rUHdqh^B2e5%{*nx0bqOzy0jllxVS z937es$7J4}>Nz_o(Lg$$#^K{V&pi+e3DCl5W+Dwb=mp)tO2rN@SLnIjXNIn@b>8V4 z16PD5x7n8evwsB`x*SNFdmEsdQV^1{qrwq^nsV~RA@>vJdK?FbM~Pu*>p!2~gB~=6 z*5JHWuvFS`eYLl$ozgPc1Gxju@%|X@pcMB^BDJki>tITItbPb-h2kyYwP|d!K^FK_ z#(1dt*a zcg)WI57v&E>rWzxS9}k~D+jrVz$by@MrF0}GS(ou-3Gh1GzKC^6E;ErJ<_{jWrcX0 zXCn`7%sw%EY$a_N!sc;AY$Q#EIOIxVb^-P#EFw|aAqIZCX{`+~lWJy#`T+A?a6Oy# zM^8I8<$a}YIG$|<{|5$ToAYP8TDxo3V`(UV9cSWIJAjibITTaDgu&nzVQPCUvd`SD zhkr~UbNa-#-Cij)D@Tv575McK|5@k5q9s!evn-AO(IfZ=$GDM$c|!fmLe+&J$Yu`NzPzKyBQ~(-dc1bll6KPgDuR(NGoHNd^X?Kxlo$ozdX3R z8<(*{|LLF7knu`9 z#W0C|L$WxL=~G6(38UmH0+!TChfhv6Dc7ouP{Z@+ei5yHt@_j4ogi!;0Z=}NN|(c} zf0%jH0fA5O4T0{(5ycb~g~c$cMgU)FLnXE@_rG!Gx;tI?J)aBzKk$QnEy8-lxMuWI z6xU5(vyhKki~nn7TyiHqxs^yHU-rBNQ`oyjSNB(>rAutFm7HM0X|7$Qfk(E22FpvP z12{$AVDu^cd3XId+JL#O1I1S@ZR3ru)otsG?SHVM_P<73$N#eb zg&&74)e3A|D;J|7n;A;dWQ)kaQh3HvmPJwYarJ9bgn9iGR_98;VE&rVW;tM{~w-(KIRRobKjQW&R`jzRK-%hXB&qwlB<^5Q&30jWtl#b}RVbO|XVGu&C_BlkB z+>(JE=OXRZs2T06Anv{w(1)n4fwZuw^357AB|I>8A#FDpNIYce;c6GlR!4*Gv+&F? z48E8)q#39d@TGau^7WR|Ca3>7#9qDvKL)fhVQ#|{H-;AAnb`qp2ygPonZmXc_#=TZ zAo;|dAAp-)M9V3<=KTD`_5GT;a#NPI`G=alKC>*Yie0v|WZ?~yV_&Fy)d$`ym=7$9 zWdAY(e?1-7V;iN59w+oxJOzLwIwe(ec_WAFNJ}T*W&x|OQ|5P)Y*fY4`$t;2_lkmaYQvo23LXMM;*e3bMx1e)XQMdnkhxy9xA@?@|( zm@n&RLCW)I<_1}a&a4KrbN^tBG30~aL%Hd<)S$(vT8*-__ge=Rchjr$>jt@hGY#Wh z?%u{#B+5F8CtJc&&707gDR`D{04fb}kcXB=g`f;VV`|PHb~uI3;a9oj)oDdYyA82+ z0~B?ZM8l7~Wl+BS;cZre^wDVAsiEh-n1o!bU(U#j`4jT2iBy27urYSBOr$vv;&B>% z7=j>jZ%l++yvZ$_aF7~VgW6=4OH{r`zLD?FI|=W@_M!gQ`Nmv8w9+550N0}I578*4 z1$1l@09FP5q489T@i`n;|`xn&l3{=nnsE)cf!Zuu|hKfgwU?+U;yJswr=F$1kskuLI~}lwofD6MxRHTYF$kYy!MCaMQsdsP0J- zi8wrEkq<&qVBDj3xb zXY$?IUC(Da<1LdzUww!P2R6*fod9B}&jcba?w*Ls&)GtKEF=C+^F2pRmFaf^iAZgPOf%#x5ezQ)?u7tIX2LQIYY=X z-nLoMJL<~y4Oui!+!&;i^Nw0VG}>rH`)z<2a$}C_{j|n|MPef6oKZHL;2UF7Q6X$J8uHiUt% z_H#yP!iOzA?7TOV6nlVdTnzBm1k>VArDJfBj~mc$6;NB;w4>6XJ9K_imcRdUmp#I! zjf#FH&{%$VRjafQgNQgzm6AVB*MHSro!T8W$PZ5i?v;i3zc+ZKmQh_}=b>F`?46ja z>}*@S=aiJybp6@)M3sv5kdX$$8Hk(}SN^@SIe!>i;{1 zG3!c1&uoV^Vbxa$62rez;&b4iA;xJEBqAT<@y1`D8kuv_!=Q%{=j4p%o>H3%^-Y})nV&ODaP_H*?~xhLs%XR1CB(z|Eq~4 z!aZkdI*)OaRS@vM-U~Xg-BBifJ`KiEL+h?7CTVq>#@jO04JkixhHckfj1A>urB2mO zFzv*6j0Tb;PHM^ocp$5M{@W$j$8lXI^w%qc} z6)Cy_zbE}SM57#Hlk%`XIIhz67edTK&wI3cb-L9u&5xoCR#8Asjp9Zvlc$4-M=)r# zwJZ(fO!*KMu#~WvP=;D?1OIhszhHy7o0g$*eCM^GwR8D=pM1Y>KHkpB(r1am6n*q$ z#4S=X{8HjQJW#^fXoC>mHc^Jl882M)kC#6Y{9^?7%w5Ez($Q7cYkWft_bCC)SS!og z6{#Cjew&?DfuaW~Oe0Z_mCiax&gse>Sg<2@aP`d2LJH-j^93tRcVeZ`nIH#v!|zQ@ z5H*xa@<^?_FLgK>aMdhQ?6Yern6_qyL$gfvmVV7W3kFFd=po2_V1`@R7*1{$M;8V{ zP#7F=j)8-Y6eUav#VO<(Orkh>ffDJM_|qmi?i<|`hH+hxoNQ6iwZz2NbRCWbTUC-ATiJp9-$4m^4s ztZi+iU$}5@3jc5pX*A>8)sn53^m*9sHmtRGO6J7K+GR5IBAP;vSxlf~PKMU^&~rgQ z5jJc*ZjLsS@^;NmcTIM4M}_+S>$o;0zwHa5^nQJLdIqe&e*&Dyy>~lMsP55^s{o-7 zDl@`bfL!ya8rozM)N{nmf~J2&Mo@yHBOAaS;X2!^DYphVE|6AvfUV9_h>OZz6P(zz zFFk?K?~RA4tR+HCACV$@HMcm^UvFpNnBz#ET-JztLsD9%5L0o5lVWJ~A-z1wv@)%H zIwc!QhlX~IJSysHMG=N@t1M#E9O2Ah9(0krKO?xeqZO!ig0b`8gQF;s-Fqfh|~<1GR-r{MD792$sd0>e;auHW-}u18-$#F-Ac zI_8GlzGvNiMH`MZEx)djO4Tiy~vyTJxBdo2izwCirvj-Dizn!WaDye^`$c`+~2 z=-5~IA{~YTUjJB_Xb^>?wwUmo=W7K&h2UjxMBFdWYMaI?Hj&Mrh@Q^U2SyFyk_Z`h z#sAya6A4Wn@zvvuL)Vbxzn;CjhrwnqUfG{h>)FzRo7*u1qo7sFk`5pDKjj|=n1f?i z0039^R4M!8xVc~D1QH=3!v@RSB;acn_HX_4TtdV_#Fm9I6-H$sWrN~BG&K*79AIWn z%?QDq?7y^@C2s@I`lg{N$|P_$L)L~j)E4a$#IhCNLjG0yYpx#pXfkSb7UaQQ zuGv}L*vf`<0~?)L?7Z~UB1DxlmMF7{N+l)6MXq#_Vg?BHb*qwI|muzawcNu;rylRLt4m^-7Jd+`3WA130 zwW&J1NI~VW;l0~|_AG0@Sn^ZDdaPhed)`{P4V8tRqDtY}YU#WhmdC)$(iV?Ax>*Ae zQkFMbWYVt_h$eY}U}c;};7$gZywTD&<58;%PZofH4FXQkP)Q_R!~8z#a)YKJaLyeU z>*a6s1x?f`85=%b4zmMGm#m2`B|2y}3sk;|a*&P#yC@i_Fl5CtvMwW*IDg6=(XLs`oN3qY)8Ls+@b{;q$|dX{(jKFha-b@DD> z7uX`W{94GT#X~ID*jk%XDuM{ii5GXr<;NKs$50}!3OdSyo_P9T9NvQ;t~{Hn70GI{ z>7%n>CYlaFq&P+WL4s$*ZCa6`L!u2Pmxk0qh3oc|k9hI%>{&U=I;(csiIHdx#>Y~a z3L5#&z z3%7T6NiJK`hiTV-wEZ>QkrK&?E!DgYnes2ofbt(9ZTyi7;OPy=7obu|244Sj;OYPI zwEv9Ef1w6w)W8TvdZ5`0VkLnCBDZHE!Hq*L#1Uju1bx1M()hA!8BpGo+R7M})OC-{Lk*t ze$^e1rN42&1^2Ca`|#?7+;_z8R%y$b4|BP?61V8?)y1Av+ttO&g}m0@hKM&P>U!y{$4Nr;J^U#ivBf{p zA>i#-U8GQUBS>W-$$98{TO)k)0T`WVLJv<$s&C>7N$oqK84`yHo zi+>xf)KAuyX)m$aO43{~C-u4%m|6s#HCw4PzBxXiY&=2ynnD;(I*;n?pM z%fZY{F>|+^V)k@oR#jI`pFQt4qEXzWo7RotAKM5W9j)76)2_Thnz!aZ2$3y}1?*6R zb`6P})-`OV3XeOH-?Wb< z)Ye<7a4%bFS!i=T_~=(mF7F*%jI&wwox`nNLW_R!lA|K?RiL~>?;+>PkJSmoY-qaj zPQ|fOi-=YQ#j8`8V`dp4ohvuXxLwVoAiw7U*7vQB9k`EXInF{UE&xNhY=dpmK>cIK zQzSa=t?_%X5l3wXIawIe;-rz(MQw63FBvADrd`Y-p>@A0Uk*;txU>KHS)C)GuU!u)R$M5xVQ&=~mcK>!ZeXU~Fd>;o`4Gp{OL~NtYg;t*FdINcOR4K8X z#r5D5TAxmik*I%?0r~+jFrrJCd(rM-v@3ndiC%`qX8&67^L`700^SSQ8Lrjr^nawV zFgL_mYVE8sF`**a&1MP4fEF2Vjk+n1!u8P^fO86?YCn#`Y(9*QT)3&BHxBfNvs|jH z$3svR-obAUEpP+-%k@#`&d%g9{~rK?Kz+Z4Rp^muuPBzE?iEFgqG%Lws&8zjAr@YP z^`!`7!((~In8_z7vY23;gKfrgacK8o;L)}|-E~DvO`dpjadHo^gC!nGz?a~)l7L`3 z1mz@Wx^T)AO7)f8_qw7*SE#10P_4Rx3m-_4V?PT1l2O>ygGhP9abftGJ>(Sm$`*1Xu0Zzdg3-^+m5Q>RXM@ zEcK1e{Vq+kw5mV_$KdgMlOrQ^K+YLYH5h2gpB&WKq|9T9(pj^xmVPdrEwV$UAj%QW z5zNaX=3t&i2!n{{UgwG_ovI7AY;2#u{^9g0`}*Xp!`Al0v!88q+l=hM#HQ7Qx}@S{ zeme_3v-gQa^IIEY{>tDwdsR2GUn{=z^{ZF#&cA_x4#RQXKR*0+I|_ApSI8Z z&X>7xoAnsJyOHJ){gzm7mhP2-mOU$V0(O>+-aVcaY>B#iwu}0-Ip5XFq)r@ z%yo?Or=lYBaa~;mFhaF8-z+ILb!B-Q2Nnwq)$BJ;nBuGK{N`w_;Zt?3$@1?2tl}cs z`$sb9SzLZVElak{YL=}^OZfxk_^*)%7K~F?yTGAN4Fqxhs_}ee$4Q-nc$7?Xoc$Cq z+&Ct0p1mAx=)K8u$*-!CXDP>GFrKGuis_<6RYmukax(ZG)Vc*MSdJG(T+*lOGDj6~ zU8I*T^!AIGcJ}uC{r51}lW()D^X&5M?dkj1YpHp%PR-j!rY;xBccC06+fk0dn<$4j zsvp)jHbbpiOCktEz5wgblyk_s9Pkd8lDfhf>KjL34$JC!l$~C)(My7^+Um}zr_G<@ z_?Zc?4_ADKX;{V;lfom5HAYMp7%8e0@j zVlQoYOX*0?7YAmg#v&(7q7YO76b~d(p5};J=0ylxGSlude~$F|9>}Jv2eLho?SX73 z`u0G!2eLhoT{G{EQ|a}M%`+;6^Hy?#h^87bLn%_6dPH*(ctJH`*qQeTrbjS6g6R=V zk6;c(FwOF+d`o#%<|&t^00a|+MNBx1w9PdNID`mo9LJ6Fst1H{UhY)r8!Ei>_F`Mf zN-o56Pw&N=#o1?LTCK{GYbxvV7+kl72K9b2rPz6lkuplgR=hBOEMpZeEy{KBIUEa3%_ z%+SX1_yZzQJJesSQMFg~Eor){0=pxfw*5#+mT9U=674Bc$^rotE0A*7BQHH%)^H=Y zAe}yfwU?cH_sFM5K0Wg3kx!3&4n;n)Q75jxv6(XOl^`0-y*06@vUUtvO#%LB zURaEc(y}x1*%iTRsGiP2D%n!pjZ695GiWHv-Kud@87`S(Ln-c6gHNPWT_hvd)EUK* zv_c_f3xzbH1rkJAOti#|ZrPyh16j?hhjWjfc@O7$IM>6u9?tb}?qE3AOsSIXDOKLF zf@5ouDKrN|Pjh62H;5RCb3zph{^^0N2k~6StvZY5lAfy~+9sZzk&kLi%~FfnE{-Tq zr7=k0Jhm&=4k>CZ@`mLO7nGP(rLYfd9m3u{5_;^+dnD8&p&kkKNT^3bhaw@>tTUzB z>r4rue8`XEX!19YT?RmMocd>;tv$kRRidF;%4_|wCm9{%+3r-wg>!XMpi z{i54jzX<7b9Y~HmNi}Ulfwa(oh643Q2pxo3OzGf;8BONuys4+#%9GbOpKJIVa`42l zSL0R+aFr?;3c|+Le~u!ftVEdSEN2qyoZ&v)blBD7tw+zi$6Gz#>hV^Ow|cyFFy3nB zQR((Ps+`e+E5nfIhQuBMDV16yDXiu~IAQG5vyfi=x|b97to@RzzysB)|N7#IE53cz zyJM=hb1B({ebN z&3yuh)0G|w zKa~r!csmFa7h>7w)SG#S?Pb&ZenOa`Z^xR*gLt zufDIWaQvpfWGA5bH#<#V10mhbO7GC_^ZD_C&VbO%NrY*!=Q8}a@#uoU746exmwlhp z%ErdtM-jJuy02PdFU0m}t=)Gd2$;_a`ZTC}GLHu7o0Ha8&pf$PQl=;s# z8R2s*ILTv&NdY!QXk;{oX(`X7A|h9&VM7i|b>6RYRkZ$oP4>21h=1sl@ntXbdKupz{m+=jv;E2%>)mdCJy zf#{LIgTw{(^vQwN-K??74BhofOY1~I^s=`A%RTc1<=6n+rp6$fD~bdr94jpX$=iGL zc7&!qGVQg>A5yF2jZP-@jm_;F45+IBSJwp@0gI0N2oj^*I9Xt$ZFL?yF~$?H%I2zd zRv>wsZ=1{Ko|4 zC>D#&gQW+P5BS=6fqh{NYwsd_d2(^`X0IhoPwg~>-@QG#d=oeBzG=0I+1DRVF0cMv zDbQc4>Bo0Q9-4p^1D9%IU|GOcChGmIyg$m~{>P#xQTm`Y?&CC=*$zXtn9u6<;#=d7 zGO&}0m1C@YtCmbCs7*_z-f!zG((ENEw)B#;MXt34_AGpXBlZHAVvI!E**svXcu_R4 z*W=yOLrA(p&W=1t+jy|+|-`&O&o5 zsw|4Q_RZa>Pa#ZT3}$>C0C7(NsF#(fx#6HFrUM^a6dGTFzbSYCb$`Ojde|^57uK=r z0tf&*WhM;9>9e!yYj)GColIY4mtj~S5Vz}bIfccI9R%;bda;XX_FjbU&vj@H=jU?r zvD(+JHXwn-I~DSl27E%u4Ta2_0aex>P<6Q}JTC|;0*gwD6-X08kj%AJMg?g_qq*h04%%|11bN7pwt?GpzzuL_5}BLOktF*4d1M3@i`kTj-zp*KE5 zu(pLcJ1b`1a;iDrtZUw2CaE$6SwS>nQZu9__(9llPcXx|-_nKtpBta;bylyldY#o# zXYodj`TE9YW?5mZj>$nf*Wf%mnIq-3L^g0Dxu%xW2BtnJ6ugb4x@)YKQtE=s=blL= z01qtxSZ@Eqru!h8j~2@(PIPfl12ZavL8`!jq=PAtb(AAsxM*sF_Vn=3P9N9lZBTE6 z{+TwYiJP}{YLkUh*yb4ge=h+y6OXKR3jAe2&Prlq{1ZF1z1&0f&St2sQ=3?JYAbl5 z3ri#_4EX#^l+(NiyQFmbKwz} zG3m2#GM*W5$QmU{5v-)kKGaVE&TTX8uB}=+VaJ>G-ZS$`$0Gs38j2XlaRw~ru42Li zA==XRG_1d#|FTzA!87~y)a8%w-kn}-=3qs}PRB%Ha+#e^XTz}Aop-arr@`$0ID1`= zZq0O>Su^=K&2G%??I7x%3iFOaJa9O0W|)nPGk4kaKj!A{BS@pkZp~m4(*P!=jru8@ z%_r&oqw-U=Hq+t!`g$n5szWy%djoZ#iA;RSD%lTijpW&yM)5dd=@L{|ssjFo^--R%& zXfiWCYQk(*dUL;1j8l7!HZfM4Vl11R{IY$MzrdI(8PCP&+yUz=hLm##ac#U}*5%4P zc~5CSJ9iam*#{Q9DU@OM2c2LQEgvg#pm7i&co(ky7ew*^B+D~YV) z)JhqID%vf^QpM~^S4xldcB8i&Tj%r7wi~KZ0j0jN3IBY~i@e~-lRQPH6aw{XQ9+dS z))1;p}6jvN^jEgAMjF_&QxLb_*%k6XR?AfU{ z&rU5oJ4Q(eEEY7<+5jK{HKlVf);4#T1do+xwpEZ{y}HV-PG7$P7WnYt{9=DZs`-Ka zBL3>^`|Q=}`}C>z=WoxyKRdl#74?&$nT)2@ahe@G+A`8Lc6v7fZ88E4arAJ&W_nZJ zttK~B*L*ym&Ot9MXuhYYN%r+m$LGf_Re<0N=Hp42-j?GjNcC}5x~3@SQ8_fv+mzlf z0%5DwF%FsOn{o&|G(HBAH^ckiVS@2=%)9Avc46+Db$ISV9Fz~U>R85LG6~mnAoXAt z>nshL!vvX+bW6dj>8?RmDq{<6V$q1{O(ak;AEz|@$o%7SGBU&A{VqMxoO||l^+lUS zb3o~U+>K+n(WNLDOwxrxj2$+Q2wlv_X#fvltZ59dfbze|PR@2tb8|ev5r5tqTx?^) zhi`2>JqfqvWR{pTR%rsBDSMQ6&VZRfLAzl&Z`Pl2WjXPK zF+39AeRurCkR96@vfC;oXVVzN9m4D%v*^vYBx+<)SkodF#lX#nvwL_inB7hJu8Rx} z7BN&H&T$6T6IB1CDIRqZC0CBem4EO z&2P;wSaQT;ODCB@9i;xtE`zAH7(`h$U|M@tH!}oudxk*4nWu(RBn+j9F+vgikfWfD z<%SUP8H%H#~Zrk{-OV#{KM!&^cw%NxgPO;9G(}Gf+Yb1Og5aYQ+hUW%3#kAzgYC^VbmaXcS z4mq;v(H@xez@!Hzi&6E!WSt&8F!^@^CZY*UL@O`>|J(*A9Li}9_R%ncthE7o%#8r+ zqQtWP<>B3^Hq>W#>$j-Lw>A~^tP@z%^ewvmiBqZ1j^<8doeLC#hH3avAVoYzxgweu z-U^X=Vf4|4c=blTH|o7nf7I0*_3HYPjk?5*eYN_=W{XLqO<;~8TzHKbHWV4A(m~%) zxZnfse1@u<%U&zAu7113En8?3(|_F*Ruu6UJBN4EFLvnB?Cmvl|37>0w%kUNqz&Hl zDKNTN&2OfV#lhn=H*4(fnl5#BP4%kkx7l7Rv$Z&im?8=O09k6z)jq^N;XcW_Cy-zg zOaci4B}!zLCNksm@WU5=cwpKNeA<=cWn8Y*phQ`!GX@)2NEVpRsahM96G8Vn zUYquFNLI$kql_-s=yGk`)#!5FUysq{`kGv>jTG3`3lCf_g+@eF&(T8CZ~=_hnI|p+ zipdI+RFb#tJP%4`+My+er!iUHlch*6u2QoAj4|MtRhFhu`lh3FWUoJ^mb&1JAs`Xn-|!5aoXqT$rVv0Ajr zHPsUG&{;gg7>aFsc{pv+Gr+(K{(R51Tk9P7WbL4C4ET$wEaf7oBv)XJ%nJ)837f$< zRr)&!>{f02x&-%re{>8+$6#~}+PfMZgZt|-ItE{nV<0vXC08#z%ttWNh^h^%J}YYf z1}xZ|m_!>>Lx{@hc3r-7wxJb0sd!eH=ezsIcl+b}`cRLddM5xntnC zXWk~qD1kq75c+N!`!NE>H^1xzxDV375u@yxUty(tz6Wkaai{S0iQ6~()c1D@?u&2s zN!smv;Qg=e-DWAM3v7rA@7<&8>3I@NM6XjcG6?zT{FEV7#ps`n{@LiCwRbi8XZP1* z^v}K`|4eOi6sn)2NIn!-xMEI{$uKoB7m8s%E1iUIS`!}1QFI?~Fh`;KI11Hr6xnbm ztqV+58oL=dW$hxl^y4W7^x`hTB%Z0t$?mzA{qcu9@YP_zvvLD;c_07C& zivRWOQ^9xFHukhT4Ssq~Yx$0T{c_c~`Of$tI5cDZ=4#7BoxcC@{)hM9ZQk6QKXnv+ zyItQu_UY9a5)`#~UZ@dxxcrsY04@2P{y*RN{1xh)<$dpHm2H=2K|PyO_iRqHxjFj_ zwIv59lhL>@O=OU2p;Y6`*&n>t@5iKt)kI68_8r0 zfq|-mg{(63r7EXHOkp{y_;A+o3AE$5*~iWP)Xm-uFzt%`@`VSR-IeI2cZSJk2wqW+ zMIHk~Gwhs;hH~?d%am*vjKMJ}^bEy*t}tD&LB#(HeHG<|D0*h_)FtY|I1{Bx|{`{wTZo=|>scmHq?J=iq| zKGG_HjkyL%v$~?qG!Z~B55c3mYkjOP)$quu*x$Wn_#+qGs;JIOn4^|DKW|mw#;2ET z;BJa>QwP(Ze_hc0tIJOh_@lPqA-`3;K6 zA`$}=Ba7%GGg~c!YHHvc;X+9LJ#+6b!aa#xEy7SCG<|HO>Ds5FGFm3wH7U_7o2nAV zI2xEoMGh(#X9ssr*>c+$wLJ<`Umf`U$J}_PzUaiXGcB?&LVL+stST~4G$A)(%oe#x z!MI>_(>$ifK%IWrZJCHB8Y7|2(~< z84l=-=k_Gv6Akl2Po4a~8(dYq(RnGCi{+|*p3Q%q)G{a0JHOpFKcabMU+bXw1t+nE%?i;afK4UmsqLPS2Vvgl0BjJjY;a+a>z$=s(Nkve591+2!?ocK&|y zJ)ILRPdR9Q;q`3eH|QMcZ8KN$_U-Z!@Z&e*9_gH+X4@_FP)r zEPLMHk8?U3rNDb~bslap{+_h*U2e;!Atdx~KevbMk6I~f`>m8)=0n{3tlO+wa{X0H zC8}(QuPF*FD#(;s&}gc%wYq5IBt|Ru75@J1-Jh=J8Wp!*td6Q%zOd8a*}mw-b<3Vz zslG%}nKOPBkj0FiS2Ae!c;G^)p-out#NZ)C*;TfKeMZ+;*yGd}z59oD;lP_;-FP$+ zXmWjkjD7}p!0;8zbPnVh=~82V@3OxRu*-iP?egksqg@{D^3EF^?edqj%bQ)f+#`c& zMFgL-WG+S;=q#$+u~2{bmiP@2}wmA4I8; znD!7Dcnd71LfL!~WJ*T!!6k8zL{xA4_R#k2GuRyazLGh=PQsH#_+T{4Nl7aAE6mGO zSb&fn29n99^yE-$jI`RTjmm#i{yT4QRQ_L5`EN#AzCY3et4+$uGUG!+?^rk%oDC)11IHge%sS~p_JcPit8kz$7sEhwlGKXq+$9q!M z=*3mTG8Lk=7?8N)#WEAac~hCFsX8B%K>vR9;YaQM=#!1webnyXq;`i*?GF7uyyiLw zptSx9%RyD4R*lL&I&dOq(Vyve5 z*_tO8@RR*LDo2NYRQZ!p<&P?V@{Owe4cf*%GHj_@VMFzmWlP27RBi9H^bA1hkYy;r z9q7=%`DF+4!_%Q$-zXw_ab>=OO_p=bqy^4E;{(MIBPx57Yg9hP(BFuE^zTPyKN*$% zsO%@-rm`2C?2YJWZxXLXnHpI&QZn$mvPdbf7J>=|qDy>ef0f5eF&;x}u#y*jB#uyD z^f?|Er2`*gb}& zr46!H2L~5oJXnn3%Dsb)?`2(+W%4L%B2fhC}RG%gmO zO0R|5V@l=FF_qu_pJ=fDe)`7`|Nh~RlRy4=`qR&o??3$c`~N)sN7rgCckesgb4}yL zX*0Vth50+YaJV=xi^Vx9LR6P%56)-HCXLN+o=rcUeGa$pCm${s_;%Bf4Y%f}@ZSYD zGeUz4cS%|d|8dqfbPsWXLW>G9my8#_p536nz>5al(5UP$@cRm?;5nMk2g3yR`yMe)7ZZJSnkGLRzY!)E(|P!`*3oE8COIt5;w;S3 z0^;w|)lgH-r{`taj`H2)BK%6veKx(og+?nuo4NVzrj^iiF{2p+d5i7Y()yp=4P12e zC}>;-IUEgoX#9RHw~GgJDrf^x52M@3+08|`oL=84ji&sfUe}Cie-@fBXlHN-BQ1u}D4oao{!jC#|M{e1TYZ-ZT zR~}<2D#%=oVnv0fI9xNIsANr|82i-Crm8t`WmX+gTnW)YX2RvdAQi`=3zk`LtA97LwSO#ESTbGazj*C^+=vztaGYzsDf8o1L;qXkVeBNl{4E+HhB*IQ>8_1?^f zX1~%!D(+3{m5#eC*XZ9-1Am@g zpP|~_*@fM~W82>N2iv}BHg|6q*xqe#&|{$SNEqRA!@#D30dFWQNn@nS;IvowxBdRk z;G@#L{OrzM4Sjyx>cv$`h@&hPX&6`8Gsq!ORZ?b3pfhU}&r<38Pw}|&>f*H7b@`F) zHJE?^*Y_lC^I|VS#!w^UmF8kdtynNJ(Q%wzet8JXFK>oHGTcS!V{c6BqPSc^ITu*0qM}zNfdv|YT9R>5NK>TS z!t34vKY-a?eRxy?tLuzPVD}pRZc4yxx+~@pcLj6?ZXy$$Ce9RBnD@mp8-gfY$>{u% zrUSQ2G}vP?eYPB5Y-f&}YJPxpN5+dP#<}bx^v^yUV~=q&e`}lBY;NZM z8FD2h!MO=cMQZt-Q=*wyoM{f(rEEnVJR)~n?D6n9hwtg0Ic)UeijWmDdsPFoKG85+ z>lyjv41L_ zb2>N;lh0?<`T6H5Zno~8pzK22G?#Qh8y4$h*c7M>E&eL%hs#g6KTyhXyO)1n6@(zS zV^+Q|lTUNp0_S+8>lrQQEq?3r;Fc0SR)=CY*YpzJLp;A}RZWw-dWQG6I9ra+Wf5TFJ_Xsd5K#jRRU zqJG00rLmXO)e-X5+3d1RP=dl0?bI|6i{|8bbzw@?T|VjG%X~4r4CnZpG~$m@Ch#RL z8>x=vVe}OD<@^@k!HZo}Ci41Fx4ms#qWLARGAg{gqk^aY5w<;vZuPBxK4su{oHVm3X0KRLae zUeK|0bA|aV&PW!o3SKD93%-F@zzbbYe+%bqnXhquF1hu$pcj=#*uq)xDWW44 z1NtLbGMjw?DZGw)<0SlPM`Dj?oS_QX_GQ6X_`(meRXgt1jNjJ7K23uk?Gdf_+;Q$$ z66hmCFr2w+1(OOa4-u^7aPT7@VriCEX1$enTAQIO(^r#Y@8$6s=}V5DWfyQ|tS4>& z9MgqIrDae@IK@7|Dh__oJ_5vvFZ`fSwBBnmxWm84f*)ZGxGEk)24J>Qjy|B59E+<= zr2sWo30#Ro*Wk%+!pcP$_^_@ov%z(#e3c?ERtsh|jW5a?6&y&(l5r}E7y;esBS`ks zT$#a-*_Za<`4@gn)ZR~UxxTGuY~91Bx`s!4SZV^FvZ~Bw>d57^r#h6(YLKpKR902U zLm&2OF6;{ap^xhO%(7Qs_)+(DwU732A>~*CH!RhHfxL6Td_}h^1z}L0t*kJZhM#U^uWI>k5(AVZdqNn96KaNB3 z6nt0Mu9vFCc;H6yyeIL;bM=Lve-C-=lg0JZ-{Ypn2g|JsOU>kOc^7J71~16#rdHU zByaZT@BaAx>2$9La7dZSIqq}5W@+{re>nZ)`^k?F+8N-sL~+L84Zr6a7dLYvY4CnFeq*_0d5%uhs=%_Tx+1SRgXYB}45n`~ z*6(k3vC-gn^}@q$kAb+Ln3-3S3Ii!sA_$Fv2QS)l>2lgQ3VuSQ(b=Fw)m2}&toFq( zcjw!c$Q2fxEgh%$whJE>Aa3cgSdU%KS#b>$u zZCd!iXIf2#_HU!8 zZS_LWkSbe@;GFh3I=-;XhvY2SB8;xt3x9;N{_T=JylT~p9yX0$T+xO`73EA|#p5FY z_ntY>l?9$b^OTCP@lh|nv!Ql-@a>03?KNtzEsr^Bucv7*xl#DGdf|cgQps2W!m^xY zq>@~kP8TFok*kpLy+MeLEvr#p?Zk42H{dG5T~Pv7L7_o{#$oBo@8P}<#V&Gbz^ z!JRTa@a|W9Tr|oUh4x#}=!GDtxtxlON9(h2g3Bel{re?Fj&{56W=Fd{+U;$2d-E7c z_8%ibaMCKPm@!E+aHyTUx0Z1XI#ev8rZRLi?$)EyJHUsV?!I#Z*&deqqKa^+LJc^@ zK+yqq)Png4Jb|}Py8dMCz0V28gM#%XN0l|Itc^cMR9PE^qpKGls4Q=*)sPYkj%vmL zGK*d%mYge=rwkD`GD;6(dEfl91GV9fR!^3oSMvEDZGe0|E>RC<=*bJPN`Hwu6cB~w zNM-+t11^J5Oa~=`_kr6=&v}hc`0Kw-L@PhkckjdH4-0fvm-2J>g5;cDOX0eFn$2(j zZSvbRms#_v>*@9FhrGJe#z@e=s#eiKQ7lF}$&o>@m?SV`HRoAWTN?82YL1JBD*s~k z+mvqUJj8N-_s`kQ_0`Sw&kaEBH_i(sl-_;gb-2F4JG`F#-=FZisf-L?4U0v&{-5*n z)rXpY{^@3!EVg_iv3#QDou6hm^Hi2!gR1rCf3$D>`}Dm0`)qy@u2&bDm*3E!5aP{p zG>LTx04)$c95+nB&rZ!*dvDeMb@!=1;Hrh2Ch4W*>HQa$&-v#tU0rxl3O=9k z9t3!2S}w4fXruIzi2{Z}q4@*S3v@BEPAMvrdA`F{J_Xk%wYTY;cw}(#%G2}n4T#q- zc7bkEU|tu{3b-{Kc-yKFmq?^q4f7>R^d)I>kU?eUEe}ZsBSSOeZUwY@8ql}r<#-t9 z=>_V$b29FWo5d9>zEW?_-%S##ri&)y>FR8DJ$u*U-b|iI;p$zd>*<|v9O-IZsk%nj z@^uN7vs@@He9J#17dZ-VKVM0PZoXh9WNW0zH3xSmRPYp`I-jMmI*UJ&T(!n` z?fd`X$J390`uO9IKio;n*3Z0d8L)s}0axm7f=%F{JZITTO~v*aaX=rz8o(&eYi^pt z-jxjKuR{iw?Tzp7UjO?W#}*F47Tp2`$||+C8400An<1NCPhOz8P@=MI(3TW%qBiX# zSJ0X#K}&rQ(0M(kYcQv3l6Q9+zw06Ny!Wah7amZh3oBYjUn*&Y*XZawkK37pC33kk zQ+)-l!7kHuR+!tTV4lJSuHg|8$7j8{m@LqKcc8xa;;Y73fwsaZ-frvYvyHYAG3U|e zH&)`dc8-BnPU4=26#N~;?kNz5bXfSS^5HrmlO^h46krfc+oaglNd*GBQg`p zQP0<8m~+uF)IP;p!4tX{cknLh$9?g=xLGtSek*A)&-c2P`P^N`Y7A3z{#X zbkQo8SWG?HMn$e<>Ykjz$VPs7XtkEya%Efnp`)qXTgM7{oWOlyxW<*K5`~IYfo!_W zK2AmsLU!aMpTkyg;j|Ohv~h-sAsMa`D>|YpAhc!P#=@L0(JQHqQ5~#%_{f1+kCfz# zmMfGS?WGdX_I`9AtH*Gb2`a{bgxI>2Jbtf_sydG1);Xx^p(F>%)yPVIWny3zjTnG6 zb;SWfu8LU6Nb_4vLd`-G!E?1BElNUjw);3M`AlN)Qi(}(7%@rq0jNXMYLnNb&`M;c z99Ra{%^h3_V}Wtl$K@QVQ*#7Lc7k$-IrU9%W|E86)Xr%#2Oeuw7 zE2m~jS!rf-Q5BNPTz1q*52*<~LS{x%^BMGq^nfOU^OorfHA#*5vgo;^E{*8KNQ_u) z)RLD_@qglE8>=}8+L6_Kj$Q1mb4IQMlx^Hy?JjV>U(NN6lhwvn0x zp&m)i7cEx8X!IJnT-Q^Hf}u|oVmXKy6ndILU|5u^bt)8a+;uWGdPvPday62gUzZpd z#SK_%eLDgr2~{Its3E0d5S3>!3y#sS;KEkLUFt|d52yJ|Qt(naO?MEw)(R95v1Y8H z7L_9iR-&b@EGD7D;61Cdx~i*`U^hjOHn`C=5+j z4T=StL|AQB)`n7f>bML&oaP|dkIiYKNk88pGrKRnYKWDUimJ9-|6d45Qr5s!X*$6= z#hfjc39DuB2|&rtQB)6!ISAonlbGL^c{7A%UB651WJCTfT&9xIo13Sb>Gk~f9ZhU# z=Tgir-rvc?(=YI`y>AMok ztddNo(s_eq02uX$q!N?5hR8j}h|Rc+$JxU{(2nfkb6|~@T?=r&&0T|Nc!vn7q#G`n!xcdZF%54)zYyYJ@nx)bVvH| zSy7jkRQR3aFKa3Rs=?sVR^pZ_^R`CD@pUev*G6{|5O-wkYi8>SVKM zyYt4YMq4-x1*Fq_T_9yG7;6kuIwTsdr5Gx1gPXi&N`5C%IN3%e4uZSWx9kpZP=V?< zIV*vx?sP)1z2o!~2%cmP&FH_Uip1MDf2N*o>m5(yd~au$=k2xF!@yHy$AR&_8a}VqGf05h=YXpi= zF^C-v^phztpNtS(6&<<;rH43lJrYFAFfxbxBYSAI3~)eyZ|yAb?2HwbGmY<~dcdGB z1YVd)S|lg}cr#!5aprIswj*`;3}B<@Wd%2`#ag5y(6D=EBPAYUBuLR8P3MfcYON&X zjEnX{>|VH{tV9YxQh%Ox>qVqt(T zKZ{aYrh^O7O7tFcr&~r3e>e>GV-tv{c)2O1jonW{+R9frVObt&vC`MOI4>FjPRYdSv}n0FsPq{Jp9kn3}-nj_}BFeZ()&c7K_e21bk^; zngmIzjz+Wp{>|icK^4stbQGH@CCdq4-;*cs@$~QCfB56%Pal5z``=Fg(PUQshR=r| zLb>{!!h(h^lrTq?lFMTH>2g6=ZHlO8(>yu-uvkv?XzHj>f50m&tF!BDUg~^ydELp9 zT#}kcc!1^`!pV?}#U>FVGgV+DMBQgXm4<~#*2k%K1N+yk(+CwWYS;!(YUTg&^vn}9HUOX*(7`EtyIWILAZ8DZ{=!a3kkEHfw zpnPH;gDcv}8g&d0R&H-{IS|}IyzEmDe%ZY2p(UHnE8}eIbbB6r2}&>#W2Es)bUG&; zv$AAuQ_YaK7laQ6dpj|^C(a`=`?U#{u$Bt}(yaSjS`DG%w>U$LzlrD&m|U33-0`H7 zgVZ_v?IC6dO4a~IZcpKQ?ab_fN#kIYG6wW|nu9ggcnvHEi&g{!6Xqz*S4$zZ1De{h zz0>8h3BpUIW)A}xw9v{M-$s@>@PMAZVTJg1@X4|WG(CYkS)(f=icVzN!^{rFcQ-Y= zx3}=RsM!NIw!nx}a@^Z3@Ya~*bYz~=wlLxoEZ9ITp|r(7Ao8lVSB4J+ekVD*FYK=& zyYncTTu?HnUAMnCN|$VvW|{g4f(wa75pd&kQ6WoXch-F?kN;+-~4d9 zTq@!)FT(uSlBvh!^wZ_E5@&xsIWOUgC`K~=57R#P{`J=_TSlQi;c_iou12Lah99;H ziZwGeAw#r-;JKz~xQm@cuO5DKpllsgle~0-@<2zy(D|)ccM_@5S7mgdBGG0Tr)G|D zcFDxzlnoVjG^!kk@h*mPPn5?IJiouB9ae{6Eca6D^#mTCfGBUxl0uZh70;Z;zfi3XXGaj$5trH?{Gq|`%z>sod?BqbG}gVr&xkywLkqxCnTSV=RVSk5%6fjSoX;?Wt25H#0Oo7#zG`sm4Ff;G~UUzr>@V^9is%U;<~ zT=YpW5vVLVE5|}iRBw_>wN;bLaI%%1d@eb7sqEx|1;~i4mTEoGwZu?eLR4{g(=bLA zSx{OtQ>5_OXK>qJ!iUjaUtt28R2HULvxb5G&vpDe7%rIkh~tjzu0EIubNldVA93K)D)8$uEYnRtAjo>z?H`D2}Rx zLI6Q^B|%bynoPwd)W$T(U^@OmFDW?;<0F%j*nyl|gavo`3 zl(3amNNBx4@|fY|rBjhw9@hHUNd*c~TVboJGuAl8bS{EAn0V%>rBxEL@S0^vF`jH? zB8Oo+h>3g(z%QDKJP>TUMO4DVx9#aP8iS%sp^`&%GPUF^=8#y9RVV3f4B$?-QjtT^ z-cCjC3G_%sesz)sPH->G`b48R4kjmr&`FFSVhYUpN+!cu#g$FmY;S)#P_hPaPrP zP#LA-lc&g;6InB3k{6zrpkzl8^--43B`zN>^K3Ssgv(6NNzH#8yfkzf- zWI8Mdm*`j;W0`$Y5ko_!O{FCJ?4k-MTdB-pxbLJg_e8xJ@cbF0gb9X}A)ZecXVV8G z#eEjY|aFdsEg}c05ewxp4g)=&e;n%X5)ahk7pM?BhH;ZdZgldNIH1ohe zpUqGyl*I`Ze502+zn;u4Ct*1`{7#O3*Y9}MVyLv|Tx;E$pdDTqmL@5~s!4ERB zf*y)85KHKGV(BAAhe_d4bxqV+I^MOBj}hPqCQWpV^Mm6mahqDh%^BYQ`aRldIF*?kFJd z>kKRQo(MFuqDKIiJMb8*tQ%1%DY8((vIHL86jcKYiRQ%@m7M1~+R!A!sHjqV0uoZ`7m z%nGel$zDX;0ltqG9SHnLi#{vxG>yta(uWDcv3b$I zoPKCD`(N?@cuC6Bygn<_`K0{wYF-w!po>YETulE-?JvXU(tLWAu-WO+dGK{!w>UY_ z(u3D6IUz$;!dSzMOsH2pMl-Pl&qArCX}Bor4uW%-IE@77m%~_baMn55+76SH5!NZD z0^sVpN&~4mu%N3i4wu|Qhok6aIER6JWQKF>mihGyn*%F22CZ$HU{Ju5k%n1g3IkLi zEbycdYykK`2fy@FT}`RD&aqt|+1b~aRq~PSdBwOiADNCE zXQe-@qAX6rpky9cX%E}JBX?6sNqmU>@Tm?}zJQgU(erR*NfC+YQVGi~(vygon)a^m&OCEX9o*zYSJ`?CkyI)X;_q@Fi{hio}-#co$lLxT;wpx8o(~?DO@8L z`31yebqa!=S_#S|ZN*rWt+wcwUq$5p(Ta<(O8 zmKCQQsEA%B*uY9jA(&EelXtN0BP54m-AhP%;7|<|=0Txlap>KKpab)^Mw;{DMX3kK z!<%2;{JqSs&dcQU?DFmPB&1ZXt|!-L(?vHK@~_Ke$Za2e)gl8RycOK7=}O=MJpxYk zlm-2Ps98t>m>1P&CtUK~qwGGqa+t^*RX4nFy7EAX1xI&JqwC+Q1;L95K3NPtDf3+v zN!hQs#GGfPI7ee4PPX%v!$97}SMCY(*o*S(6fh}-^HN*UHjbhKY}EXbX(*nQNMyk# z!Kwx@wi;E{j-<)HUZ-;J2|XiEc?9hNGz#8uSdZ3_selrkm6~x;g{~|HK+nR|QZZb# z+I1p_KB96MxFb>d9B5lAiB#)cC2vcNE(E3$RnRz}n4`W6($-+B)(&OiWGhcO6zq|w zeA$9!L^Fq8wb{7YNUgb{R{KPmW}q*Lv2hES@aAOu!v zp@Eoc7bOOzSs7QojjDFiXZm=`fxwSE<+B2B4M<$Vbqi8erO{DVmSv$KvdLkLs(_Wk z6Naq_M7MmekER@k`>|=t7oRkFAkN@4s&*yTEvdQV8ud3Tie?x1QdqS3PmfNgwB9@4 z9Rb-#Q4YiTIVj2x*UJLz$znFUmo~X%CGWre%bOR#MII&_LK^Rc*X!|Yoj@b zV<7P>y#q7@wfdTI!L#e+#PpGo!-QibBfl8N##pbkUWWlP7EuDVmsQbF%A#UUam{3@ z5n}+#UhX({yC?N_Jm4Gk># z>T`5VxJc_Oi8(5cDGnmg^!V7FV$#P+4h4HVC%GriBPaQ_36{}ZVHmld3R`lOf%-!k zsi`p6Sr(HLtV$aru{lROZ38c2X!ejP&uZ+M8FiZ?ZpRRPys6dH|Xpk#DHOgCA& zkCYq+{7zDGU)WzfDS6;{c!5_iLakMMYIZV4|G`0}RzZ~ogFsuQwJgQ+P&AQMPEff%b}_YLO`=U(gvjKp5^CN1m0XGgwySW6Mr{ESH@IlAE7; z)sh0jYmboFb-E-tuN;j!q3Z5nHFMbr>gfR$ss&>@^i>~2IZRNFst#T{LwTSwu-pj` ze%;o=2&gq_&A6h$HV8S3JS!#)f-YjMqC1_vm!cd7@-B*UPnbuF@+%iKZ>)8WuLVu& zVuA$CqzW_&L(t$8ZCLfm=8(Z=+d1y&qbU12mMXq4MF~dNs)#;|PEwgU`nMqpW{VS` za{|$H$9>@x<)Mv4InXRs(}-jpSa4=vc>a>)WXbIGHomc=sfxyP@~8a=qIW9=|WeH7(Tu(wl`d*VD& zlwX@*2_>C%!mLy4Eze14CDHq!mbILG02-(0JVq*98yk7Y;q2omhe_4|(rHiOdcZ0E z;m6aDfBN|2k3Zar%+}AmZb1Oct@LexT4_*s;Xt#E4CQ49=2c3}a$Y6+u2j`~vXy&$ zE;0CUxj<*&q{BC^{{6b)l^UIR^e9^kA|&8z7TpD19fLy0)y`#>l9WMM$(7zdm1Zcw zyE(?aorTxMF&+lI7s58(BJcV!m~4Du#ya#IFdo1y?h;0OMW<|~bh>k>&_^*2!+j^k zxG(B2o?<+7gA1;?fc1oJN3Fow# z%c^XSo`zMNY-2Bn0z9&p&%3iV?qlh-ZYhPT(Jd4j{lpwl#TTEL&(5=~f<@(DY}TEA zF+KF+UBr6_2ALvS9-0xHTOZ=q?q%@G4R&1Xgx5@ z6ki~6@~1ElXHBj5Wb*S_nVik=Ddyqo3?0TiU0j`q+sWc=TCW%H2*(o6QKKwlj>TkF zCx86g>4%TsEiZNY@$~z5bO+OUbG=*^(@&R+rD&o8nwLenh|L8~fB47S#ru;D&h+r- zX})*)OuxK2@PU@s>O9o$2YLaN?P0smOKb5i*ZLK}gyf55S@_iKIpz(}AURH*3#8&Z zrU?z)eIsT2#UM6x0%**7V3d>2NozO@##A(+wXi7gCtHJYMMN&#j*9q!7$2Fk4f!{` z(#?E!vp6Pad+f`;YFQIXE9(Wf>qrc}w<@@1Num}3kMPEj11o4tGdEFcwS%jbOz zo+#vvOuBN)K_9t6Lm%maK;G5j|sSrj$K( z^o-Q%=wvHrI~45gob8@CkDTq-CRl>{e;bAJ)n*B36Kqk6l}d^0*#;JftSce==(H#* zb|kBhwH+o|1IW5Ph3mDmwg;LM&%M^>Zg2=LcXCje_B32l)Wkx?zm$kED5=2b&hWuL z()PLJ;H8qbhmJ2szt2m#9t$9C#TQ~_AyZ!!g?7Yeu#Br{EF@zb>>zCi0=%2F-P>Du zU8L=Su7d}qz0++;fiVSDzRavzng~>trEdKg@l~rU1SOo^J`rdj?mIc#Jy9Py+eZf! zgB4s#A=ZV3u1Jl`DbZpxTu9v6WX!EMT%&tv!;Zn^0}(z7XS=5qy!qwL&$AqE-!3M( zq-KrZP0nVY%Wq|lo?n>Hr)4quTuA9mV!54N=1II+phvh^(5w%-`P-gs)8kz9Rg0mJ zh8ydxYuN^2waqFCR$`Nls3dc;P!+Sw+HxPH>SPi1v6sW-@Th8LWG}bp6njH6Bid+z zqs@?67bd)zjRLinc`Pj=|4#RjCd%3SMS%-+tg%7Naf5J6hwG;`V zJ<5hzxBspH)ft0!=0Y{-ZA#F*Lpt{nlf%FriOJ_cTO-oeYrSrfW3>=GN*1+2 zw1Y4#MgV3tXp?Hn2I9$9W^yRnBQyD;B?}!2;zKK=^nunlMWYX!V zXnJ+pl}yiVjwA0oIvz7xJI8Be>sn8@T4$QegQvzbBxbg~ghrj3}CZ9_V zMq=`jQDFkmWq|dJkm#xF7BP{{ta4+Rmj&pbJn&p%hEBS0A2B%);E|Yo-dK`0HEQ^l zm<%R3y0851UI560EdbwqBx-DW#$f zD^2h1!V5#>4RbNzhm7aSbow6jQIx~5eh!MV8T1n-SJU5Sl(=*;qYNhW>}K=H#WHIY zjs5#KlhaAldUCD0v-2%4 zfWtgYPKBj$sLq;JP&v92*3-yJ3~SKqlr-BI94i9w9R-qiYghU>%wd8$a+qHZV<~}y z=C-YN^%y!h?FB2IrcGLn7#C}pvC#^dF}O&b?n=ER<}i>)67vO#5g1en((`pIA7hOy zK{K5yYKmkli>`9!3OcQUqY~-HC4C%bU)xx<_r#%*!#skDaCA(nx!~(_j+$h_a739( ztQN+bE>fChLLGt1Ldm$JAbuFQBZv7MI~i?(_UmIyGz>1FrDsWtO3e={^U7JKyu&ST z0(z&N%%?sEb12p$gZZN6$_ecx7p*H@dKpk+o!0lZ{jgkgcZ%#;n$M;Yb48Mu7}=5xuxOC>N5!`DdV zoCRgp?GCsW)&Mh+_Bj;Cd{u_=RAX_45~({pRv&*k5Z{r%eBOPnEp^y)>t>$Ca3O=v zG@pe4ESRcn5({>4-+gOzVW&N2Pa8guX~_LYlSgIBFq*w zdG?7#RdCr|ji9v;x;sIzkHs7Y_;awBKQ|@Y<)2scvRE`tHp83(hBCi=H@Pj>RMR~# z4GDQRy}YK{?{I}5K0{X#KmMRN{m|=;)Fk=^($J`y_MEIp8WK_%hY-<^Fw`DAMV7qO zT$)nNj((m4rEjDrzZ}L*NvF`V)i4hI!Kh-wFDjaW43pA~sazD$WECkHx}pZ(swh~U+?hUZvac;H@O`;SS9LHE zWhX}bc9798Ym`y9;eDu_xGg6mH@PF61noTcwv9KG$wAtTjzEs+c6#qwu+=baMOFeW zL=v5|)IM%<7`TJD$)_MZa+BM#X&qNw8`Cn;Do2UoMP)_MsU+8E^>c8nqW2lJ#1)U7 z1Ia#iawyu{*~vYD9@)vSPO>D8vQ(yZHB!{JQsS~zJQwsLQmg`_fJBa>b1c*tnG90b%ysak1AHGpISlxn{N$dnzlsFQ1HqQo zYu~`LI&6#?c*-7^7{3XquUqiiG07pCm`&!QW6k@h$zfRcQj^s0*I5iQZA?I!bCG#) zq;OoUsrn#!IzS%Y{PN~wxqQ2r{I)99{(OdOKlwB#G9cm#{@N&lbQaFf%Oy3YT+Gt6 zP@d!^0(5WK&|kuo%D)f3-m4ZqR5R8)qg0#9Euko{Ff`FgIbw@Y0K5mLY_t%n5nOjt zDEg?$VbXV0HS@x$$pbNVPJwVBTZm(F;5AQ-14M>zMHY-|`U(1Kyov%ktV1s|ISk`n z%;cUZk9{k@epwUFaph64T9?%b^ie!$W?gD}lN#nShN_-&XGCyDmo5$dP}W+px-V;c z4;vc!%Oij*fm^N6C28w^q_F6aqB9z(6m|vG5IAfefVQ7hLZKEs_1J58#U{G>p zK4i@Vhg{HiNC4YAS3a8@yifx3U>?g^ue{bRz$I`YM64`P(@JonFrR(XXT)*sVidOH zF!T_ZLjfKM%x482q;oWAm4< zCcpB~jjjZS0!q3T@Ze~atiWI|kwwojvLJ(I6-07Msj5OpllPFA0|9>y67%$u=9uSj z`)=~NOfJH&WfIoiCnwiu;d=5J1Bl7uEL;^_u=yn6FNRBMQh8oJg><_bJ9PTPKi*Bw z%6#(MY?_*k%8+j-@rHi?`fL&|CpRQO=eJbrT`p$V8`+r+1A4&SG&ixjBdRxl%I&;* z1{H*&T;g?3PjSl>CuE{bCSn!_iNbyrn&& zwce?uXjmS)smVwdVzTI~f|g1IEmXH&xQ9R;i1CpL)Vmn zOpzxedAhyTx3LnG0kvl^*#G@6335B|i1j!+#s4Saj<=U}wAbEkU(J#wdCn`B80 zs;ontT2dYZFXfeB32g#{U@+uT=nPbwB=yIk5Zbxr%b$k^I=IM;w=+zc}BUK;Wzwpsv5sOn=V%UFyG#Z z%iE?1eV<=^)#4-|3*+M?(&S zcBCPn0c(SigtV|8z#&vLP?KfoVpayl0do{h<`|WhLgDhpldUY|P_Rc9@DW;YzM^uT;D7__8FEi+HHvXH|BYh)q6E;%rYvUt5|V~wPNS8Ed! zN?`a{5P=X5yl`J!rEUV7> zWgiJS4ESS{kguZv{V=e#uvUXx6Gl}S3=mvEFOfT{4|Ob-fJ(gB;6sAwWGC9|BOr%i z{Tu}3-wI9N!G9%u^!MFz@`h!+|Mo9$UO;x^p^88>{pi*sVT%wL8fH3!khtC&67$sw z=Do2pD<}Y++_ye9ahPz7Y~mNg*x^1GfVi|#A~!*4SD8ZtPhIIW3no=uTnry=4ApfH zAbRPm;4rD4qsUB~E{2N!$u?4&t^nr*Qanb2lz%1%RXTwwXe6wzIY$Mu(P&kvt7F<*f z%sXkBmI5IUS$pX8F74wMhk-kYTYL(_FPmFD3~dG4D`(cz!ly7hB-=D z$kj{S)*(Q52529*I27#d+~S@%kKE$dCRkDkv@$4JZ7mtqhNHA4CODN_n3@>|E0I+L zHYw-1;5*30VUjg~RN7Ox9uS9r{PE+*4}bdcqFP8*B{U#8YN8zsx`Mc} z*65rJ;HT9NZgC*KySc?Z@jb_D&wH80o_D@+%*}zxN#MM*-nA7@JXWtOX!I4bp#iSA zsRQ~CN(iU{gMtt`p!e~L!$9B3EA9z7TJ`e{PO-o;k#3G>KSegnd$loVhcZ-p&LVYI5~nU)+;*ih`ep~2xs z8ZWDkq3)n7`#Ps;KGK!X;igE+j&r^}_W+%&7CF_0}*(U1<8s5=a>m}IC0*WHPZL()fA4il`At~{<3*aHv0lVlLQaI3h`Hf zcw^vU979h~=!ouu6FYiY4g~o3;w$6%O<7)jv5mZZ^kc7D94ug50NS`JZM#%MACWms8b%^>AB^3hM5Z#{`Sq5M95r}VxZ9P*1s1}yP!Q>y zbTEQLRAon3%V8iNo5);F@V*MyXOroIcJCzKPQpc;;`Q(E?`Ey2zhk(ZgzJmh;)-T_ zQ;qea;Ctz|(|_{FSAEr@Cags>hjBBjLxCvmYenAmrgt&?kxLAojr_Vz6i&>=HmZn@7=cJIFf9^cYH-IzOZ{O zT8&@L+-9Cw)#@&FA6=HDI=yPGdhsiXQy{>Di#V*O`H1<#`I0eDFatp;3W#K;kWeC| zDhfA7CSvb!H``{uO_^E(sgb42q;xqCJ zg3|66E@xu92$zQdo2_A|aAOD6?ShhT4nlKXUUJx{@E|l_k=a&b^9bw--EubAi*9+; z#OlV8s1(y?i$KmkM7lTWt*!>RpZ+IeU>wswFs9_i3Ub_LJ2f^nAKsD z*Ghr}WxMHg(i$RTkOd}}7!n&pqZ;RgaCtBq9IJ4-8^F$L8#wq)Q%p#uc;ovRw@~FV zFCIAL47LPcmB5|t2;T|aaxT7$Zutb+pp8Y1^3V_QMA96qQ4l>Q!N3U}C?+VTdMD|r zV9un&zJ<%@ak6{IM_(&Ptjq>$O_^&T4eM@9mx3(qZGD2*SJRv}wcbBkd?wZt z`lW=huA!^I&USQt&p&+>uC;`{a;DeP>6fzM!`o8{121ovo6V8#|LXH`?!I#bhq-sw zv-_~UQGaAJt)zaowo%{ei@rTsQ>)9xdK;q|MSK$?<4is*BIBcB%;d-iWj5Ui4kH)m z6QJVm{%H$@s3p9|kWxe)gLz<9%}k8K* zQv!~GKzU8ddC67F=y9Kt7w6GokrxjDHhPOrJ2i|dN=&GY?G@?JN7qD1id^^UNUBH@ zArZjIz53!juor#tN%FzS10C3VrG|t59=WItSgYJ=-@Jh05=gvPO-|Yu95o$H>5KFD zFzF=v8#ChNi=W=s)%%OHJ}bQ+wmob*l&h>{kp%Cc-D{f_o3@=Z{Ef8i_@}t z{q@y&xY3$JyIty8b52`_-nctQ!6d;YTPJG}xnAgy%r$tffLet_5`Q?&C-)1U^GLUd z+K&gaQW#`)846iOw?w*V;I(a}aT!7-+Y1+k<-sO%=%Yo~-p5|y zyQ#e%k`tFbR*VJ;vD{SWJfxnXBokd_Q(E@-4?mg-?xJfSq>5oBJ&|-|=zb_oC8Hy> zN=48PL1Mw=K%#|`9CLJWbTE5L*q)2_B5WTuv#ha3dt)}W&s?kKgao$O3ae12*?^+GLnnLk(@ClZO;UFk+z>8 z9f-)0)x(LpqO)?I6X@a%IBMPEg*7ycUJD2%jDyE1WqTeQ_N{FHdLaApOk&@0Mb}1I zQYvg#baat)%>*jt-2EdJB&r1xYOP{LSK9;qvhyHb^z5g}2Mn%T*$%z(m0ObRU-CsC zy5)K&_aP7{^AoQ+oD1J{&^N{^@P~`0}!@&M&T4|Lf-JS^&K`yIQr2%hlCI zKCRau|F3R1`*D>oZqCXo)z#_w&++UgrnB0A>ZCi-Ufo>&TqXI8=bx19Qd>_kKAW_) zrrB@%az`<_Ye(`1qm3a?!&oPZiXB@hLRTS0pR6W144A5XY9@OVN8#zDFg}mHi!lCp zAd__@o0i(_SVl$pM`@^)OF!n{+r3>Ms?@9mFqkNf+r7VBuiUdRUf-YQJH7gB_2KmT zt-Q0o4PAYaCceK5{=Nwo)Nb89#D)|P9;vaaWGl&*XIkp6nYDNK$RFBC0)$yx{Xm=d zl-aW1dR~`q23@zuiPbB4AChZ_TKn;pR-CEiqD?2qE{E@mtt=bL>bqHNr3KC01&h9R zWD0Umg947NRIj5~depr!rH0SLc9t6cB>*3_8ondg8U<~mlplICl6Be0)NanguL0Ktzm@rlo~!4?fcd6ErDLt@TbNs>sXQzGsvK_^9Kx}Koq)x)2M;7(|~fz zky5J0jw+^8YWO^2&5%L2_94=whBoi+hbWLS)W!x}(Fifi@}j)&x{2pf zM{PJ$V)&t0aHL}Rj`*5j?Rrq~#zn$KblfZu+uZvi3b1S(po>Q-PqJ{4vnoty&kOpOpWfx%C2q2Xbd#9&{6eKw)KK6xy``E9Od&Tg1ba+q<-;xYR zEQaq2F&kqfHVhkIASLU2QEMDm6JQF)9i^!#z8E=}p*^C+;_NBqbY#9jAw(;KJ4l_AJemL9)hfN`^LM zom23m_;E@|oU%SfwFrri4{k@+c(+lOWNS{8nL+;OGhN96o7y0|8oahHOEP$JuZ}nm z+C@h^#D2l#Wy2VJ>Pzv+$;cyI<>__SGqA=CHn`jy;xg-z+A}31&INms5s#W!y3f(F z=KfRZnjWx=n8&O|M|@H=AZvnh&eO2Kq*QW3Xniz- zGqys~g&^vZsp^{2c%0glka#E>EJETx8I)$UXESuwvZRrvvcQ^~0NlDCtqBgA>nDku z4aSX1%2P_>On?_9@d?r)xZr6xFm7@{>=TuuK@Coq0wE<2g^HnsHDP!_Mx4imeandN z$WLjC^C&RcQ~Mi};Kkowe0}}$ zY86-K^+Q)RU#GHC(C^di@to^%t9T=YNa<*6R{Rc znKPuCNFoi1IbtG$>S|U+o9fHR=Xye4p2@65Uw%q7Fl5$^YHm2tQaKCY5K2E)Nu~ft zjzGpVN6dxvs17|LFCUBr$0{%HhA#zWkd@u^8A!(9b;WK$+2|Q-t*&CL*B^h$qn)pNvbJSdU;Ekfk!43Q zRuCV0YnwB+4`+AQ^}e{=?V}19?@I~jF_-b#=?VRMCLmy>3C9O5#a1!6z#HPt!<>l2Rcv-hQS(KHc z#2j33g+|iE6p5zXt#RvNdW(L&kEp~c>pX6Dftr=!!m{k^J_^gYE(d>$zYr>h)0* z3t20&cCe-QCH2F24s@TdN2xi5%GqnDPVQB&4@HATy`HX4NF<0(5B-t4R8$&)m?fR)bM%te zvHMR7vc=d+qw43BdOZ{0MZJE4Y|!XYS%Gk)UPtF_DycwfzPHM^0I^T5D6Se?FqxD` z#i}XwdLA7XmxafI*t24V)(j?{s2#OF*a&L@Cm8`GmdwvZx#3B1pD=K8uWUUJ;YGH7 zG88b%S#7LxIAn-Ap^pVHx-1+>xz7<`klXDOE0=2?E&5Z!^*jz7Lb(3p&GqU-?E=xY z`~niB%KN$O>A=~?u}ARBH9hYA;otw{yIpflmQaD%3})rJ>7*r0h~D(+1eyf7mOzK@ z`zLFRw&Tv(DS3GwZx(s^@gjiW(a0kihUUkD?1S^*dds7efB?7)g)M~QO|Nu~O?W2t z<#`}4`tp;ak=e1!Ub#NmU}%sIM%R*R2J2k6Xx16n1_UD{;=%!g9<@PCv1rOA8n>Qm zC(Bi`Iw!~!lB`)7g-@jbSL<5Mgc2W}9KFE28@SwS2m0Q5#b2=YKe zO{KB~mqhgefq5Rb^91HE0Qk5C=H0;VtGC38YV#o56p^rHP>lU_yzT-)w||c%S{GYO zVU!V03CwfBen4Q}4(CN+erm+(#_e80MclMU2Q*&d4hz&!vXHEdAlkg7qd8U00;w8F zi&F~oJZ8<27PlkU^H!L5+)O-^v3hU`Pfk;GEbEI;D1k!l^CZ}Tkv|JIE@d2VP6^D1 zV!^Qr%sW2js3d=2Gn}_1E4UTG+Ke7S#F@h#p7(%vG%>(_>^XTxf!n|eR_-qU~b_3iC zkSJTb8MMaCE?W;xHw(^N+2w6Dper_)sF;>U{c2Ns^E|xwGSO^HPQ3Wri~p`Kf3B-| z_91?}S_vOc>(8~wt-1UpfM2cR<$9dhy2bU)`mSEC-dtRikr;V9ux!_hJ!{%&MDjt= z5LX0ODQI0Fr`{N&NqC3BgUwdR6M8f{iYulx?s>f1>mqaPTIFsS8x^dR-DAL*R0+j~ z2(|R)1h1Vu-tuY6ETC)ca6C_FQjnep@`GCCb}+~Cvs~%s^5W)dpKikYzU;Fmn|880 zkoI~gni;RXtqCfrwJU%FW-d@oq{hZuAIHYk6I`3}t;X#KlP!wo?jo0xiyBLtGn}Th zT!JK_Ehq;rTDhIFPeA0#$tx4g_~68pqB#%SMbSJ2*p`(ycIa_I&e}(cpiEQ}6e@yL z8$F!r8Xn!$ODSz zJZ3G5=2N19L;W3d+to|sQ)!$cU z1*@O6dU?mTm;d$4Hq5PGc>Q{t7k~JLpEaNRBxX;}Zi+Eh6|FH?Xr(lvv!p^X7!5YJ zqU1|Dmr--alt?;{&WlL;h|!8{PTE@DVC=0)NtGZk)CXs_Vr74F4uV%iRe2lp=pf&u zNIDPXJ&UBvz_lk%G;8{CF&Y*Vl9fgHk;G>4{( zA2k3?$)Se={kxm%a&d8ahxOeTe&-P5Zds%x7rqZe+32B}5=N^5L+|kHX$Gt0z?#r% zS_@#Kz;8+qor&021(;2i_74gk~pCy zgp?@cs3f2mdk;-1pYw44An*5Wz1$z{S2yS9BWKFZr_UN(qa_A3b}%bj3LdvkGC>iO#JO@D?#-NCgs7<9wToRX5WswOaLeG<@0(&$tJjMST} zGWs&ogeI1enb0ofghM>Y+-IeDPj2Y0XID0dcwg#Ki+!6t{X-$Msi9w2+J|(im^fI z_H$04fmE{xELE9QOGFywlM@AnxezY}g&lzpJBmf@dN;KW!-DQJg~E_)&o3qYghZ); zXRB3f(O4W6h$kuvGl5?!3Xg%VK=^ASJ$&hv)cNhHP+*AHhcqe=x!gBqLx=Zf5ES?QtQW$r0q zsiVz$qQEc{@_iQ={&FU73Eo`@Zs)6Xb9z=}<-U5g`fz&vw$}nqFIQJ*wf=qe=1gw; zs>K{jmG58H)&-sZBPYEty~ayf>OZagxBJZ#Sz8Iiyod zYOyK_A#y+9O}Y0!>;6&75>rsrMV;JRg_udir3&$A7<=U~c!it9pi1N)$a^Tp*-b4sJ<9CJx<0Lyv(o{Vf%JMf( z?yW-11bWX^i2D9C-<1Z=Zr6GF@OIVzg8IY$F8I6&W`r;S$qjZOn7n+cc6FimsRj!H zRfVb=kxjB`#Ie!+1iz*%&}r-Gh)d;RcW^B#RIKc9k^vigZUSbe2+n6oF|!ZgU5V(E zmw!ej%&E0w9=1#A;SeE#(K;wU7=%ShHeAaZ0#gQO86o+U!4|D-(jmlp|8&IJU@w)2 zqb8O?W5mC>c$_Vp~+K~heLsWyp@ODAa=ni3c+s1VymoDNKrwn zgz{LY-mHiQD3sDlG%eJT{ybH9n2GRGc-RehR=b*%YZKTFy+(|_yL@Db#!J|*jFCq> zM6f2KP1UHFN9*}i;b9)|OX1;B(6!2FV}>v=vtiku6NI1&IL6*5fDO<_pQ#{Xy#Fl2 zOmz2Mcv#mJK1j;8k_11dv(u}$r@yK}-2X$*ng~X5uSXcWsV~;v84|1pZE}XwoL8$4Z{bv)67awcw&8VZ;eHE{-PcLul5&3PrUd8jW`Vi0l{_0baAzz%!m9F9^i}BUF)Bn34 zZAdp)k|A7Ot$)7P8oDi5ACy@0+x5k+JCjD5#XzK3^t_YQyOkHM}p{(7CA zP!0VRr9_G~06LQ0u3?1e*n@7(cZ(n{^uU>nna{ye4S76}jq}=@;5H$RX^LvBRYDqK zaK$o&LJE>M)tf9!o_pX>#$54ZDTh2J&_*E=8KzBJMby3Io-$DG(T&dtfs5`U7gBH( z1CQD&Cd(o7fZlUCIXoi+k4h>8E%oTlV z5t)bWQWrS{*oYGUX&g@FT2(@5xufd00Q}6LW+VeD*1MAIHrZQf+8z z6qss2fjE#BfvN2Udl(xraP^PdAKi?ky+r{9YrE?p%3TXEZn9Rto<=|H7U8L%|TE)K`UA%AH4j9QNeSn zGBOX{-{wfhby%EHx@pPJ@g60Ju^CSfdA7({ifOSs%tKA>>8GsCD2$>sCJ7Q1bdtCP{R3_X>%*pBW<#rn?i4_KT@i zWFEFlW#bS}vh~_KGGW*>qW3l?(+3O*+9?=F*gdL4RW7s?of)A$RoR$}_EOn6YGyH8 zCn@yMPg8OaI*o>AY!G(UesC;=J_#_gPQIkE_vKV!V;-@V!p1I`yB*^K?1nTn>>avQ zXOhGPUZn~y7%!`dBpf+s2?=7&$&IR6Q-zH~fquM&jU6F2Bo8)*!P8cgkwl|+Ke{T< zwKu&_u1Pu>vNkcs1iie`rKZH zt)x-UOx?;IO&Che?H3Mx48VX=AJ|h z`a9DwaxODN zX-*ra<(zfXiA!L3xNF zGFIm#T(It;Lc=_umqNocqZ+HAoZ9d#qL)x5Cuk~pSx_V%W#m2vJ-a69h8OCc+*@Us znw}EWQe}92WP6(&>$@?hrMDt*k^Le}9&189oUY8oeO_V$6T4+?zzUoqLaNs0 zYKzrrBu7pa8D=896d4YRJIe)-Ep22X44h+=IA2pU-6v4)vq=h~NlsaL>XUt-$S@E0 zrO5CI;L0Ygm8YOLov561ZYc)P(dKRln1OREP)OGlS*vD8J}Og1hI!~NzEV$%2<*@X z%WAW_rz}ywbqvkN_&!k_J>^q{h^s4V9t9X6!ekE(m>ej@m#Vp_a;j3>~|Kjw&o~(VK-d+qi?x5#k!2AGJmPNjF%Rcu`u6kVn#8v9?=Z8s zC2y^jm82xkeFUR{n0yeNgR3^QlFY~ucVbD|uPKTe8krb1a}z zpK(%Sh0xGJiQOBuxD?_jZJAg`W@5XPDh>d)QQXa0+|b2fCHq*9+cu>7fryNdB4r3B zdk!j;tVSW=M5$sn+Dob8sF|fbqd`Rjvw~nqP8$dg`#RD)Xlq5tEpb&6jOuYYd!ke^ zlUYlt;((wNNtWpK-~p+tjoB6tnYx9xVJktXAfK!wpB%;Rz7_@Sje%6;hDS*%S&vGP6UBh; zYRZ3d$B)7E7JAlbd?0myv0^6fOR?fHo@yq=f&5_g^t< zjeWr8eZ`8I=>A4lPx03t(F6UfZ~V>y-))u=qc=VDAEu--ajq2lETh;*+B8Vo z$zA7|xh6^S)X3s>q9`#F?{XT?F5cXH9{M{g)CyKXjdATsE>VIc8~r1vRW>EE*?|); z{`TT^yRMh3`g6VfxK1?Rt>;8s)|Y)YM2=_g)}Bn)^2S%~;!;==FXg?xxTDXD*YD)r z?{cAMO*b8SUy4=3!FwHo*HkSiwJvq{Y=D)4?8!!BvV3b4HB6NnW)f~GH9Q)~68rn0 zydGTS$mdeDhQ7FfD*|+KI)e)_D_yYYI=0vPa#?WC3iMr?zeoLfzZZShJkzLUsc?GO zyu7R$>`Df$y8Nsp-{iuwofyK}ato2i!%HT3HZ{^BEEAXy0j@y-(Rj64MbH#$cx|N+ zB@%UkA?i>7m9-9QD&CLGmZtRQdEhSk^8wH{h|YQeXp>Y{uM#=}qAn6fgTS>EU|%F! zbzU_d=|xlW^IWhO`T3}c#j;`qZHFTmwoo)VdO(Y^MZ{)-T?nA$BgPh$e_+tSOkyqS z^8vRGD_0GSZjdGep$R5HDuTR|9Rs>eiy&{PMjt7r(MioI_4!bsAFKK-w{FK1lBg7u z-4v&(Xll$3ykbc#Fq5Ph)j>3>MpP+g9?2F{;`2;|7xDR^xOZoHr}W(+7%l5LR^goKWJbk@QeEV80bpGA6QV^7^$JJj94QycGwTaO7!1?2HQ_c zI&Ey@`~7%kqPq+l*cRv==RbMDla<}H!h07fkZnCvm)on@Kp;<`*fv|`!{kQ_(Uj^u z59dRu&VRgFd-ku^DditVo$a?$@-M#qyH|*JrG|Eabg}-@?vNv zA8hFTA55`~}x|)-)n-tR_W6&tgeYTi0OS?(UrIB1}qwH;I#VI!hXGaTgBFI?sp6w=w@6CZ6lZNJ5gEPKQ6e|U^$w`w#`PKvN$Me8lwuG4#o#;4swQV?xka z@(R{17B%WInUa4Gh57NyzdO#E?FL$bc(CPGo=gjrK}kX=kF}B@P@d)<`X!%E;u&4GRIP9ghPQ116=v!0TF=b^iA`S-P4?li~qUkJdz z{POb#8?8Ld%DSQDBVek;ifqe)K_@}q^Rl|gtG%a}t5Wm&X1`kfP|yGHqPvy6yjnY#tS-*iituefzseu;+1g3{&cx*E=JLJ7 z_jMJ|OaD<}RK32IpIV)sUth>?copBjzmSi6bK$QP=Lg@+-+s$?a|8nSj>MNWP8sEf z#x|$5tZ&@_s<$pWT_XhQ{-D{i#pHD0k+LzVaL;4@qHsUr>ZXJ5Ug4Y7Em~Ulv_V;) zr>;&z$bmt#_X>;kzKvT`zg(PL%))T{(5TrK_1JuEs?aeH+*yT=FG2XY z3mvo0yOGOoho$91^fO&$CfxRg^s62 zEJWk1LfQlYO2^VWWWd`b`z{wJfNBjY>84C^DTh%le5%edk61G_?=89Y?|=E}FF$}q&jm2K&vYTFrOrC7D86?^xaM2nF%6c$C zrDkH~Fdj}cRr5F${$EQ_Sw>;P@cHw`*I8|X#Z8ouf=xtyOnC_r99en3*~ychIeOja zjOkIw)KtM^CcY0BJht6C;>W(upWj}3vhH!;k34G@NUn#LgAaB%6lrwA93b|#Xji=k z_9_GEM9RlhP>n>>sa$U!4IWg;w3O`h?Ot78 zT)bPQn}7V{bZr}d{dV=gZ%*s=X!7VCLH2gNXU#5+#tOaMaMYHRF0DidCiRXOCD8WG z1B&T62uTJ~Mki>d>Mrx>wdeKYxYg&~Ft(12l{9mhCz8BFuN2f!Jvg5t1TPSKqEc)# z-q#2G+-G9^kodeM%JseEeuE}_cKblfhw^Y=eUa|GzY9KVerdz9YB*&!1ncwbv`RuS zWFc6Vg(MaUNId#tyHi+E_m8ODQ0X&%v0enp1AuEK^k8zE5VOS6$hg`YYkH40xS55@a6iYVhcu>2sDTDpR|QU@4v77@b|n>!@+tSp+V?7w^O&_Ll23yG z=$$o|2NyV}1peX`kcrq8tL_g>9;&HX=Ulo$*U7z#*H}y{tvx{5YC9_T?9N-UJH9>VSg-Fe{9XvI1Ef%%_Z_Y7IIyuR_v} z`~&*qJpL^D3Hb5=Q9z+!(MlDeLDA8&q>v_zyUlVP^sn3aK7bWr#JB6|m zM-GFtD`G5^5lHuN!&eV%d>@Jr>K+rbjX>+T6D;#fxi#E=bH84Eu)=R*ciMuU99SJOsPt~q0v@bi>5Tvp(k|6 zgW-RqI;7swG_-FVY-tcAQYkEPUjpxXvcWY%KM@7ZMtS|LS>lM3`-I53053x1Q=)+( z<0Zu3#1AS4r@ghk9BZ;-oz2k(!09OtYq%V%w<4eL{Jh3Gv<=Bj485`*?FzuU@U*#C5A;yk5oC_kaHG zr|mOeKd33UWpO<{r6w|Vm zcuRCwwl+=ckP~3(XY#EMz)^R#+eWX2f|bh2ee&c?k}dM&qhV~6HIhZ*U<$_+mCjy) z&OssuhZ}LPoKYeT_wu|<70I(5dORyF<5|MR=O7skbR&obh9R%b8wi{MtrM;`8401|)oD24% zJsvl)$ON)x7*Oew@u_45EkpsdI0eBY11E_xipxyn8HQ8Z<2+(5+T+u}pFC0s&V)gG zc1k5J;bpZ2Tr3s1A%RhxOvoBt9i7^p(jE_m|FLS1JK9SJZL~Ion{1IW7+-aP)~yR& zWri4CgAyG@P0AP?sZLYc<4k}T?eQtm0F7g|W)L4)Hy<2ls3;+$bJ>90^9(uard$h2 z0>+bj#m9Lx_-)!CSNZJXs>03tlV5Z}j=%9c2YgrmX?CWMEZ8)+>sYZA!8#@qz&W|@ zaAtsra?9^d7rCvc5`|4hnIIOdb#!=-TiXUn|r90BgdMDf@W4KTa-?r^Nz6Iwl$cT|=W%aQC?5}F%{CyS+60c-CzGs+5;*oI*<1)xP6=Z6>%GVI z2^aS(l=DDdPH;a9f+5NJ5qPi@%3Pd_K7%gZM96#DLW1_tY1dq{zQy|waBrCOIlX@6 z8M;W9kFa;DSV=iDCucO45cyso{aX$+=)J+T~Fb%P8`yy8~>JT9k;xH=BWt zkjg2c7yDKLvG>!2oC-f6Ue06IB3?cX0%$Z6T0{$um0(B`(5M59e`Ukq;ja<6e_w zG7dNLj@4uhHj9a_ zEbEIW$U$|Jr^djI0vMJ&GB_QR9qZH+Jex8a<*g^vcx!^y9Kcc|a3Krfqp465_GHDg zvFYUKb;RAk^=5sr9*0b zXs&K1XGH}x7fJj|MPRw@pp1FdE%Xl4WhGJGC%aB zLy2W<|2icl&ck~z9gtgc;`P<~==7V*`2KyLYrbwe5*}Q=T3uYft(WrOv(vxV)sHvt z-u0u@^1~70Gr|rlcR3Z8MXUdtHGRZS#TdCT*G7Y+A25W!pk8T42i(Z^(^}IU6u4 zP-Q_{*@v{vc_2TeZEgv3EI-SYZZ0owuJ);J?)$ROnruW&A>bg3P^vAf)S%hk<{x5) zWLbkmzrJ<1bMz0$n^QKXT5Ub(X3;nIu#!kv;SI1d1~1cJ&LRGZp&AEe$8<*piA!BId+O;Q!CI=Gy)cj5j?H}lb6 zG|r=DmIR$bE*d6bs8BhTL=bXfSw~Wzc|#5=_eL7iYhQ5=*TH0>H%_j%Gl1||KgvHJqK1XZzQhT0ZG4``e- z(LRL8`P18adbxTZuiswDExWk7THSP@SMNTq-rSs)c%JJYUYz{mEcdLxbOcAXcTGLC z4#5t_r74BtEg|@#Bt9rHLW-fvADW{Ri~^0~gDF{ZCXW_f@(~MQWO+RtYZC+twm~Td z5;*%|dw0jVAk6;)-64804~lI)%pRm~?yFHHI! zyK22GCKd-lfr?YTfg4Qhr|(KF5Og-6VjstxDLOqWV@(K?v*DekOnwQ*$E{56hBpUq zG|O|k2@gWnp~_vA{K59Iijq$h*+@b)MFIzg0TcAC@P#MELwxa=c%ly#I%uH5a@*!t%6-VQ3<2-?|m0 zkrWVIvkbBU_+Heu7_BWd)*2=h%Gq3aP@>#6ZoF-{oEpb{B=RKgDn|F?cXsgSusIo~ zD$jYQ1d<~LNd0_8ADWpe^>Y{Z%agOAesChrmQcU`=C7;M^J{@8Uw>+XjH^F?_djk& z*T{bU^|wEL^~1lv{?k{t6SpPet6e|1k}K4FdUe+fS?bwoTEje=j`Lex{#nycxaYk? zr8fsVoNO=Ev!pE{6F5Z#Y$V7uo|KZf5^EaOLMBwr+4S4%GIQ**=8h=KUSfM+|0X#l z>>&gr1dDwTM(u8+wE=UMOm!`6j_g6EWX;(yKcs7J3H0Jc`7|l!v@9evOz_51T=yXY zqnhfwm;rXdLd)JbEul=Qqk|)pTIQ71sa9Lh(OI<2J**$hL1`1*=A1|~IT1>H(r)Le z3A~}-S&q&4qS(;bUT9LwoC)uuWgYvf_hH^OAmkQXC^iMzL{9FPGUr0PNSS*l1MRlrYx&o@!8wAGX0plk z#+B|?$X=pGUjQ{LA5C`JjcQkuQszu9>|4rw9^IC^q22wa1)!mZk$TUZN}yuwZqxm! zoi-9kR)^jt7r<+t(T>Q(>Qi>qt-{CeGVnJ&)DuV?G*?Xu6Ci$P1EsfJysMGT5U0m){K z#G34cj1p`5Qk|?j-TrJ;GM$t*XOeM|HXjXS9VAS2B$wVeA7|9Q$qSL{{?}Y(e+kV4 zQjRTG&PC{yU(XF`h_L*i9b>+Q?Z&1;sP<(6&O#u^aDl$jpTm zJtTBanX*cbya=6-53iF1#Y)67oB^b4P&EzMQXlmy>qyisgNa;vNyYGZqSBFjex03@A2=lCs%IuA*pjFw-%}MX;46`wI8n@jvi)i+?4DjI{747 zXrIcVii2jGmLGF2#!)&vDRmx<0>>(KhTQ@NNfl73uql=4m@6Shu>FLotMYQ89}kqL z+t)st$BYdVCzZ~*2ro+K6XSw}{D!)(_GZP;(MM)iAk^afieG?L79^Z^37w)~N4->& zQs+!EEM1$A3$;<`38Y#Tey%Ge8)lu+B2X5-ilpmb(8{9!p)5g62%tErRBwp-jrKMTrGB5=2X!Yl%R< zvZSQl{WPQq%99J&vTheu+Lvic(P$R3ROZ z#cl|%(0^ulFvYehBUY`pp8n%F3C~gndD+~jOa(|LC5YNFCu2#4dUEV~rqMf|Bht=W z2~{?ZSG5@S)`Du?E-@H}V6%pptgbP8B7R8EoQdu%J@ZQ-K59L4N4T|-?ZH@MH=9S* zhHS>JIT<72AS(!zJ?NUEV$KxCb6O_#%-ML~uV-!v^`d7!HEy|}gRgm1m zqT9et6rzNj2%%vgD6HfTH`X9oZ#B_d?!%$(mo5(m_jfnf<>KP<4(You{LVq%aW=e? zE3n65{D;G+t#S&ew4Q53fm^-+Sgjc|V{J4LmDb=hOIpXe8aHw}o|GwPqW+*vxh3X;++}@NWyv^y^9!+Z z>RZ2a)OWSElSNv2!<$^7b6Ppq#p(E z2g=X;yX&5p`K-pvRl2#p{qogkr_UerHJ>+8L-0(_(`HwSDre=mOX{}IhLLoJbMcS^ zI%{*O-5BY9nR6yl_qsS8xy-pE%0^j|Y?TIS!Z)juZv=94WjQKF%W_mKkVEa|_O>`~ zwVKvB=jN(i3fv#i@|IeY9P<3)^s2sEy|1OKkf-td>JIpOf96>e!ISdHZg9c0MRG|W zGH7&Kq7hvn)`HN<66HH4(CB=K-bI0YNblZ~2g{uMr_D4;cf7R$2Xo)7viC*^rd#e3 zMpA-wAy7s|<8rVZ?;iv;aO!iW>8&S0En4?p;s!Pn5x7maRj^Gm9g~2S>8;svQ-gK| zYSOKu%?;HkubC9PXTrOP-3NJ`C5P1t&CrVPVpe2j)9}3sL-lev+62Da>^dLuGgF&M zv3oY&i`aeK-15Bwk4kTHkkqJ^Y$fT??EBCN$wvBQY>Xi~G!APT_4Q4v-7~qhsNIhb zw~=e zBo9vVk*wnK^h-=Acl+dise2~s`m(Wf+ev?qn_nIP|_8Fxz}ynOM;o3#vmSyxg1fBm*Q1AMYWEvK!?H_oqD zw*ai##iiV~%hiXA%d-iift@b(J7?W)4$Z+iM`VVv!;)vBC)rAxszN%;1rn+VoLx0m zaS7uA=941zOwuhP^`n6-_sj-s5eL_O?nN^;U?ZpQP$g-ADi)N*B=T^vQvq3N|9_v7AMy=iclzla-?Fel{kz}f=qF3!>V6!ZR^oti;}&E zwM3J|5~#wUWOL1)bOh>S|6KPlin?amg*0mCSm&`V!IY9c7v4q5J^?7oMCh45?88BuWZnP_>M9jwu~`KH7_pebmg-9{c%^z-l<3-VM>Tg%*7fL~{d< zg&^CYqbc$SjcQ_3I`&*{Ejsogq5^?2+)b~=m<9VjZ8GY$jxG79{0S=MYJC$j)KOS4 zrDGos?c>$4cQn^E=p_lf>&(|0CA+W)CQ3%=P;%0g1nyvrX{-xk9?cbQ& zf0tEe6}!3Z`J4L54MILSJFD{fT7~|(UVdB&ZBA>u`ooLWPjCChR=;Y^?(NvCm~&Si z8R^_V_NZa-rErf@4Gz~k`^0bklieV zoRejvb?@3!x7D5~SrR1MbLQ%8v!jJ@N_e09SS-T(79j6vo~NzwgzpS?B`uhFnP2gGLEbtbK}2 zu4tl9^pIPMp7a{mTaUS;;Ipxk+p|VlAXDn1p=AEvdsVg1WEoG6UU%Qs4mfakbHt4j zTeFJIW&=9)Ba$rZi9{X>umlb@vd20q_fG2WGvS@3yMGDB$E~~XxOE^iS*gzd8djEFq^1Za_iQDzhg2;B z8WjnRZ{$ZOQ6_cwgQ0!Ay8Eu~o2*E3jUgqKyBYfQ0Kg!x<}fQ^2eVwQ-(C3;Cq( zJ`?o^b@y$o?#3`MYob`hTuoum0`zw}1L-_1|Cr^yk&8c!|2FFv9REhU{Wj~%efAs8{B54~qi3zM!Mm{8 zVjHGFURNkqTS>^cfo!S{ETW0Z8;PezQr@JtKl9Ps>q>j<+CJ|VNTFiQ&J82fQbk$f zl!jV*DZ7!N9D2yyyosq~rTl0v`JI;a|3BddiPQ)L&y^&xG4OCr?wg76@@pWU9a>M)2jn~7J`Wc zoT+FGI@QQ0$1dsH-8v#I1tZy;-$=a4H_70f+(crQh@usUR4O2wM2W4fVdUd5sp!u{ zcb206B@iFAqQ4{D5;~Gs&J69&D(H;e*GW29;(CkkI~k&b1wyEe&(V3>p6K+FpB`h}`$0x{a&i4#32n}W>}>Us5mv-xa@9~SGk z-t{lL2=&lp#)p3FnG-@e;yxm66B&4&Q&0u^_yTavIS4s<2^35+L|nOy2r;SS&m_cy zI{vnFSj+V=;dwssoo5X?vBZK-GQ44(S1J1xx`~_W*0Pek*POtZU~=t_9^;WElS=+f z%pY_--xBjbUiRm?KiTUCd(}?QuIpv*7{9!@dGmIyPk%T)FBcyq_m_KId~)V=Gj!$!hPWZtv^)tDN0V+O`j znNQ-+UgMTTe>eGhu#6zx?8a^q(~mzx#M4tHj4wgV9HQB|lqE<9S^D zuZ#2gsYv+d;^O>NK3Tm#?NDERsqOWCUha2J&t2!!dl%H51%IIEf(tA$k*mD|;-QcA zgd8eWWp#>n>~1tg&PnHWz4h$JMf%(wT`RYZtt7jfh}TdJSqIQ628n(mcenEl5(TG- z+WH6Wu;-$?NS}vzm{E2cBhT+f&}u20RDyv}U6QA{n!eXq;Am1Twf8+gV23>)??wCk zeR0L~BU5N`lMQFej-0%Tym#S>%?tr+gXo%kD-^2sq4wmNTv^1=U7_ExjnxFN<(3Y| z%AGGk)&{x9F&l7I_a2+nKsZuOBOB5f`bqKgV9+0{__72znXo76t%BD`pyzXczh+OfrfH49q9z(>-yXm1p7&@8KctH9JE zgj|}7!Q_-iS?HwpIg=2-jrKVydme}4>2@63YZaQnI0S*&>ShFOus*E?hYZ0c4cb~& zLuAwJLz3rAsP`>-erl^-{qXv)tABC&UtdWImo8(M7SD^sa%X3oE?jxk<9V)k`sCYs zxmgiTx&|O$l~qZ8F6Jy3kLRbgtkTEz&%OS7_33LD=kkmF>AP>ffBoZ+Yl-vnB3<-& zvRuf*^5gek{pqJ4{_@TGg8jSiVvZkPt^WA`v-fUGavVvT=6yaz2yU<|0_ECKO>J&k ziq+g{?sj#zknEZ5k-D)Xkjq3SCJ$tzuJ$4J3HM1>H2`-wNv{kKL;wL~cvlw+$czk+ z^k3af^)o$u|1W>~;Xk&Y>D&MK>AQEC!VkCiSArV;?fd`hyMNw(>F3M)`*!`}-Ru7S zfBX;m;`Xh6N#)_;^*7T*=Ck|7&-;<}=&kmI10&SMS3_O#g`#GM%z9}b;2m!D+$h~8cs&?f`-Muq za6}eWet%q$`L7U@cD{#@ZI~dO`E=)nR&wOyf(1=Sj(T43*{*li_Nj@tAL%POl*Tom zbd3d+k#zhh{cSu-Hf@u`^qzk+IeykWXItExy$5Kn2L^|$%ff2oc*PiUrlPT#{|&Wv z3r?ek6cd569+9B3fksgCriWZ zdBH+cSV4>zmKRNhm%dl@=Z!YgPX><4XH9L6MZ-tt(i`Rq< z@J|0mg8GNoo6ZkBzwA~h*^AA$m)Gg`?bs0H+qd^^`$L<{>&-oXwY`3^`M1meY*(8% zSLv<5_-*s=yLPwv_Tg`Td&jx|EL{EWjy=rVa>d{I@!>UF^~IPBoi@LwmoK+{MbhQf zZ`l7=_|eb$snOafuf6&(Au_ZWU1fi`Rw*d+1QdAX^d5~R_K=jGfZbVozwohH>HX(Z zIU-oqYO z>UspfODi;98$USP$vWvkXCc(s!3AG=ZDALz+u~i(&Guo%znz9b+69 zE4)J2FVP+_Qslcm9<-DmO|{)X>{f%*wnA#LK;%EF3o5t1qeI0~gIKe)Kd;n2=;(3M zrA$uYu{SU|C3*BCq@*gy| z_R?y(-QGUDxqmm^aGS3@nXmZKKY!NtBZqZCqaSEglzOg?1(FK}SiJ(-Cw30CG7(EN zQB6?&9CKW1KPz+md?G6!d5y4U-~z^>q82nLG7(%vBQ2~tV2vqctU1HoX^l{IAaJQvpjI{XWLl4|V>gr0ShLJ=w(qjpd(hp=9FHKcji?Ng z9Xt^1H7S`J+00@vKAAAn5B*j4dU3;@sES;p3FqMLq$dzU1|Mz znv`_ot-Dor_j{DnBn44t1*z3WJ(g_SB%gN{I4%@e4^WVl;Nx0`f(d-+SdlN3m;Hm@(QA2`_m=GptS#?5{Dxk;X7ZSBn_ z%k6#jg1`9Y&CozW8YM^uW@EG1{x07<|6pFv|MK0BKmO^ze#ep?a>4C|-e2_ZT=2ZD zS6L-hYJ_8gjE|kPR2zv$8X^a)($L+@NcPgBH+fPOJ&QXRTJMTGKci=2oe$BNp(R~! zRJvhrQzim}vo1rH<1d4mGCCz$wii2a=R%oR+umtJRTY;>Trmam5fhmFEKsxTIW#xHcA%4s+9;clPSJp+ck3U3c3S`xlSn&c%8^jyw01dc~ceer<3TO_1Y_;gr=T%t;o5 zB)t)B=54+rlx!N=&Q?_?&gCrbTxcr`nAe`>a&EZu(EjMk>R`qZQ5lWtzBSlp;khg+ zmK==&E8wb4Ewkr&@i^@~netDSb{^L27)`ViDGac)G*hc?QjsSabulN%F*}Hxfct&Zp=smmrts9C~=b|PD z9J8=+_)d42)?61%Ma`XBHD_PUq z=R>~a+i(8*Y+7Lc4n+Q!&7&_qZ?lP(_YG@sOvKhz*?<)SuOH$PYRIZ-;McfXDqD}A zWaiKE#)W2c)FtAn^TxweHr7hg^@r&=&9qQTgIX1Pf0z;^;{8D9s;X(&aO(ZdE{uAFUNs$DylBncdn+F~}^DoNWYa z_8!e;(CHR?g{);>i07vz2HU_o@3f>6bfk+XPb3d@M74`ilODF1UaCqxMNm4iXVSd* zC`Lo7hW8#z(Y47IGfN~F%Dae2evHOXn@Aq4w?@rz$Jp38#TKlJkOBqiu$CcZ^uS&Q zv1`$)nYRC)C6bHvew;||DfLPuKeeqy3gpSg;T#kz`z4+f=%{2cY^)HIEnrh6GRXyB zCNb(PkX&dg3$WCl)^ct@^02v0Iuf#T7l%b6vP+tL;7#6l#V%=PKTy&yJ@PK$ki*+) zBam4jc{1gnDv&%-VHJZ5fyN{UUz2Ttcl)AbB6&20@2XD_yQ#rAe&p@spm~-^E|qvU zk=%RNUy0K^AaxfY)~xu+XC3mS@A52YTxc3cefFO^XgqMw*ZjOGjCN4DrCw$DpHEpCvoo=Aq0GBT{8mZl5Sb24rshfc$1H7JDDO%ePZDJsjw>*X8^11F@jlon)-sHA%f=P74pLK^BZR~XrASa)$)&IdTEng$lM8KS z#f_(x-h1zSbYm%Sbu|>S8cNW-7gW9+VQzfym3Os<)XHT1*DP*4ner=coJS81BU(Qk zA_s~tyOzLMIZB8jK<-r@aO*WD7daTcc$_vaRd}V1U!Xk%$4;M#X0QiEHDE;p)^_#_ zybh3pDQq6i^b&H@Q~ErM8yDKcv2o-3W|DuTj(_~dSu0N7u&TifM@lN{q)XC}t(H!c zP0PgT1X&sdnw|b4G#JVof$`($W89qH_$c);nJ)QCTaWAG3kmn zgk4qD3r%A-IrbA9$Fsja`+oE4=1r@cw>J;ZE8pvKvvm?~f0rP;HI|*PK5Nrqp`}52 z7~)IUHMt~bms)3OC*gpKm!1->ql+xY^w?^iXfCv!6aor;|2+2un z81^BfE1G3aq-#Zv9VTUzv(xC8%DjT>6*aDkj;;4pdd1eC+EjRp=Zzl6$w&c% zbgNbnWJZoliUmU7!6)ra)+zOAA?F;mUTP`}*yWzqa%R-}K;>Oz7cxW~`xVNRG~+9v zE*v)!5#-*H|H%Pm7j7LV3~P>BpHBHFO05r6I8xALPz_-RhaldFxYcbP+Poa;WDKB19w zpn9psM=90c(+-|L`<}OxUz*Ux7n}TWzxjT1&G%t*|LXFNga3!y>-KiqX>_RCU;1-r zZA)5f=ae#I{)_Hj*A^P&s-)em^!O<#I%(frDBbrR^O2Ss(@|H8Cypl%RoOThn1?i+ zZSew$N?%@HK>a=BlVu3h9 z)20oxd~&hgE1&$TY$XJRmL1R`)2d*i(pa0&yk>z6hchlGumNo?ttR6qnRl~%a-pfL zeDbu)`xqSikvNXe$~t666=IXYiPc;2Pc7t}YU!?+)F)g1ET24?@++U5eYRCJ(W-HF zBK2rE&L~i9(sC;4A!?xpJ@Bincgann%UM3TRN<9Reu?%#nov0$i|3G9ZEO!1E4u}) zScs)WNKw05iwikTDkx_07C`9vm?14}z(BDmPPwNYwpNUHmD zf$XKdTTH>2T&(Sr!>M@+xlrXJQ^@v)L%R_GUTuE8ynn@?O_JsBj?5nqz0`P_?KM~O zI8)n4$_4dd;2$~LD@N%W$3BU18Zt+o;4KwmwFSs0HRW;=u2|YBO$Qv8d77oV2c&_#UO;@NIpQ=y564laD&7f<0i%+VT!#qJYmPpU!&b_?DfnIF@nq6JRq}YC#8z8{ivMRw zc~G`k<0J3%!GrS&A$jc}cO66a&Y_+(jGIM|OC??~&}iRne?^an8bs9W*W0nPoUtm` z$Twe?Djhs}fK++|O^P`DOeRcEnP$o3LUY(X&S+1^;0Y&29wxETMr%)Q9A+63VvvHE z%4;~dW{91?9-$e_FU(czX_mn(b6hC$QR=k!G=%5R{`=+qE4~$y;&{8cy}7x+`-jbT zy!xxlZS?UE&xT>@S2s65-^rYG8Jhm5?>9ZYzPx(-+X?Mb%zd1dowWC$(QY$>_I`h<7=3y#(js~KSVGz0TGJ~}i@U3-l zrg(nVqZY1EV`xOSPWlASv&@Am@0^MBv4Q3~g8l2TJ?({oRjO-Hhzo+Oi(Kvohro-bZ(}jZCybI5qI4=Y zKqV6p`s$-mRO}?BdX`z9O!}2s{+*mD??TXHWoORarNTRb4{}#|qkvdUhuCrqlFjrR zziyUUE|quzv)p&vUzz2>2BEBUYzjDzHYIXYG=axzW%i{E#8C!vQQ9KgMxlu(I7=-T z8pLjDxu-ci`FzPkkEAeo#qTm6TnBmh`L4EYbMdGeL|qh+j)*LO)6@Q3v+Q!A)W;dX zzMnZffA-U>_I6WlUblA{O|RQ*4fpJ;&e~9{!a!^S!;-*JLCmH^uto)NiaJngyk!)b zoSU&|JvqpjrHc#g7L$xQFBT~1&{S4TeN%WH z-TQVM+qR7+jcwaIY-8JI)7ZA1G;W+U-mz^v*|Goo{axR|cRtq~%&eL9++6kLR&3`? z2Kwb7rS`vhlQvxsb4@BJe6nv-H{}!M)(2S4G)Bd}Nd}tK`0ib*EhvPC#3u3Qwms^t zk9ft{q9i+i*1czU#6c2!ft00|A~xNL^5+->ck8XnZ~v_BD9 zc!v209P?Ft940+b*lhR9R-oL4e7N%2o&U}R%bSC@e2Nh;I|&CmYrrn6`TpBoBAzS5 z)+R)&OJV#JCUK{^&$P&;Pip2WJ-BIJOAE@&_(U)Pigd3uuhMiqJ{%7NHX@^hw!42C ziTA^;IAyx_S0ZhazhwNaa_dn}z&U2gpOr;#C=~V^zf}DZ626M_kQ(fb{gqtkczI~U zuluxYur4}-xuVSEN8!!gg)Av#$F*x>7(=BA7gmFfBhn(_8D!!ceTMl`&u21OEkw%D%*Xg8l#Pt4*K2E^aPs zTuT>A6IEGjV?7)C@(g=p?w^$#{@)TTAj9>q)u$#mVu=9kN?}e=at*3wRMgG7zeRTN z3f(`lYWW5%V{DT4*8tzzren3fJ+DY`F%X2%wD0_G*k>A?*(E{?j~bQM0yt;OS7(?E z9=|8QjwgkS zgY*mH;!BeJfVf@=sD@UEwXT`E+nE`~BTX6Mo_9pfTJ4HI&zmkS!xVPVjsLrUVLDrmnv|*6RUgj+us&LFKb^Mi`gKP z=i!eSeDvaU7P6?@8vCUsRh!N(wt{~I%uf^3Es;2|0NPBh4WZ-EQlt#AZ~FeA!cc4p z(MEi~E)V9IOhL+T?rGEppDf&kJmFWo5 zFA*DGnMFf(EfbKudu{8Bm5SYiMoL;5f=8xcA$&EYN>{p;c;*vb6xp}5g2eR#KMxAZ z^;hP~ipwTHn11OqfD+jD!||>fRYs=V+8Vi(>@@xisE+)Ba#eVXz~|+v zXGy$3=|XY6;R(&Qb3J_^F>e$bp&U6w22ANG5Y16FEDcOr)N5ID@~{*PJn{fSfKs4y zR($~_axkD*8%cs9WYOE4=&dRWl!k0u+@@4q$KX)T4Z^-HD^_>ICbJD`$A1X^GE zS|Gx7cge08pgC9kV+?(RxcIt-J^FWNU34KchMw5E>TSTr{~-w(haojTv(MH8dCkxo zHLslSHBL71f9S22lN_HEW-ugHHk^peGI_&5a-vqX!w=G~laUu;l0i2U;^ zyu+vaEbEH9&VG|)(Z#)RV!SF>B%wu+NpbQ8kB5o~LZX_F;_5Lzaef3%@^>lDAI^mV z3Wg;bfO8|9b3slu9H=p(dPXjSEB0t|_Ala$?vMH;Qzh+@oHQsoY)A$@zbp;;aq*Eb z_Bu4@(SylVfgDN{$s)qF>B6xEdw$sX`4ec^HjFDxzWe+Y(6oXN+&KP`ZHQXyqdwu( zt8puJh^fboi9t9rYEHk%1te}BTFlUO0j%XCbCn&di(IM$gY`&>hGme# zZ6eeeO$l!!l5;_46yE-@{O9!ixE5hzwOdcX}>(dXcaqeP6s+*ZC$bD>DIiheSJw$|`bDZ%liCNhwm9}ZbLAv3AN+~d>A7auy41E|@9*bES!Bf} z8`#Sa@r=U#;T}2hkCe|rUQ9Ap=V+%>tr@MW$?XTcXY(->JqY1nR5;L5N4e2NVM0xu z@3gR<9XL!L9|*yz7Ob1iw$_beIA)7C8a9}#<6=`}pW(V5L5Ew}iKu#6al0x5iqNHd zZCtc^{TZKFfnXCh$;QM(X`##BzC_i~H`}5J8r(~FZkelC^GQ{7Om93RVs9gxLI5sf zvzkygUTs#LYV_!^9mE#np~$N8a)&Z*E-lkhI*ugvN#>EeTNIqlYuF4naQocwl!Eyg z3WaAjg1U52J$)8Ie|THFr4MI;#BYoOzO1JQcZWXt8?8Ibs?`~3=eE^2aiCzBA^Aa> z5q_cM@Y=_AK;A5c}g0SL8idEWYCrC&d-2cNg|9N#^aHi zQpcN~j=K2yXb8y!joR%^>mI7W5{#?TWFLnY#u5P{J!w)j46H4G zVCQO@j>+jc>+YofXc$a=lG>#e3S)^rJMq%MwiQ$QPCm1z1)mBvzIwP49eKD%?ct<5 zn(Mk|ZI{YL(Z1}Z75Y@3-=lno-&kH-*NSgXo3e20#K8uQ-RAYxpSF{%SM8Hr;T40n zgry0T_LW!SZs%8LSo5Cc?PPe$PNsBhtys2iiD^YBsP%5J1k@%=3u<#zgvL0AEF6D| zYN?fp4M|EHRA&hNm4>s^q>|%vB+AbLj=#x5SRh|xYX0v3S@<=A;*NOy#(}yB!E39NK&z)Y@8Q2c1lV_d6HxZz^?ew z$k^d|Am*fP=mpViKo%=2#SKw3*!zh(-?%Sx3oW|<)6L^+`5imMvUDpY!YQQRT zgJZk?{<*28laHl`oS!{D0PL1yRclF^d=-giInGJh0F!kGDYUU%$upL8(FWo5E3=Vo zXu-|f3g#zzDWR*n%V^)8*;j5Xf(}N(N?$KXB*LUAf%Lk*B+4l@(}hUI-0+jPb35k; zKUP2BL%I=pjmp9sM+ZD}L#G<$i%Qsaf#i_=^T%SNIWS^%&qc!!c(Wi1=xPMCX1%qw z4#a$PybkC+G0tL!V&Vd*cl8tqMzmSyT6s&)+JiB01H}ahU-o6J!8c5P#p(r>>5azu zZghLKJl|+0#d*>iP(7;~7}(9aZTy*QCAMqyTCnF1crm1L?2%on9@;2IK7eCI_3FSj z!_dWSj@_f$NJM63h1OUK^2q(isHj5BbR|=1<}P?T(3UQlfvD&pnUSY#Mtflm*>k_# z+rFP3^-IMBLRv2Odf<_lvSoGDobv>QBaR&x=xdt%Om4Z}ePbx&G!TLN4~LW$S@^Ug zuk{9S<`qEbm$4nietssl5_^HPRsaXn_rtng%`%;)dz|PGQS`Y-Y3rj*_9C06IGiGm z04+b0&rau5LaB=Gp&z$?buY;28@V(UJLm@w6+AV~rV5#kyIKwnBCi|d%AK)oywI;C zjVNB@HjNF*0gwrmVZ?#Sgf#D_qxre7LPk>)W!SNR162%<1ikDFGC|a_jn$lp8w!9W z?G=p3%4QiG-tJ0wmk;3ViH^p;+PXwgBCIQo?b>}Q&xBIjQI9Dbk{=i>8gZ_uVcOR6 z$sB7Vmk-d1G=r1VBhdRo_fM&tlCHaPTZN{~az3!lhH2BAlomLJJ~l`HsS$DT6TwCr zX6AXOO1>cBW;C!_l_p;U5q$Eae5rxofe*WOhG~ZLjB4*&uKdT z-q2!kP#BVH8S~aAkRqIb7s4_f^6Fgk!cx3VA?Md=pKbFjdqPX z#U8{M_qy+WaX7c0ZZ{-%wLCTC#1($hT*?v3}*eu;Aepu{2{a^ZIgB-tHDC^ zI*kkFwlONxKb|-IM{0U&^x*&xfHbKd3^!I4)MtkHe56#Vx zLzi`CWPd&j$#52!sJS^zvqWQ%Dq?>5*?hHnn$N%GI@<4=jBV-w`9ns|#@cz&?}len z-x6(jDC;O8!7G3L{1O`fL@3m)#Y;`rgKRDFn-c82Dvf# zfSuy%GIz`Fa_(T^aOngNM<}x9aNq+aM+jq!{?ZzEev*`{|g~SeuB>ZBtk-z$R3V$A*GA!c@p&7y&7M z)Bgto9T)!tfh|fgGsC^+JWYr#r8;Hbp;*NhIHQ^ZG_9|vv#+DY*?IE|BBiT6Hn zn7V9d=!+!%pcitNUT@F>hOE@LSKZF&FZ3y9<_5#|IjD2LY#Za<3R)OV-|6aadY4z} zV>(NgQ42I8IO$KOM}16^M)b@(MDjQEeRaKHRTOX3m;UtF&(Zo|k;HpqN8=vBK3fs1|BO1NUh+@K&F28V&p1_z6c!sRUXOs@n?%AuF zWA!^=4~NuSS^iPTW!@{>oymj^!Ok0P#-d5$Rn=E!>#f*_-xXEElFXYz>2RW_^!#Rj z%l=+t=iT1kzP7IKfN@2>WOvJG^yr@CaCud?%Fk%&cKfzAg}XQlhVEEXg8ON}>JzdrCjJzmbz(t|o~k}Lh*N10T&;t-vPc#u3c;jbB8 z;KJg3Z)_|u=fDn~+$O1)A6uc3!L_4`%O7ksSq2+T*#6+k@57jq7hCh=sB1Ec!!)J3 ze(g4|ZccrIztmCXbNwdN?rse-I1hy^7 zi(?Yy!No{@p=z5c!?d`0go{(W3sXE|%4xZET#|kt;7^;zF1D?I5DfW5)=GaPhrlft zSCydA2+&qlTmRSi51Fm>VnWy`9s;mjm0NH;3-qlqjWe7>_>w zvf;4Jc04_6cnxuUukod*Nyc&-y{Z~B)F0C7QzeC@#4g>|geb49S6k56k9Dh@;kO4z z9TNxdhdUEgE-rnHQ>%2-UPoS>cn#?c0nKBcuuBPUWDhTiplv@(UTRyebIX>tc`B{* zr)LshOd=RXalGSEm;?225^Bu}2KW15>)thgDyx0Fv*PC&0XHyxmr${{YIA$mD7b(9 zPny5_TYZ=*g0;-KMZ+$UMX?HoN^IY8Vzx`i?_JwG?R6i%_}Y>oyyYjo+3ikxG{q?u zZ}}OE1#iKS6Or&yn;OkUd;*B5LTeGLf+fv{ZBIag&<>7*D+}<1{xuCZ4stN;lm#M^ zl=5Z{CNg}KxEg+_!g8qCqOvUmhQ=p#O{#m2h$Zl$x^t=EHt)a72c3mcu)sPVbR<~E z%XS0)m?vdOG;mYA;iL-VvlxyoK{>Y=3REkzpRE-b4NGnK!f;{5bo2`o6)RU0^+tSB z!=iOoz8~ML7}bPL6#<)ZB>7fq=Cst~KsHz5xhxVBRh`FLLf)Uq{IY|+`3a__{_N6~ zqZ4r-DG}3xeap0lhGm0EQNQxqKJ)KmYR~L|_(dP#mE|e+u{kj(YsNJdfO*!k(a}`f zyUAdTXj;~n7ZDRI`6{LVtMSW)y0F(Pj0_&|WzRKVK_N=5D8okwjyuN$niavzoFwXL2$eQ0V@#tHkNc(MTJ3c*$D<99qoR?DX6UwpA zHQxTKEnXglMIQR4YcjQ|yoN9l(hnx=A;Nu5JGnZ13vmcyVt|$PM;Yv*6%xc6)mks) zI5II8|G101CukCLTj0~{r~7aMEDC(4K!BUw9T3pR+p6uAd|sw9{W70s*f2cxHdqP0 zQ$CEF%p@`IZ>o#0Q$;7E(HmXYUO^f3c^5tLQ1l?xoLNHNmW))V0%U?M%xUGqboP`L zh-d2S(1CYd;0^e9?y$lOKN*W3mE8F+liU_t%`_+xYl<#bKDn9Ugm}(3brl$ir`)9w zKc_XP!(395NAGZz?;A7wDH}X<-iuWwcjnu3OBLrA%a*J3QU=6BP2wqZ@qHZ*UjvFZ zC}ATVLQKX7hcbMTO46WYSW!3(nPeLpM5v3tL2QDx+Qc@#$|vejpJKp^Z9Fo}QTv}h)_QP)ovH$k~TM(m9&hN+iyf23=xwpQw~>i-5yn3mbE z>YaCK1ulbsInP^rzwJ=$KDhXi#O1*9?8nXR2Nw3-*516mKCN#ZA193R>^^+&9gPe} zql%M13|8KwJXk%OYbv%zT%U6djX*TcUK1@hXHk#XZ&}VR8!J-mEkUS<msa8jry&O}| z0GTO9iE|yus}g4qGX-Zl^hl+OyV+(?5|1otuyh>K_0srO-Q-g;n`mt4g^um!%6YVD zC_@FE+Z#6}if@f7E}qp*@LDhKBZ)+F;WOpP*iM>z&=6dgX_lHMigN-+g9f}a z7qMEz=#rssItj{T;d2tEV~!h#*A$xbH;B)Hn2$%&$n=!y^~Nch+`TK2K?I7f zCX#S`jD75*vArI8iG$_ZkmpX;>@-DDNoK}46L|_Rw2_CZ#5nvg_)?g|wd|Aa)iI3I zYOAH64f43lbz=tHyCa1y-IVVh_5T<%KOrvq=v-%20*B`Q?w81VLmqhlocbad@0yY* zOT65yI$0hyJo6?N!o!sru*CkOC9Zd_7X&NEoCBf+vW>^vOV*aAV*em>hbR$MVPO%C zrQulMY06rBod|voQ@gSy|5G*(rXybadp`2E-p3A&KHgck{2%+{z@z8KT%P~SNe8$Z zad<-5Z@A+*Zi;IQlnS~Xviorxr8On2Ga&tb4j@FS*Xz|ATJ~fC#USy*mM`#DyrypV z5vrv4iGQG$p4>G6f_tXzwbq}WwO}itVuzmkzE8LRgsXO*5xm)O`?~zSNo843qdW`I zPrE3ngq;+hyM>$RIHsaq`wE46zk288U?bss*#A?N^NeG!3(QX-dHW5AxAP>-*rl`K zGn3jz(i!%%u|m}@P}q6Puf?B$CU2JaW*xTV61B~p3gCg+-+{i+P*2R z)wCdgLZWl!Sh4&eQ@cRM%a)Nm!?=6ox6cO9V-);Q_VcE8Z6|-c4O!vL4Du`?sqJK2 zh;>a6_u*-3MyH9N&GzJr(18xP1q;7UTrvvxbDU6ld>tBSO6&SRa$Z!q2 z^Wx0U&5Tuad+730m| z0>udf;o$!?5Ef|6mnuKR0^-|suCR-Rtk&3pjCDCAh|0?y3e2vE8*;5YQ!OdB6w`yo zNaxPeSS1s|^WgOtJU=&f#U@d8$8)H0zuvG&AU1|hU(iXpx<-Pza)uzF5)QR8_IcL`ly+D3?z$;ysncN`vFD z9E*Fs{zHphg%nFq@5cMx#y5>IxJHyZ&91^6SK5H?xt^E7;a0n+sC14sr*&M2kNC-n z7{3C!+;}_d1bJ&sOUK-VQb+G8gDYJ(gTpk#tQgTuh>P;Qz(BZX&DD@`^CO%E18?^W+JJ&QXeqYPV;PzBeDgKK(qNUna17G^P(=8F_d4b6XQ+)o~k&!wDKo zD{!mO=^V*+8&;H%Wzg&%rA+J%6jysD#Kyv;TExbtN*iKkUyj9W&7uRVb`1KZLG)ivRWK9S=oQT|COznMERh&{g}$5YJyL}bxgiZi zsUeU{A`TrODCunivW?el+LAR)6#a2~bL}jMA95vIAkHbPskKVgo!)pSc{!M&O27?z zVUlj>#;EWL8j6Dou`f{k;}GZIJ@3maly_0KzFyf74A$GSb^i;O?K#tnDOs6JeuqU? zym`HwcHQ~zSfB4(9#k{7&*LO-{(LXC zru%%4OV)#82zdW#%yN=jIS40cvnk6yOkZINo4G`|>8!8qKHF}I^CM5;!v%6VTz0CD zUNSD^n$4!lX8TFpjJFkt@EbuaUy6%RepA_a4&dLV@swhecL-?Z%jdGLCLN2>Z>A1P zZ6klH#*G!>MOw)4uE1}M=y{CpZMi|oBcifO#N(06FVt}VsV2oW)`$!Ax6OT5PV>n67vT5Tq4jEm*T3^>Q@^Cu z10s8lc(`GWrkb^N>-F;^?^D}9)u3Om`|WjLmAUfr3CdtpZciVY{TyICz9ESle>zZ=Ub2R$XkW4hCT45c@YpFsN06fq&eCf+|6*b7 zuVXg>`{-F2(4A;E49h_X98=?q(|>=1MXaoSxARm34Rr>GpLEy?mZIT{T?@aCxktCY zr*bXNUoqKTtynNl3j7l@cH0*uk2bifU$w8Q&9}SpRcC}P2%?-Jv(mtBJmmMkp_|la zxQhI)T+k}*FZG-Q+vO%PTbrmsB7ZK6LTCDby<`m)+*UZYPFVNVoxdd@cO05L}sDj+FD8UaRkvY<_$etc)5`39I&UpRXG!9K}$4E)7 z?UuCP(0bZCF)c3J?KVAx$9;XM6zyMgoLwfg|Mn1bB^SWHN`E|gWuX>w+ESV*4`kck z*D{pLdQ;G(k+G-se-}(EYuJPQ5|9}m-m19kAxFX&VUtl(v3SwlEqRRmU zZ7Q27QsCSaX7fY&`!sRPRS9AS!oa1@<)K-0)=t*B9)~RM-bJjH^4Njl&;2AWW;;I> znBj56K9mg^?FTwPsrKoJfdG{zqN#X~KBdk?08ZO3tQBivaE}ROdYXqHg#`PsvosWs>^!Drbc&i6n08?_8OQ!Vc72M`)LjyI1n`qgPGo0R4o$?U>%!OFs;E3 zbkR>N{mI^GsNbg8qsZR=fxTt?;Wu~TZrwGW{#jDO7!jneNB-&)mc2G1wSk| zGy43Yn?qzs);tSIcpl<~TUegY?`l*5ILbu1>up%&M!KS+abGoqQ^*`>>j^P-qHYib zjzZQv?Bv|kf36sRAt8!W%HE@!&FgB#@uFs+?{UOl_L3&L*s%eTZXUUw0kw(z{d`K1 zmEj;0DBG@^aIsIVOh=@c^=ER%w|@MLq(65QVs=JcSHILQNWeufCJNKARVomdr%vD}(YNDWs_P^ud zC1}7){)Iu|lO05ySj-VF+jd8kGH15BY@O=G(o~b;<^L5lcCBYK9C32oIf{kRkxO@U zJt_{;AYWVz5la)#B`O_fpGv9-uphrwAr)(qE`dG7S5fy+f*jKATOc4yj6-WWZ97u} zDu_)04%;+dQoM2{oQskle}Tz8hCj(AlggsZbb^i@3GTnpGf|no6kgdmcXJ{N;>va7 zBP@a~aYp{)qRhbrNWDuC?%(HeTE7Lm?r{pHr#{PG#3f}Vl~np!imXWKE3 z-aX)g0p6$*lpwkf9>-pXNC!z!z2h2NC}UQkY%HtMYPhs*BwulM|?ub;z)D_QPfl{A%n48(JA1eP>&+ zi@r~u)_2lUuVcXE>jP9MS{VL8QQt_-*s9km=*I#!|AIg8O;7Lp=4iLZ#e6~=kw#f+ zbIY#LKPYA7?N}lnX=<*U-oo^cdC;-6NuTS1dqGN}(prXRec>Xz(gI$H23CnPdT=W^ zke1BSRCpcCnDYW-glP;tprIr>`x51P3eIe`VW44H%B&Ej36Z*GJivmkyJ}!l%GFxU zgA*KXVDPtHf65F1*HV8IC$s=_oHq8T{Zf2V^o4{!OpZE;GH0iYIO^_FD8tZ@?yA{g zKtiv?kY{PuAM}~p-3kFV)pu@PU~;=h*&Hj-6R;T**3;AF``oZ$e^h2mC9md8V${0C z-71D@b`$XI=;ij=F_|LmyVTgid7(kZJCEl(8q8Nwxe^Aqa0@|c^{oPb`t4q#`+$8S zD%~s@F~-g;IZx3{KBzjzBv@<_n6=9ILot!5f_>~l$Mht!*7fR=d!eH-+PMJ8SmZ0_ zZfd-r13QrpP)s(V{wDbJ$g44k!BH2HSyFg`lx zi8*bV&O_8N{DE10Oro_`F=4U-m81z#e=!Mphpj>RM#HFqKr9{Z z>S83FGHcI~<<||*JM_jGH=jjv@abNR8JLC`5*Y*Gu?hvFs!L4y0vS(7Fm$Mxn=9oh z^?RdGTt?qs5cU-lnI$880ndfc-H(aLzYGGMD?p6-0uyo$ogVw+=`DdHLgFq^iAZCN zU3)2p2M}G}cJXpdUJz*J@CV>|Op&hj3rPFnl{-dQt-HN5sc?O(5BNV27|h=^+=dca z_#RJ9UlCs+<|uhsi{b1$5*1{%*|HhG-UL0s^jF^!AunG|z+mfr)&9!RcJ|$Gk2Mnb z$ep!xa(QGIyVvg~?{U$pxj7baSdBb*DpS0>+{*J}nn_Qb_`tp@26XTG8^Q3Tuc>UW z%f<%Iny!uliG;VT|6ItCAR&jR(71n;QFX%%GYp@T-)9yKu9wp#@n434#h5Y>$3 zlq54aRkN+|9DcdWKfK~_e}%BLN;=lJQi1TsZ{H^8%M)R&@n%ZrWoY*VeR=8qnPWQL zcD(M`z3t4^*RW)n!hv?TB5F@0*r1JHJzLVu#cPxfIW2!+0G0n=iV`^=buOzUMRuJd zc{n{gzAtmV#Kwg~WW&+Zt=gJyAlV~FokP#N)$N|g=UY#|@W=Ig!0U(6 z$JyZ&xLqNn?JegjxA{%VWk2ZrD+=fgiw@`Fi=KG*UWQ-jGCBb?qhBpsCVWIX<#bun zr;j_!*#H3V^F2l0cbSTaeG$LGeLN^F)u>*oH#qgZZ;?!%K%H4r^Nzq}L)E)SXJ@0> zOF3)|xo7GgayY25_xZ~2wfg>X#tQp_hlCUJRHGv#o>5K!jf|#91U9y&or8RmABLQH zA%NC>Q~kYc!}qSYOaM3v;SYD}^3O1#=-7^RxROJ{f#a!^$vaDIk>5LxMbnE`byNMo zgT9iLt8Vq;FfD6rmaE}c(@QPCQIFqWAK}j5UEO0oU&Yo|PVXN;Y3{FYN|~WbNc%EZ z?u#vEP3me?Y^g^b*^#WxAqhV(lyH#&KcOf&HQK^#=TVTl=Ksca`U}`0`Q-yc2d;L8 z{V3e-a_UT=VfcpGM8^4o5ugQAFW`!!hUxFrQan_T1>Fo^L;W*wet`p!h2K02V;(6m zbHcQcd(@n%ayc4@hix(`>HHWP=MApx z!*Anaql4acDj?al)El`<+B=moE7z*-pIu6YYMa1^^7?NreE8i?u&cI2j&GUw*McK{ z#MzjQAwsSHlA!Arsh~|G8xRw}CA-fy@t(R8=&ok)qsA9HR*?|xHG-Pr6QAbf+kc6n z6>wtcmKmk`PyhD67X|Tm;hg ze7X0#rol5A{@9bu&@KEmX#|a%oDkg(RiTyVNnE%~8s=2w`Q37Sc>q5OM{>chf zI~j%nr*E01F3HP0iI=<4)43q5+7qOaNmw&_TZ7b}&^p0aMgn^E+tLb6SN+N*o21-= zlRdvPzB?LL7=R!ENTlKcq6E0zg3S9x`}@J~u6uujX3Ma}|Ndd{aN*#-g-dwDVfN6i z{S_tOlwBvS13tsm5P#hhxZ+U&L)kmQ<-T^7c+>L!r!?wRBrzZ%p|JB5PVI~=#qD& zOZmvj1NU3s)|5HQea5|GZwZ=mgl> zbU&wk0)SmcwuzmWFJ?(B3t1C!CtO{-TRXAZ$u@@4m&+CFpolejLvcPM2XJjRxT&c1 z^8xacSu^z|%YxMQdZmNl?z4e+AJa~F^i}!(ChxeK^h;4Ecd+O5Kk%I+G{w$@;#J%<~tMz+~@%uu^&43ANTLF z5_x;oW$K?5&Wn)PC<9X--}W-9TRV;7S>g>2y82VUR4auHVBiu)J6TB!zJd*UE{lTH zhP-FAx=`8hv#9}a3K8#;vN*1607Gb3*al`1+91bY28zN~)@-o4X_+HR)9rPP&-nAKP_ z+7DcrkVeiCEAEy1DBr>@0{kB0D!S2l+TK?W463r09JY4iC+g}}?;rFIz|!n|mQh{L z^I0RR$uTW54{NAncW2l0y**H=wOoDrMB2#YwL9s|_wSIleFG z;mfq^w17tlMt<2tSF`#|x<7oJ1aQap8rYyK{GAW^xE_94dHp0hN%(1Y{qG?cmbI(s zhdI>p9IkfBLMPU)7aVu%1tFoPm?RRH%wmWr3T_2e%-_I=a5*^RhGiI3O0Ov`Rr(@@ z=a%214wlX5DvyfiJ!$5-Rg=RoTK(Z4&~2>Hyxbi5l*uu%;mF>PYuH$*7BBfWG4rZc z&ipbA8vP#5MdIDvZasC1*%s1efhUkJVUr(A_iRI>K2L||BUj+sw&|bR!?HV_a%#_W zM?n~F`^Y6AAk!b|{-hF()#AMfZ+6tXs(6|*{p5&p;7|shRF(K`tk3kpjg4UzZT&9co_sn*L|{4}1^D5lvbQzP9tk zKLn>=k@gd_T#BUmW<9)lpX*Y>bLs03Mgmb$YK0EilU<%MD&be1fgIWJMYu|ffTi82 zVXtG|2yT*>H8^zT5%PNBeOyDa{A0Ey1#4VXx~wl}I)yVXOame=h|7{B?d%f%)Fiq_ zTbmxY9~V)1>@zFe{(FhTx8SmKz>yOHC+$j+zERshRd*ju?>ZVEVj+dih4^1KW z^~Z99tU;2WpoTH&fQ2jJ@#Y?{JfpFkfY(QV4_f|#?yg&KI@f^p(%xt*AYJwDVxy|H zV-58pFHv^$*kbcS%KyE#Dr@U}{rzi9?xWOeTHdDZgOv6cnJGkVY4U6zUxNisdZcco^ZGfRA+#oQ(F+8H|i@CXkGi<>mKH0T?-}n*nel^*7R^oRKR$ zS0MBz1@8cr4GJ>az_)?Wy8@_J&G#U1PRbymp$bl2a&&V+=U_ z=&~Ue-keq;MtYo?qrv?itvj#M0TDHJ3Z<^ih|wdVOwn2@*-i_}sK8>BLGQJ$e>M0U zh7x%;)IzaB%E_MMc|CH!$xeM6zj21TlqRyrk4_+C(orSJ7K^$H_$GNbkcj6oitp3C z2ylw{4++%4y64h2i0@irDp?2>#%0uJCg$kE4Hr!8%naoA@j7e-0=UO1F7)X^!P>_a z78lA$A!%1vmxlKbVJu&ow>It`c8|)o0zSmG1M#MiFwQz}y;DQ)79l%I8(%y9BnFfwtUQH}4S zk0~2+q#Y!|;)3(Y^cYe~1F2=15CXu1##6+N`3hMEspry8E4#i_3Ff7h?~#%pf7Lc) zgbl?U+7d*43QJ$elGov*V^(Dh1Y}C4L!4$jh{9Zyq-k(#(tP&fmWXx7LlYg9?AFIy zLQpF6X}n~v8!XQKMyzxu7k^Ff=v*BDmsh{+(~|Yz9uWVksPdWrLCBU~d?I=*ND$kc znSdFK1(^Mv0lQ8S*qQ!D7^rVP4lkx4FjFF=i?=x14An|%d@{dNM?gqX`m4(|cOg0I zi*wBYVc?r$=YqO>zB*zH;wY*@=Rx8`GNgBDc9p=HLcZSZ-NHe&Z z{;5X(1Nln=AAKzHFe#!-+TK8HA{>zXzSHB^`1+m}@YLhJ_4Z7z=KnTmQPU#7NukHB z_)`XOsSkEekra9*tVX8?N8nXg(|v=p81Qfs+<|WEYgfjJFsBTjD{PT+mONiVLc7McJY7rK)eJfz*OVaQSoH84QTDEBH&eX|%fN%PL^6p&fF-j~Hvs$xdwP$UDM7Ua zw;7{;zLg1oE(w3;fs2Y+S^e*h4{5iaW2#6d2Rw<0MAEt957FDr9E#U9zUS&97l;cA z$3STm?W3@g1lYQ;t$eat)KEJ9YTJq+sQ%RkncifI?+i>M(a z;oIR>NBA0rY;TU&p>t8A@o@~9q3*UN?88>)fQ`T+kn%j^;lG!eC%ZuoAf$c8q+M%K z%3-(8DCh2|J|+(N_?Q0Y=+t~z0*7?GI@x!pZyb;qaNBTY*d5T=LEN$ak?UaXP-yPw z;zJteQCh!f|sGIki@4MHJ>}P^nV*k`f>AfU{y@xYP1aVr9=DWcV%b0O=HT=u#xYg zT2ydf2?yYchD^_-qEs@0e;$QqPsKbs_Rsw4#SAP4V~Ws&$gV^QH)fLjP=a_QTqTV{PU}Lot8)cG;TcqDVpAlQ|6<7VU?O0Uah9R`B4!{x0y+S zimW#kzWLfG#4jPyOJs2)H_NsGK77p5<;4B^l>PR;%z45o$t3YvBRXvd1CJj@0z(Db z!;3=&taKg7WP~!=`jfWT^?|6REA}y5$%F(}ey#hyb z=|n`b64Ji@zhc86BVv1{L;+y%kI3_(?2{249BK0gmxNj0Qx?Cg%Y{FF*MI15-h) zzPSP9k9#{yTAw0L1bO69(2+9(bsFT5g04^kLlAXDc?so5g96V%e@{%1x0d!#GsF@m z0MBt6|KNeFRqNBNQ=bM}Q;MXSno(dRbTH2-76Z&L23XwK^2b*7|tyv~&!hD%N+ zQr0P;-TCzRbifnj-q`Y0hn90r^s+uosR$9!7|ryeS*P~Umr{$V+bvwGSTPQd<-r2$D5p2i~egs^#{N1H=p0{-sXE1Uf%zGtzC4v-{a)__vOC-$9wsVI(YB(Y`EV?d%xd! zc=DNccmbnjnkG@lh&Ht9O?J_mphwzC{v+GdNSHIZ6lVu77Af}10Np6|M^l-!l~uN$ zY3PcV1d?&c)*}m0a3PyA5Y1p40(9HEo1MO1rr2wX)s13*Or=w@(Gl=rzX{PsFL{Qc zQow{vnqGFf#%Rg2l#a}^hf>QBd!^D(46%Qp2jl(g-K!ft&hkcHIKO_t(7%XeKk=(R z>sWI{R=s@=tBS1we8`f~1WYEh)(kn4Uqp1S-WQq=iCYY{xEN}<;p~sEu7Ze^e0(?| zRrPt8yvwMfap+-~+)2t8k_`irYY}IFbCGASly~FVm&g%Fbnt$%L~St?!Y+4nv62W@ zwOseuOp?+xB!n{J?BK&9&t5I}#6M|i;p_{h2f*IB1UNO&b;JRj3$$2d;?j;*%y=jT5+~q z(DM#d`NRR^^vEIw@-+sp?vG8IBqd33nGBX{Y53vU&2H^QoV`}#4QF3ed57SW4IHMY zRdRP{AFNVrG=V^hPPusMrfx@yE%f<%=O#&9uJX;VzxvZdXq@{p&pMovO-PaO&?MzbLCZH~sU3lH(t4XWN2zK?kRV>eMZPOi2Zeb0D=HI_&O<>&9xOH{AT( zVvVdzYT|u(wBaIg8`k(#rJS^^XRT4*ww4@%RG+oXA8jm!8ZL&~&kVsg-24&L6)_|) z2-ApQkG8Yq1ilw3Br&lmwy4fhP4K|l{cJ4TB5hu&?naw0Q9b%3r9-muzyztgm>N|R zgEq#fKL-uhOoQTCE-;mH3^%XVd&AA2cx<^dtvU28mzzRM5|Zc;*kHG^lu(qVB%yXs zV?!htVmyYMSBBPxn=hw2YHOwB2#53lAdJx+nAET-ZElA44=ziWj5SAy@mTZp#Z`4kqDKQR70*t`OWCB;6<=3kzHG0F%1|9^Q@R%{jT8%f_d{O0-_dycGLzg01 zAE`z#T-4oBZCQwt&URG?4-c{6EIV9e%`1i9So25RxMNh<%y`(jV|T9gUQDE1t))v5HRHM97xrEYiG{aFH0VEeAJZ{4u2_ARQ2z4okeHfq)@Paps%} zLALXZE*qc%4vQZ!-^rJW@k*tim>B2wcX_4vvU1-)B{F{MmwndJ=1B5H1ez>2IJb)G z&FPCiii$Rv{R!I|19BNPdpmpHxEO7VuHbGPD|nHFQL+P{Fdk0Rc5*=4k}z7eQuGt) z6j(IT*_xY|J*CgGgGFk*Qr?XkUqWw=axVv%>OhplP+l~fUbXsbP3@UL^1?b|ZzEbu zGh>8BYP?$SjT&EdY($D`phsX2#Gx{=)2UNM$2}xWCdW~YqpA-l5%ZWmD_Eq)7nA*ZsquLtCy0^Q zyUCbqIPD~8rV{Be+UN{Lb$9MQ)m}yY`KGZ*jn`_tQR9m$4>ob+fD=$ebe5&aG`Z@d zz^Z51;$SmuXD_8F`MF2yA~#+s{l<+?k@?K&;wj4R?P+@A3oR!E6q$7bRN#<|EbC}G zkZmcq*7~d!eUTfll=-Q-@dxt?Z5RGx_wMB$3g5m~V+%E}C_Ss?=7%|d`R;G`dtVIs zcwc;|59D**-F=wtx7+{FcU>2t5AGRR9WUN#Ubt)d`co!u5NXh+ZtiU45UKynu%Km5~C&>{}YSIT+aO<&B zHzNS+oN6{&SQvKAI&yx*`N*MVlD)P>-AMLF-F2d3>}Vgn!Fvpjf;Zi1$%s8FTVx#r z)M+#wEH`J1=fK6S`T3az8(TmhWdAsDYzw_&mBLi^2@`q=CVPoBsN7)0UR#=~sTX?|X-?uM~1AU825 z0;WTbKn@~9Q|m{NL=d_)EOo2V=M@!v^|{Zg(j|($Uha)zUv+3XOQ3U*C)b|pVl37r zV~drfBnClg|>x_@+2 zI!gd($>q#eSt}h-&r{>WQ|M8kR9U`bPN0Q=6Oo-10}Ldy(iM8ju){p`!}uHWtY-}~M7`U zGU$HSKUa6>nqR;9|Nfug#+bpY5}U;Q8#!H}dJvd7)<=aNc^aL(irM zWIm7FCE$qkV1-u`pN2Zhra5j7W398s+a)HwHsCfU{n130tDihlqG|A$>kTVA<7*O? z^~7x+%^U6(yZ51uG9PWX1f|!?yp6W|jfB{lgOd~3;E5*tP~a%rgCwS;GctqSAKlSI zw=pIP6n*ZqMw&%Hx#&CXw%K+UkT;>;?+<+xBe@ z5m2sFcLS7{kQ<`x0^|-iv-gfeZD4Y5L(UuLu?Q&FYPYx-62Gucp{;&ur zS1SK20m}ON_P(3vQ%9WB|f>i$g{ksnX=(G^|-K=@`1AhF;x37RIo;UOmEa|b#Y3d=fjm7$?Uhs0Y zt9mg(XtEQa%LDwVVfLtMkt(hXj*TjQG?8OqD@pn^&(ygH7#o{bT9Fk%mj9gO3hNY^ zLB*CIO)Fl8iYry#PVzsyXmbgJBocl?P~P__OUy8C6q0p5I8z+Titjw5O`#+_)&aTb zH0-u%W0#PZtfvSL4#fk;Y9)&dQWiG7s1Z$R7St!cddV|Vt22JQNElbjyAj3<=#7v> zpUEMfv)r(rDCrpmTF@Ua^>-e`|EnOH^6w+k>$__l+*;KxinOL(2Z%88%|J{~l-wvMvRgHmVD$O|7wjl zz<62Zt#>{q;zPpFiqF*bpoB|Sok5%O9yYFPOh`5v^Nc7g62_I%KQ&?eIa<6Lrs&R` z2@t@ei!jXz&6T)0lFT3X=VD4UxwU8jIHx+Sg1r}yGsTr6UxF!q^Rj>c`QPKt?dtdS^>ohvgLmxx`@6T20rvf|efiNF zxvKBp$xrQG-MqV%f8l+8`}S6TuMpykU6%K~kyn+M&hMtv`)^;}++=y_-OcTHJN2P` z`&v)`@0+3|O7Hb!ym|ln-K)3qGvn^|=H30zVCd0**I$1l|FGXa#y#_f)Q&+(n$v;t z=gx$32bx^uokAxt850?w9roI6cJ5en=*s(X!?+)B)urHKWInKZgdCfX){Le#Qy*+{ zD$V%bWd9v0jXF1EUBtL6ReoZO`%oo6A;f*!7k%cD1|dO;Q;n8~>&Z7~Qem$y&wGTM zP0VpLJ92|EOX3z0?xOXt+a`EjKwgg=F(4eC2kEgx*BMQ z@i@U6>o2VBg?MPj-6s(t@p-ouR6AZ zrv&&gKvt=bR9j?Vcs;KYhoO*?X%?$zs8u`DA4j+=Lu*60ms1@HgG*EUU@Ajfin8Gn zKoU_|N=o*UC!`Lgv=Ng()*^Z_(XW=^x-$*D!G&ZgPUBoW`y!t^E4`JHG6NZ|i46`f zg-9E|%rX5U!d)x!hHx(`{f9${7Q?~*Q0{dbfx9W}SS_sBkmLv^7AGkKaUDlbv9FYV z^J4vocess_owIN_-_dim@)a<#Nk$k354ppGHMwQ#NPQ5`?(jv3yHe(-_G10~vw!^Z zfBb3p=YQJ$<5&Oo<=5Z*x39n2efg(<+GyvN6m}(|4&T7twP_<{&n~{nguCz*aym%Zou8f-vHh#R- zAtI+_{WRz+71#8bh;d-69svu6az@i_BIh{L;G<2WYpcf19`)m=c6f!q2XwW{OpEav`1Yl_0}K!?7|JCawGtnj+J^lxC}Pd)~LfGlgTzj z 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 literal 0 HcmV?d00001 diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts index d17b501e..96be4687 100644 --- a/packages/broadway/src/analysis/parseScriptToClap.ts +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -4,6 +4,7 @@ import { cleanUTF8Characters } from "@/utils" import { analyzeScreenplay } from "@/analysis/analyzeScreenplay" import { getScreenplayFromText } from "./getScreenplayFromText" +import { Scene } from "@/types" export type ParseScriptProgressUpdate = ({ value, @@ -52,6 +53,11 @@ export async function parseScriptToClap( durationInMs = s.endTimeInMs } }) + + let scenes: Scene[] = [] + screenplay.sequences.forEach(sequence => { + scenes = [...scenes, ...sequence.scenes] + }) // TODO: return a ClapProject instead const clap = newClap({ @@ -73,7 +79,7 @@ export async function parseScriptToClap( isLoop: false, isInteractive: false, }, - scenes: [], // TODO + scenes, entities: Object.values(entitiesById), segments, }) From 7d9cfd7d4c0d85ae29396aed0bd433a675cdc701 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 02:02:36 +0200 Subject: [PATCH 144/346] 0.0.25 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/ClapTimeline.tsx | 20 +-- .../src/components/cells/TextCell.tsx | 2 +- .../scroller/HorizontalScroller.tsx | 116 ++++++++++++++---- .../components/slider/HorizontalSlider.tsx | 6 +- .../components/slider/TimelineSliderBase.tsx | 6 +- .../src/components/timeline/Cells.tsx | 2 +- .../src/components/timeline/Timeline.tsx | 7 ++ .../src/compute/computeContentSizeMetrics.ts | 7 +- .../src/hooks/useSegmentLoader.ts | 89 +++++++------- .../src/hooks/useTimeScaleGraduations.ts | 4 +- .../aitube-timeline/src/hooks/useTimeline.ts | 19 ++- .../aitube-timeline/src/types/timeline.ts | 1 + packages/aitube-timeline/tailwind.config.js | 2 +- 14 files changed, 190 insertions(+), 93 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 257350ce..68d842fd 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.24", + "version": "0.0.25", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index 6d558cec..be033820 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -66,10 +66,14 @@ export function ClapTimeline({ return (

- + {({ height, width }: Size) => ( -
-
+
+
+ {showFPS && } - + +
+ { + // + }
- { - // - } -
)}
diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index f7f11a30..86450a2c 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -100,7 +100,7 @@ export function TextCell({ // {...divProps} // All HTMLDivElement props are valid >
{s.label || ""}
diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx index 2f762256..8fa81c3c 100644 --- a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -1,7 +1,13 @@ +import { useEffect, useState } from "react" + import { HorizontalSlider } from "@/components/slider" +import { leftBarTrackScaleWidth } from "@/constants/themes" import { useTimeline } from "@/hooks/useTimeline" +import { cn } from "@/utils" export function HorizontalScroller() { + const width = useTimeline(s => s.width) + const timelineCamera = useTimeline(s => s.timelineCamera) const timelineControls = useTimeline(s => s.timelineControls) @@ -10,40 +16,98 @@ export function HorizontalScroller() { const cellWidth = useTimeline((s) => s.cellWidth) const setHorizontalZoomLevel = useTimeline((s) => s.setHorizontalZoomLevel) + // we could display the cursor as an extra line, I guess + // but the real range is the actual view window + const cursorTimestampAtInMs = useTimeline(s => s.cursorTimestampAtInMs) + const totalDurationInMs = useTimeline(s => s.totalDurationInMs) + + const scrollX = useTimeline(s => s.scrollX) + const setScrollX = useTimeline(s => s.setScrollX) + const contentWidth = useTimeline(s => s.contentWidth) + + const [rangeStart, setRangeStart] = useState(0) + const [rangeEnd, setRangeEnd] = useState(10) + const [cursor, setCursor] = useState(0) + + useEffect(() => { + const cursorPosX = Math.min(cursorTimestampAtInMs, totalDurationInMs) + const cursorStartRatio = totalDurationInMs > 0 ? (cursorPosX / totalDurationInMs) : 0.0 + + const posX = scrollX + leftBarTrackScaleWidth + const rangeStartRatio = contentWidth > 0 ? (posX / contentWidth) : 0.0 + const rangeEndRatio = (posX + width) > 0 ? ((posX + width) / contentWidth) : 1.0 + + setCursor(Math.round(cursorStartRatio * width)) + setRangeStart(Math.round(rangeStartRatio * width)) + setRangeEnd(Math.round(rangeEndRatio * width)) + }, [ + // don't forget anything in here! all are important! + width, + cellWidth, + cursorTimestampAtInMs, + totalDurationInMs, + leftBarTrackScaleWidth, + contentWidth, + scrollX, + ]) + if (!timelineCamera || !timelineControls) { return null } const handleTimelinePositionChange = (newValue: number) => { - timelineCamera.position.setX(newValue) - timelineControls.target.setX(newValue) - + setRangeStart(newValue) + const scrollRatio = newValue / width + const newScrollX = scrollRatio * contentWidth + setScrollX(newScrollX) + timelineCamera.position.setX(newScrollX) + timelineControls.target.setX(newScrollX) } const handleZoomChange = (newZoom: number) => { setHorizontalZoomLevel(newZoom) } - // TODO: we want to control two things: - // on mouse click & drag, we want to move horizontally inside the timeline - // on mouse wheel (on hover), we want to adjust the horizontal time scale - - const range = [ - timelineCamera.position.x // start of the tracker - // end of the tracker - ] - + + // not sure if we need this, as it is easy to just move the sliding window + // then click on the timeline to set the cursor + const handleClickOnMiniCursor = (newValue: number) => { + // convert from the screen coordinates back to the camera position + // const newCursorPositionInMs = newValue * cellWidth * DEFAULT_DURATION_IN_MS_PER_STEP + } + return ( -
- handleTimelinePositionChange(newRange[0])} - onWheel={(e) => { - handleZoomChange(cellWidth + e.deltaY) - }} - /> -
+
+ { + handleTimelinePositionChange(newRange[0]) + }} + onWheel={(e) => { + // handleZoomChange(cellWidth + e.deltaY) + }} + /> +
+
) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx b/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx index 9f65b481..3a605d0c 100644 --- a/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx +++ b/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx @@ -10,9 +10,9 @@ const HorizontalSlider = React.forwardRef< >(({ className, ...props }, ref) => ( diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index a6063a95..2c4a81ce 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -45,7 +45,7 @@ export function Cells() { // cellHeight/2 is to also take into account the height of a cell // (baseCellHeight / 2) - (baseCellHeight / 2), contentHeight / 2, - -4 + -5 ]}> {loadedSegments.map((s) => }> s.contentHeight) const contentWidth = useTimeline(s => s.contentWidth) + /* + console.log(`Issue with size? `, { + "width (coming from parent app)": width, + "content width": contentWidth, + "WebGL context's size.width": size.width, + }) + */ // console.log(`re-rendering `) return ( { // to make it react to screen width change // however, this doesn't seem to work well - const { size: canvasSize, viewport } = useThree() - - // let's use the whole screen size for reference - // this will help us in case of fast canvas resize (eg. resize using the mouse) - const size = { width: typeof window !== "undefined" ? window.innerWidth : canvasSize.width } + // const { size: canvasSize, viewport } = useThree() const segments = useTimeline((s) => s.segments) const segmentsChanged = useTimeline((s) => s.segmentsChanged) @@ -50,15 +48,14 @@ export const useSegmentLoader = ({ // note: only the average height change will be detected const cellHeight = getCellHeight() - // TODO: maybe refactor this, put it inside the Zustand state - + // TODO: I think we don't need to check over the camera.zoom anymore, + // since we have set it fixed now useEffect(() => { useTimeline.setState({ currentZoomLevel: camera.zoom }) }, [camera]) const stateRef = useRef<{ - position: THREE.Vector3 - scale: THREE.Vector3 + scrollX: number initialized: boolean beforeTimeWithBufferInMs: number afterTimeWithBufferInMs: number @@ -66,8 +63,7 @@ export const useSegmentLoader = ({ afterTimeWithoutBufferInMs: number timeout: NodeJS.Timeout }>({ - position: new THREE.Vector3(), - scale: new THREE.Vector3(), + scrollX: 0, initialized: false, beforeTimeWithBufferInMs: 0, afterTimeWithBufferInMs: 0, @@ -77,13 +73,14 @@ export const useSegmentLoader = ({ }) const sync = async (forceRerendering?: boolean) => { - if (!stateRef.current) { return } - // TODO: replace our usage of stateRef.current // by useTimeline.getState() const state = stateRef.current - const cellWidth = useTimeline.getState().cellWidth + const timeline: TimelineStore = useTimeline.getState() + const { cellWidth, width, height } = timeline + + if (!state || !camera) { return } // we can adjust this threshold to only re compute the geometry // when a significant shift has been done by the user @@ -96,40 +93,44 @@ export const useSegmentLoader = ({ // which is why we are more sensitive here const epsilonZoomThreshold = 1 - const cameraDidntPaneALot = similar(state.position, camera.position, epsilonPaneThreshold) - const cameraDidntZoomALot = similar(state.scale, camera.scale, epsilonZoomThreshold) - - if (cameraDidntPaneALot && cameraDidntZoomALot && !forceRerendering) { return } + // we don't need to check X, Y, Z and zoom anymore here, we can just look at scrollX + const cameraDidntPaneALot = Math.abs(state.scrollX - camera.position.x) < epsilonPaneThreshold + + if (cameraDidntPaneALot && !forceRerendering) { return } - state.position.copy(camera.position) - state.scale.copy(camera.scale) + // we do this AFTER the return condition + state.scrollX = camera.position.x // determine, based on the current zoom level, and screen width, // how many horizontal cell columns could be visible at a time // // note that is only useful for *horizontal* scrolling // this doesn't prevent loading delay caused by zooming out - const maxPossibleNumberOfVisibleHorizontalCells = Math.ceil(size.width / cellWidth / camera.zoom) - - const cellWidthInPixelBasedOnZoom = size.width / maxPossibleNumberOfVisibleHorizontalCells - - // determine, based on the current camera position, - // what is the cell which is in the middle - - const vector = new THREE.Vector3(); - vector.project(camera); - - // distance between the begining of the timeline grid and the left side of the screen - const relativeX = - Math.round((0.5 + vector.x / 2) * (size.width / window.devicePixelRatio)) - const pixelX = relativeX * 2 - - // determine the minimum visible index - - const cellIndex = Math.max(0, pixelX / cellWidthInPixelBasedOnZoom) - + const maxPossibleNumberOfVisibleHorizontalCells = + Math.ceil(window.innerWidth / cellWidth) + + // it appears that we have an issue with the calculation here + // could be that we don't take everything into account, + // like the left margin? + + // note: currently the camera is not initialized well by default, + // due to the left bar track + // + // so, be careful: if you fix the camera initialization bug, + // then you *might* have to check in here too + const posX = camera.position.x + leftBarTrackScaleWidth + + const cellIndex = + Math.max(0, posX / cellWidth) + /* + console.log(`DEBUG:`, { + "camera.position.x": camera.position.x, + cellIndex, + }) + */ // we actually don't use the camera.zoom anymore, so.. - const securityMargin = + const securityMarginInCellStepCount = // this is useful for horizontal scroll only maxPossibleNumberOfVisibleHorizontalCells + @@ -139,14 +140,14 @@ export const useSegmentLoader = ({ // but if the camera is zoomed-in, then a quick scroll wheel could // send us asking for x2, x5 etc.. more cells instantly, so we need // to take that into account too. - (camera.zoom * 8) // 8 because 4 on left and 4 on right + 8 // 8 because 4 on left and 4 on right const { segments } = useTimeline.getState() // we only keep segments within a given range // those are not necessarily visible (there is a security margin) - const afterStepsWithBuffer = Math.floor(Math.max(0, cellIndex - securityMargin)) - const beforeStepsWithBuffer = Math.floor(cellIndex + maxPossibleNumberOfVisibleHorizontalCells + securityMargin) + const afterStepsWithBuffer = Math.max(0, cellIndex - securityMarginInCellStepCount) + const beforeStepsWithBuffer = Math.max(afterStepsWithBuffer, cellIndex + maxPossibleNumberOfVisibleHorizontalCells + securityMarginInCellStepCount) const afterTimeWithBufferInMs = afterStepsWithBuffer * DEFAULT_DURATION_IN_MS_PER_STEP const beforeTimeWithBufferInMs = beforeStepsWithBuffer * DEFAULT_DURATION_IN_MS_PER_STEP @@ -164,8 +165,8 @@ export const useSegmentLoader = ({ setLoadedSegments(loadedSegments) } - const afterStepsWithoutBuffer = Math.floor(Math.max(0, cellIndex)) - const beforeStepsWithoutBuffer = Math.floor(cellIndex + maxPossibleNumberOfVisibleHorizontalCells) + const afterStepsWithoutBuffer = Math.max(0, cellIndex) + const beforeStepsWithoutBuffer = Math.max(afterStepsWithoutBuffer, cellIndex + maxPossibleNumberOfVisibleHorizontalCells) const afterTimeWithoutBufferInMs = afterStepsWithoutBuffer * DEFAULT_DURATION_IN_MS_PER_STEP const beforeTimeWithoutBufferInMs = beforeStepsWithoutBuffer * DEFAULT_DURATION_IN_MS_PER_STEP diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts index 9b896690..e3c2ad0f 100644 --- a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts +++ b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts @@ -3,7 +3,9 @@ import * as THREE from "three" import { useTimeline } from "./useTimeline" -// note: those bug for loop just to render graduations might not be efficient +// note: those big for-loop just to render graduations are not efficient +// please open a PR if you have a better idea, thank you +// // maybe either we pre-compute everything and we let the runtime figure out what to render on screen, // or we implement our own code to do that.. I don't know export const useTimeScaleGraduations = ({ diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index b018a92d..eb205ae6 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -62,7 +62,7 @@ export const useTimeline = create((set, get) => ({ // let's trust developers for respecting this let totalDurationInMs = Math.max(0, clap.meta.durationInMs || 0) - + // TODO: this whole approach is a bit weak, // having an heuristic is okay but we should do it: // track by track @@ -177,8 +177,13 @@ export const useTimeline = create((set, get) => ({ tracks, cellWidth, defaultSegmentDurationInSteps, + totalDurationInMs, }) }) + + // one more thing: we need to call this, + // as this will trigger various stuff in the parent + get().jumpAt(0) }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { const { @@ -187,7 +192,8 @@ export const useTimeline = create((set, get) => ({ clap, tracks, defaultSegmentDurationInSteps, - cellWidth: previousCellWidth + cellWidth: previousCellWidth, + totalDurationInMs, } = get() const cellWidth = Math.min(maxHorizontalZoomLevel, Math.max(minHorizontalZoomLevel, newHorizontalZoomLevel)) @@ -205,6 +211,7 @@ export const useTimeline = create((set, get) => ({ tracks, cellWidth, defaultSegmentDurationInSteps, + totalDurationInMs, }) }) }, @@ -312,6 +319,10 @@ export const useTimeline = create((set, get) => ({ setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => { set({ leftBarTrackScale }) }, + // used when we move the full-length scroller + setScrollX: (scrollX: number) => { + set({ scrollX }) + }, handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number, deltaY: number }) => { const { scrollX, scrollY } = get() // TODO: compute the limits here, to avoid doing re-renderings for nothing @@ -326,6 +337,7 @@ export const useTimeline = create((set, get) => ({ tracks, cellWidth, defaultSegmentDurationInSteps, + totalDurationInMs, } = get() set({ @@ -337,7 +349,8 @@ export const useTimeline = create((set, get) => ({ : t )), cellWidth, - defaultSegmentDurationInSteps + defaultSegmentDurationInSteps, + totalDurationInMs, }) }) }, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 5b8b327b..7a03399e 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -169,6 +169,7 @@ export type TimelineStoreModifiers = { setTimelineControls: (timelineControls?: TimelineControlsImpl) => void setTopBarTimeScale: (topBarTimeScale?: THREE.Group) => void setLeftBarTrackScale: (leftBarTrackScale?: THREE.Group) => void + setScrollX: (scrollX: number) => void handleMouseWheel: ({ deltaX, deltaY }: { deltaX: number; deltaY: number }) => void toggleTrackVisibility: (trackId: number) => void setContainerSize: ({ width, height }: { width: number; height: number }) => void diff --git a/packages/aitube-timeline/tailwind.config.js b/packages/aitube-timeline/tailwind.config.js index 61a3a63f..13fb27d5 100644 --- a/packages/aitube-timeline/tailwind.config.js +++ b/packages/aitube-timeline/tailwind.config.js @@ -3,7 +3,7 @@ module.exports = { darkMode: ["class"], content: [ "./src/components/**/*.{ts,tsx}", - "./src/**/*.{ts,tsx}" + "./src/**/*.{ts,tsx}", ], theme: { container: { From c344a5114fc86b1d08ba9741692ca045b0b8bebd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 17:49:35 +0200 Subject: [PATCH 145/346] 0.0.27 --- packages/aitube-clap/package.json | 2 +- .../src/utils/filterSegmentsWithinRange.ts | 22 +++++-------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index b89df6d3..a9673d51 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.26", + "version": "0.0.27", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts b/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts index 3aa633ec..f1f319ef 100644 --- a/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts +++ b/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts @@ -5,7 +5,7 @@ import { ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode } from "@/ty * * - START: the start of a segment must be within the range * - END: the end of a segment must be within the range - * - ANY: any end of a segment must be within the range + * - ANY: any *PART* of a segment must be within the range * - BOTH: both ends of a segment must be within the range * * Note: this is a strict inclusion @@ -36,23 +36,13 @@ export function filterSegmentsWithinRange( return array.filter(s => (startTimeInMs < s.endTimeInMs && s.endTimeInMs <= endTimeInMs) && ((category && s?.category) ? s.category === category : true)) case ClapSegmentFilteringMode.BOTH: return array.filter(s => (startTimeInMs <= s.startTimeInMs && s.endTimeInMs <= endTimeInMs) && ((category && s?.category) ? s.category === category : true)) - - // less efficient version is: - // array.filter(s => - // (startTimeInMs <= s.startTimeInMs && s.startTimeInMs < endTimeInMs) - // && - // (startTimeInMs < s.endTimeInMs && s.endTimeInMs <= endTimeInMs) - // && - // ((category && s?.category) ? s.category === category : true) - // ) - case ClapSegmentFilteringMode.ANY: return array.filter(s => ( - (startTimeInMs <= s.startTimeInMs && s.startTimeInMs < endTimeInMs) - || - (startTimeInMs < s.endTimeInMs && s.endTimeInMs <= endTimeInMs) - ) && ((category && s?.category) ? s.category === category : true) - ) + // we keep if we ARE NOT out of bound + !(s.endTimeInMs <= startTimeInMs || s.startTimeInMs >= endTimeInMs) + + && ((category && s?.category) ? s.category === category : true) + )) default: throw new Error(`unknown ClapSegmentFilteringMode "${mode}"`) } From 101d6d35c7c3740a38b3bfecbe4b44f67bbda1de Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 17:51:27 +0200 Subject: [PATCH 146/346] 0.0.7 --- packages/aitube-colors/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 1b28f90a95c5d603ca40bc4aee058483a0bfac56..42b97a6147964eb2c7ff4aa6fc0a6b086d79f2be 100755 GIT binary patch delta 313 zcmV-90mlB+h5^)u0gx^rKF*et_;pxnZv#gecj@6jw%i9VH<8V73m%q8ULApku})SB zlVl1sv)Bp{0s#$^Q3EHF5DnM?8 z!Dh`8cf>N@<2J$)jLR=*vtpb9%?*sNlO;Y$k+uain@^Kt8|&G!SH?`UtsB?^KpXVx z7euTv0gJDQJ1cN@1g`T_Z*G}fg> zP3*zX0pf=^6tl%1AOS$$W88}Z^232-FpXT;N$#3gWeN7xxxZhmfsix=v`U4V=-lB_R3_0XMTCFslv$GPBG+Z~_4{vpqov L0RcC&MM4h&WQK_K delta 313 zcmV-90mlB+h5^)u0gx^r2>{fTIM|^eZYm~nAVkKQ5@&qaSYl&*#eF-pyYu8FB ziy>kAWB5(QhCoqgd6r=06rux}2@3JGfpXuoB_R3_0XDNBFslv$F|*7*Z~_4`vpqov L0Rc9%MM4h&ntX)C diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 651169d0..4d8df6f8 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.5", + "version": "0.0.7", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.26" + "@aitube/clap": "0.0.27" }, "repository": { "type": "git", From 3ed7eb9aa918eb04385b2dbea25f61d7621f3aba Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 17:52:36 +0200 Subject: [PATCH 147/346] 0.0.20 --- packages/aitube-engine/bun.lockb | Bin 17236 -> 17236 bytes packages/aitube-engine/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 0ea1e8a825e33aa85e01c74539b3a73ae872ec27..7ce1cc94e21e40bd63331548fde41b82f5a563ac 100755 GIT binary patch delta 313 zcmV-90mlB+h5^)u0gx^rKF*et_;pxnZv#gecj@6jw%i9VH<8V73m%q8ULApku})SB zlVl1sv)Bp{0s#$^Q3EHF5DnM?8 z!Dh`8cf>N@<2J$)jLR=*vtpb9%?*sNlO;Y$k+uain@^Kt8|&G!SH?`UtsB?^KpXVx z7euTv0gJDQJ1cN@1g`T_Z*G}fg> zP3*zX0pf=^6tl%1AOS$$W88}Z^232-FpXT;N$#3gWeN7xxxZhmfsix=v`U4V=-lB_R3_0XMTCFslv$GPBG+Z~_4{vpqov L0RcC&MM4h&WQK_K delta 313 zcmV-90mlB+h5^)u0gx^r2>{fTIM|^eZYm~nAVkKQ5@&qaSYl&*#eF-pyYu8FB ziy>kAWB5(QhCoqgd6r=06rux}2@3JGfpXuoB_R3_0XDNBFslv$F|*7*Z~_4`vpqov L0Rc9%MM4h&ntX)C diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index fb299c39..e952950c 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.19", + "version": "0.0.20", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.26" + "@aitube/clap": "0.0.27" }, "repository": { "type": "git", From fb5deb5f8debae32662f5d67c41d89f85bd60971 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 17:55:55 +0200 Subject: [PATCH 148/346] 0.0.26 --- packages/aitube-timeline/bun.lockb | Bin 159709 -> 159708 bytes packages/aitube-timeline/package.json | 4 +- .../src/hooks/useSegmentLoader.ts | 7 +- .../aitube-timeline/src/hooks/useTimeline.ts | 103 ++++++++++++++++++ .../aitube-timeline/src/types/timeline.ts | 20 +++- .../src/utils/getDefaultState.ts | 4 +- 6 files changed, 127 insertions(+), 11 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 3cde0a496d4fea7583afc9b85eb7545bf679b9bd..5a7f28eaff101820a912c2fea14ecca7fb3dd77c 100755 GIT binary patch delta 19518 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 diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 68d842fd..0b229d70 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.25", + "version": "0.0.26", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -31,7 +31,7 @@ "vite": "^5.2.13" }, "peerDependencies": { - "@aitube/clap": "0.0.26", + "@aitube/clap": "0.0.27", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 6752e590..017dc5af 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -122,12 +122,7 @@ export const useSegmentLoader = ({ const cellIndex = Math.max(0, posX / cellWidth) - /* - console.log(`DEBUG:`, { - "camera.position.x": camera.position.x, - cellIndex, - }) - */ + // we actually don't use the camera.zoom anymore, so.. const securityMarginInCellStepCount = diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index eb205ae6..add65a46 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -98,6 +98,8 @@ export const useTimeline = create((set, get) => ({ for (const s of segments) { + // TODO: move this idCollision detector into the state, + // so that we can use it later? if (idCollisionDetector.has(s.id)) { console.log(`collision detected! there is already a segment with id ${s.id}`) continue @@ -160,6 +162,8 @@ export const useTimeline = create((set, get) => ({ const isEmpty = segments.length === 0 + clap.meta.durationInMs = totalDurationInMs + set({ clap, segments, @@ -452,6 +456,105 @@ export const useTimeline = create((set, get) => ({ if (!segmentResolver) { return segment } return segmentResolver(segment) }, + addSegments: async ({ + segments = [], + startTimeInMs, + track + }: { + segments?: ClapSegment[] + startTimeInMs?: number + track?: number + }): Promise => { + if (segments?.length) { + const { addSegment } = get() + Promise.allSettled(segments.map(segment => addSegment({ + segment, + startTimeInMs, + track, + }))) + } + }, + addSegment: async ({ + segment, + startTimeInMs, + track: requestedTrack + }: { + segment: ClapSegment + startTimeInMs?: number + track?: number + }): Promise => { + // adding a segment is a bit complicated, lot of stuff might have to be updated + const { + clap, + findFreeTrack, + cellWidth, + tracks, + segments: previousSegments, + segmentsChanged: previousSegmentsChanged, + totalDurationInMs: previousTotalDurationInMs, + defaultSegmentDurationInSteps, + defaultPreviewHeight, + defaultCellHeight, + } = get() + + // note: the requestedTrack might not be empty + + // for now let's do something simple: to always search for an available track + const availableTrack = findFreeTrack({ startTimeInMs }) + + segment.track = availableTrack + + // add the track if it is missing + if (!tracks[segment.track]) { + const isPreview = + segment.category === ClapSegmentCategory.STORYBOARD || + segment.category === ClapSegmentCategory.VIDEO + + tracks[segment.track] = { + id: segment.track, + // name: `Track ${s.track}`, + name: `${segment.category}`, + isPreview, + height: + isPreview + ? defaultPreviewHeight + : defaultCellHeight, + hue: 0, + occupied: true, + visible: true, + } + } + + // we assume that the provided segment is valid, with a unique UUID + + // then we need to update everything + + const segments = previousSegments.concat(segment) + + const segmentsChanged = previousSegmentsChanged + 1 + + const totalDurationInMs = + segment.endTimeInMs > previousTotalDurationInMs + ? segment.endTimeInMs + : previousTotalDurationInMs + + clap.meta.durationInMs = totalDurationInMs + clap.segments = segments + + set({ + clap, + segments, + segmentsChanged, + totalDurationInMs, + ...computeContentSizeMetrics({ + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + totalDurationInMs, + }) + }) + }, findFreeTrack: ({ startTimeInMs, endTimeInMs diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 7a03399e..ff212688 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -37,7 +37,7 @@ export type ContentSizeMetrics = { export type TimelineStoreProjectState = { - clap?: ClapProject + clap: ClapProject segments: ClapSegment[] segmentsChanged: number @@ -196,6 +196,24 @@ export type TimelineStoreModifiers = { }) => Promise setSegmentResolver: (segmentResolver: SegmentResolver) => void resolveSegment: (segment: ClapSegment) => Promise + addSegments: ({ + segments, + startTimeInMs, + track, + }: { + segments?: ClapSegment[] + startTimeInMs?: number + track?: number + }) => Promise + addSegment: ({ + segment, + startTimeInMs, + track, + }: { + segment: ClapSegment + startTimeInMs?: number + track?: number +}) => Promise findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number } diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 3ef1e06a..d9fa28ad 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -2,13 +2,13 @@ import * as THREE from "three" import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { TimelineStorePreferencesState, TimelineStoreProjectState, TimelineStoreState } from "@/types/timeline" -import { RenderingStrategy } from "@/types" import { NB_MAX_SHOTS } from "@/constants/grid" +import { newClap } from "@aitube/clap" // those settings will change between .clap project reloads export function getDefaultProjectState(): TimelineStoreProjectState { return { - clap: undefined, + clap: newClap(), segments: [], segmentsChanged: 0, totalDurationInMs: 0, From ced84cbb49ac5cf44e74501cc6efca09d19dc651 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 17:57:59 +0200 Subject: [PATCH 149/346] 0.0.16 --- packages/broadway/bun.lockb | Bin 32802 -> 32802 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 02ea97e5e39baa788906ef770ebe498a94cae0fe..36a3ef3422e67a8c90be3666d7bd64a1440309d2 100755 GIT binary patch delta 464 zcmV;>0WbcdfC8d`0+22sF2k|wY=&ASSK8<;F#(IOh&wBAb_A~htnmQUN`f~GS#Km=kCQmJo-@A;nyU0k zIc@lo`=4|zc5*w zAXhn1mbg4m9Z@*P3>0?)x7R)B1`I-^%0RR920R9jD0RR9~ z000000000000004-ecU00`kLwWH60f*h%i1S7izI)w#oyO-662%$ZiRRD5zTk1tFa zCkkNan!>C^cdggSrQ3&)t!BDTXsivK(X%~08XOuo000~S000gE0Dx06Po0B>M1T+h zFfK4IH?whBLJ9&m0F#Sf8?(@3NDKiovl(!30s%9#igJ<+lM!ejl79)4MSl>J5ojQj Gb$_j&_`*E^ delta 467 zcmV;^0WAKafC8d`0+22sK1a&Db5!60BygeyOTzrc_>bGJHysOtrMo6~cv!-zu};(hsV{3CC*cv?r4y|fT^I{B?)svKB~S-;;d>J!B6U&T07(T zHE>4BDI&9NE!YA;41+cc+JX=)A#zV=F2I9%JN@HzW*ESv!F|e>IO(kY8>7-72f0+i-yz}j>+A;EarG#4ef(<@X~e-9(^egu9E=(009905B>oF z08;<}000000000000iv9GYuwUO*~^M=!G_Gl)m+1C0!u$1S$J#iE7_{2{46g*Gedh zAsJ!&WB5(QhCoqgd6r=06rux}2@3JGfpXuoJv|y68a4m`8~^|S4gdgvQ!-DTgM~zZ z5CJeQFfKK-aalqN0yY4Xi(ebF&|^pp0Wq@~aBu Date: Sun, 16 Jun 2024 18:02:01 +0200 Subject: [PATCH 150/346] 0.0.36 --- packages/aitube-client/bun.lockb | Bin 18708 -> 18708 bytes packages/aitube-client/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 9c09b0a2d4f54fd42614d62f5aeed2158680c6b5..7714e9af2c4af6061fc26e64103fd0422ffe1c26 100755 GIT binary patch delta 313 zcmV-90mlB6k^z*G0gx^rSc& z!Dh`8cf>N@<2J$)jLR=*vtpb9%?*sNlO;Y$k+uain@^Kt8|&G!SH?`UjULznKpXVx z7euTv0gJDQJ1cN@1g`T_Z*G}fg> zP3*zX0pf=^6tkrvAOS$$W88}Z^232-FpXT;N$#3gWeN7xxxZhmfsix=v`U4V=-l1tTgE0XMTSG+Ph>GP8_CZ~_4{v;9T~ L0RcC&1xOD8GYg90 delta 313 zcmV-90mlB6k^z*G0gx^rVfmifWkHN}gIl4&x*R(kh$Ek~(6MYb9*g8a@4~uFu}+o? zlcWtavlt8z0s#z@kpm}_P!8Au8k3O&C$mrw{SH7(!h=$BEqkWlZ<*G=wSRGeZYm~nAVkKQ5@&qaSYl&*#eF-pyYu8FB ziy>kAWB5(QhCoqgd6r=06rux}2@3JGfpXuo1tTgE0XDNRG+Ph>F|&+BZ~_4`v;9T~ L0Rc9%1xOD8Sn7qK diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 9c87e41d..10d48e5e 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.35", + "version": "0.0.36", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.26" + "@aitube/clap": "0.0.27" }, "repository": { "type": "git", From 558514023ef16a5910d0fe6b7fc99f6a20fb6d3a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 16 Jun 2024 18:13:26 +0200 Subject: [PATCH 151/346] 0.0.21 --- packages/aitube-engine/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index e952950c..17097682 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.20", + "version": "0.0.21", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", From ade5fba2ff3435df9d519f0d2e9af1f47e27cdd9 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 17 Jun 2024 01:13:12 +0200 Subject: [PATCH 152/346] 0.0.22 --- packages/aitube-engine/package.json | 2 +- .../src/prompts/getCharacterPrompt.ts | 28 ++++++------------- .../src/prompts/getVideoPrompt.ts | 26 ++++++++++------- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 17097682..0ddbe556 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.21", + "version": "0.0.22", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", diff --git a/packages/aitube-engine/src/prompts/getCharacterPrompt.ts b/packages/aitube-engine/src/prompts/getCharacterPrompt.ts index 306c89d8..2b59e25a 100644 --- a/packages/aitube-engine/src/prompts/getCharacterPrompt.ts +++ b/packages/aitube-engine/src/prompts/getCharacterPrompt.ts @@ -1,26 +1,14 @@ import { ClapEntity } from "@aitube/clap" export function getCharacterPrompt(entity: ClapEntity): string { + const characterPrompt = [ + entity.age ? `${entity.age}yo` : '', // 34yo + entity.region ? `${entity.region}` : '', // american + entity.gender !== "object" ? entity.gender : 'person', // woman + entity.label ? `named ${entity.label}` : '', // Jessica + entity.appearance ? `${entity.appearance}` : 'speaking', // blond hair + entity.description ? `${entity.description}` : '', // blond hair + ].map(i => i.trim()).filter(i => i).join(" ").trim() - let characterPrompt = "" - if (entity.description) { - characterPrompt = [ - // the label (character name) can help making the prompt more unique - // this might backfires however, if the name is - // something like "SUN", "SILVER" etc - // I'm not sure stable diffusion really needs this, - // so let's skip it for now (might still be useful for locations, though) - // we also want to avoid triggering "famous people" (BARBOSSA etc) - // entity.label, - - entity.description - ].join(", ") - } else { - characterPrompt = [ - entity.gender !== "object" ? entity.gender : "", - entity.age ? `aged ${entity.age}yo` : '', - entity.label ? `named ${entity.label}` : '', - ].map(i => i.trim()).filter(i => i).join(", ") - } return characterPrompt } \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index 23c5093c..1c056c41 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -20,6 +20,7 @@ export function getVideoPrompt( // console.log("entitiesIndex:", entitiesIndex) + // to construct the video we need to collect all the segments describing it // we ignore unrelated categories (music, dialogue) or non-prompt items (eg. an audio sample) const tmp = segments @@ -34,6 +35,7 @@ export function getVideoPrompt( category === ClapSegmentCategory.LOCATION || category === ClapSegmentCategory.TIME || category === ClapSegmentCategory.ERA || // <- @deprecated + category === ClapSegmentCategory.DIALOGUE || category === ClapSegmentCategory.LIGHTING || category === ClapSegmentCategory.WEATHER || category === ClapSegmentCategory.ACTION || @@ -54,28 +56,32 @@ export function getVideoPrompt( return priority2 - priority1 }) + // to prevent re-injecting the same entity multiple times in the same video prompt + const alreadyUsedEntities: Record = {} + let videoPrompt = tmp.map(segment => { - const entity: ClapEntity | undefined = entitiesIndex[segment?.entityId || ""] || undefined + const entityId = segment?.entityId || "" + const entity: ClapEntity | undefined = entitiesIndex[entityId] || undefined + if (alreadyUsedEntities[entityId]) { return "" } + + alreadyUsedEntities[entityId] = true + if (segment.category === ClapSegmentCategory.DIALOGUE) { // if we can't find the entity, then we are unable // to make any assumption about the gender, age or appearance if (!entity) { // console.log("ERROR: this is a dialogue, but couldn't find the entity!") - return `portrait of a person speaking, blurry background, bokeh` + return `portrait of a person speaking, bokeh` } - const characterTrigger = entity?.triggerName || "" - const characterLabel = entity?.label || "" - const characterDescription = entity?.description || "" - const dialogueLine = segment?.prompt || "" - + const characterPrompt = getCharacterPrompt(entity) // in the context of a video, we some something additional: // we create a "bokeh" style - return `portrait of a person speaking, blurry background, bokeh, ${characterPrompt}` + return `portrait of a ${characterPrompt}, bokeh` } else if (segment.category === ClapSegmentCategory.LOCATION) { @@ -89,11 +95,11 @@ export function getVideoPrompt( } else { return segment.prompt } - }).filter(x => x) + }).map(x => x.trim()).filter(x => x) videoPrompt = videoPrompt.concat([ ...extraPositivePrompt ]) - return deduplicatePrompt(videoPrompt.join(", ")) + return deduplicatePrompt(videoPrompt.join(", ").trim()) } \ No newline at end of file From 0d43438351a8dc54d6993fa22d7e409096e04313 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 17 Jun 2024 01:31:45 +0200 Subject: [PATCH 153/346] 0.0.23 --- packages/aitube-engine/README.md | 1 + packages/aitube-engine/package.json | 2 +- packages/aitube-engine/src/index.ts | 1 + .../aitube-engine/src/prompts/getCharacterPrompt.ts | 2 +- packages/aitube-engine/src/prompts/getVideoPrompt.ts | 10 +++++----- packages/aitube-engine/src/prompts/index.ts | 1 + packages/aitube-engine/src/prompts/priorities.ts | 8 +++++--- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/aitube-engine/README.md b/packages/aitube-engine/README.md index b4537de8..ce69f8cf 100644 --- a/packages/aitube-engine/README.md +++ b/packages/aitube-engine/README.md @@ -31,6 +31,7 @@ import { deduplicatePrompt, renderShotToStoryboard, renderShotToVideo, + segmentCategoryPromptPriority, type VideoRenderer, type StoryboardRenderer, type VideoFirstFrameExtractor diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 0ddbe556..308c4504 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.22", + "version": "0.0.23", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", diff --git a/packages/aitube-engine/src/index.ts b/packages/aitube-engine/src/index.ts index dc8ee39c..93b5f2e7 100644 --- a/packages/aitube-engine/src/index.ts +++ b/packages/aitube-engine/src/index.ts @@ -10,6 +10,7 @@ export { getSpeechBackgroundAudioPrompt, getSpeechForegroundAudioPrompt, getVideoPrompt, + segmentCategoryPromptPriority, } from './prompts' export { diff --git a/packages/aitube-engine/src/prompts/getCharacterPrompt.ts b/packages/aitube-engine/src/prompts/getCharacterPrompt.ts index 2b59e25a..38a73100 100644 --- a/packages/aitube-engine/src/prompts/getCharacterPrompt.ts +++ b/packages/aitube-engine/src/prompts/getCharacterPrompt.ts @@ -7,7 +7,7 @@ export function getCharacterPrompt(entity: ClapEntity): string { entity.gender !== "object" ? entity.gender : 'person', // woman entity.label ? `named ${entity.label}` : '', // Jessica entity.appearance ? `${entity.appearance}` : 'speaking', // blond hair - entity.description ? `${entity.description}` : '', // blond hair + // entity.description ? `${entity.description}` : '', // blond hair ].map(i => i.trim()).filter(i => i).join(" ").trim() return characterPrompt diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index 1c056c41..bd39c0e1 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -3,7 +3,7 @@ import { ClapEntity, ClapOutputType, ClapSegment, ClapSegmentCategory } from "@a import { deduplicatePrompt } from "@/utils/deduplicatePrompt" import { getCharacterPrompt } from "@/prompts/getCharacterPrompt" -import { SegmentCategoryPromptPriority } from "./priorities" +import { segmentCategoryPromptPriority } from "./priorities" /** * Construct a video prompt from a list of active segments @@ -50,8 +50,8 @@ export function getVideoPrompt( // this step is *SUPER* important, it determines the order of the prompt! tmp.sort((segment1, segment2) => { - const priority1 = SegmentCategoryPromptPriority[segment1.category || SegmentCategoryPromptPriority.generic] || 0 - const priority2 = SegmentCategoryPromptPriority[segment2.category || SegmentCategoryPromptPriority.generic] || 0 + const priority1 = segmentCategoryPromptPriority[segment1.category || segmentCategoryPromptPriority.generic] || 0 + const priority2 = segmentCategoryPromptPriority[segment2.category || segmentCategoryPromptPriority.generic] || 0 return priority2 - priority1 }) @@ -73,7 +73,7 @@ export function getVideoPrompt( // to make any assumption about the gender, age or appearance if (!entity) { // console.log("ERROR: this is a dialogue, but couldn't find the entity!") - return `portrait of a person speaking, bokeh` + return `photo portrait of a person speaking, bokeh` } @@ -81,7 +81,7 @@ export function getVideoPrompt( // in the context of a video, we some something additional: // we create a "bokeh" style - return `portrait of a ${characterPrompt}, bokeh` + return `photo portrait of a ${characterPrompt}, bokeh` } else if (segment.category === ClapSegmentCategory.LOCATION) { diff --git a/packages/aitube-engine/src/prompts/index.ts b/packages/aitube-engine/src/prompts/index.ts index a35c3549..b8764e15 100644 --- a/packages/aitube-engine/src/prompts/index.ts +++ b/packages/aitube-engine/src/prompts/index.ts @@ -4,3 +4,4 @@ export { getPositivePrompt } from "./getPositivePrompt" export { getSpeechBackgroundAudioPrompt } from "./getSpeechBackgroundAudioPrompt" export { getSpeechForegroundAudioPrompt } from "./getSpeechForegroundAudioPrompt" export { getVideoPrompt } from "./getVideoPrompt" +export { segmentCategoryPromptPriority } from "./priorities" \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/priorities.ts b/packages/aitube-engine/src/prompts/priorities.ts index 59479fb2..ffe226f3 100644 --- a/packages/aitube-engine/src/prompts/priorities.ts +++ b/packages/aitube-engine/src/prompts/priorities.ts @@ -1,10 +1,12 @@ import { ClapSegmentCategory } from "@aitube/clap" -export const SegmentCategoryPromptPriority: Partial> = { +export const segmentCategoryPromptPriority: Partial> = { // maybe we should also a priority for the video, // if it has a prompt.. no? - [ClapSegmentCategory.STORYBOARD]: 11, - [ClapSegmentCategory.CAMERA]: 10, + [ClapSegmentCategory.VIDEO]: 13, + [ClapSegmentCategory.STORYBOARD]: 12, + [ClapSegmentCategory.CAMERA]: 11, + [ClapSegmentCategory.DIALOGUE]: 10, [ClapSegmentCategory.CHARACTER]: 9, [ClapSegmentCategory.LOCATION]: 8, [ClapSegmentCategory.ACTION]: 7, From a62653af1a4f71b714b864d7fb7479f7028b4664 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 17 Jun 2024 01:49:55 +0200 Subject: [PATCH 154/346] 0.0.24 --- packages/aitube-engine/package.json | 2 +- packages/aitube-engine/src/prompts/getVideoPrompt.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 308c4504..17240804 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.23", + "version": "0.0.24", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index bd39c0e1..aa4f3640 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -63,7 +63,7 @@ export function getVideoPrompt( const entityId = segment?.entityId || "" const entity: ClapEntity | undefined = entitiesIndex[entityId] || undefined - if (alreadyUsedEntities[entityId]) { return "" } + if (entityId && entity && alreadyUsedEntities[entityId]) { return "" } alreadyUsedEntities[entityId] = true From 3d2fbd04d736a14902dbbcd3f6184660657042bd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 17 Jun 2024 17:43:30 +0200 Subject: [PATCH 155/346] 0.0.27 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/constants/index.ts | 6 +++- .../src/constants/priorities.ts | 19 +++++++++++ .../aitube-timeline/src/hooks/useTimeline.ts | 16 ++++++++-- packages/aitube-timeline/src/index.tsx | 6 +++- packages/aitube-timeline/src/types/index.ts | 3 ++ .../aitube-timeline/src/types/timeline.ts | 29 +++++++++++++++++ .../src/utils/getAudioBuffer.ts | 15 +++++++++ packages/aitube-timeline/src/utils/index.ts | 2 ++ .../src/utils/readFileAsArrayBuffer.ts | 32 +++++++++++++++++++ 10 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 packages/aitube-timeline/src/constants/priorities.ts create mode 100644 packages/aitube-timeline/src/utils/getAudioBuffer.ts create mode 100644 packages/aitube-timeline/src/utils/readFileAsArrayBuffer.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 0b229d70..06517f80 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.26", + "version": "0.0.27", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/constants/index.ts b/packages/aitube-timeline/src/constants/index.ts index 59b70a36..7289270b 100644 --- a/packages/aitube-timeline/src/constants/index.ts +++ b/packages/aitube-timeline/src/constants/index.ts @@ -7,8 +7,12 @@ export { NB_MAX_SHOTS } from "./grid" +export { + segmentVisibilityPriority +} from "./priorities" + export { baseClapSegmentCategoryHues, pastel, DEFAULT_THEMES -} from "./themes" \ No newline at end of file +} from "./themes" diff --git a/packages/aitube-timeline/src/constants/priorities.ts b/packages/aitube-timeline/src/constants/priorities.ts new file mode 100644 index 00000000..f9f549ff --- /dev/null +++ b/packages/aitube-timeline/src/constants/priorities.ts @@ -0,0 +1,19 @@ +import { SegmentVisibility } from "@/types" + +// used for sort +export const segmentVisibilityPriority: Record = { + // the segment is visible, and the user explicitly requested to render it before the others + [SegmentVisibility.DEMANDED]: 3, + + // TODO: add some implicit intermediary priority options + // such as SELECTED, HOVERED.. + + // the segment (or at least a portion of it) is currently visible in the sliding window + [SegmentVisibility.VISIBLE]: 2, + + // the segment is hidden, but not too far from the sliding window + [SegmentVisibility.BUFFERED]: 1, + + // fully hidden, far from the sliding window + [SegmentVisibility.HIDDEN]: 0 +} diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index add65a46..1f000b20 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -1,8 +1,8 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapEntity, ClapProject, ClapSegment, ClapSegmentCategory, newClap, serializeClap } from "@aitube/clap" +import { ClapOutputType, ClapProject, ClapSegment, ClapSegmentCategory, newClap, serializeClap } from "@aitube/clap" -import { TimelineStore, Tracks } from "@/types/timeline" +import { RuntimeSegment, TimelineStore, Tracks } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideos" @@ -14,6 +14,7 @@ import { getFinalVideo } from "@/utils/getFinalVideo" import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" import { findFreeTrack } from "@/utils/findFreeTrack" +import { getAudioBuffer } from "@/utils" export const useTimeline = create((set, get) => ({ ...getDefaultState(), @@ -142,6 +143,17 @@ export const useTimeline = create((set, get) => ({ } } + + if (s.outputType === ClapOutputType.AUDIO) { + const rs = s as RuntimeSegment + if (rs.outputType === ClapOutputType.AUDIO) { + try { + rs.audioBuffer = await getAudioBuffer(rs.assetUrl) + } catch (err) { + console.error(`failed to load the audio file: ${err}`) + } + } + } } for (let id = 0; id < tracks.length; id++) { diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index ab6ff55d..ab32afc7 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -42,6 +42,7 @@ export { debounceSync, findFreeTrack, formatTimestamp, + getAudioBuffer, getDefaultState, getFinalVideo, getWebGLCharWidth, @@ -50,6 +51,7 @@ export { clampWebGLTextNaive, hslToHex, parseRenderingStrategy, + readFileAsArrayBuffer, removeFinalVideos, similar, sleep, @@ -60,6 +62,9 @@ export { export { Track, Tracks, + SegmentVisibility, + BrowserOnlySegmentData, + RuntimeSegment, ContentSizeMetrics, RenderedCell, TimelineStore, @@ -72,6 +77,5 @@ export { type SegmentResolver, } from "./types" - export { ClapTimeline } from "./ClapTimeline" diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index 000fd492..f0daaa07 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -6,6 +6,9 @@ export { export { Track, Tracks, + SegmentVisibility, + BrowserOnlySegmentData, + RuntimeSegment, ContentSizeMetrics, TimelineStore, TimelineStoreState, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index ff212688..44366de1 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -19,6 +19,35 @@ export type Track = { export type Tracks = Track[] + +export enum SegmentVisibility { + // the segment is visible, and the user explicitly requested to render it before the others + DEMANDED = "DEMANDED", + + // TODO: add some implicit intermediary priority options + // such as SELECTED, HOVERED.. + + // the segment (or at least a portion of it) is currently visible in the sliding window + VISIBLE = "VISIBLE", + + // the segment is hidden, but not too far from the sliding window + BUFFERED = "BUFFERED", + + // fully hidden, far from the sliding window + HIDDEN = "HIDDEN" +} + +// some data can only exist inside a browser session (eg. AudioBuffer) +// or at least data that only make sense on client side +// we could put things like a mouse hover or selected state in here +export type BrowserOnlySegmentData = { + audioBuffer?: AudioBuffer + + visibility?: SegmentVisibility +} + +export type RuntimeSegment = ClapSegment & BrowserOnlySegmentData + export type ContentSizeMetrics = { nbMaxShots: number nbMaxTracks: number diff --git a/packages/aitube-timeline/src/utils/getAudioBuffer.ts b/packages/aitube-timeline/src/utils/getAudioBuffer.ts new file mode 100644 index 00000000..f155bc3d --- /dev/null +++ b/packages/aitube-timeline/src/utils/getAudioBuffer.ts @@ -0,0 +1,15 @@ +import { readFileAsArrayBuffer } from "./readFileAsArrayBuffer" + +export async function getAudioBuffer(input: File | string): Promise { + const audioContext = new AudioContext() // initialize AudioContext + const arrayBuffer = await readFileAsArrayBuffer(input) + + // decode audio data from your arrayBuffer + return new Promise((resolve, reject) => { + audioContext.decodeAudioData(arrayBuffer, (buffer) => { + resolve(buffer) + }, (err) => { + reject(err) + }) + }) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts index 86ae4839..0821aecd 100644 --- a/packages/aitube-timeline/src/utils/index.ts +++ b/packages/aitube-timeline/src/utils/index.ts @@ -4,6 +4,7 @@ export { debounceAsync } from "./debounceAsync" export { debounceSync } from "./debounceSync" export { findFreeTrack } from "./findFreeTrack" export { formatTimestamp } from "./formatTimestamp" +export { getAudioBuffer } from "./getAudioBuffer" export { getDefaultState } from "./getDefaultState" export { getFinalVideo } from "./getFinalVideo" export { @@ -14,6 +15,7 @@ export { } from "./getTextLength" export { hslToHex } from "./hslToHex" export { parseRenderingStrategy } from "./parseRenderingStrategy" +export { readFileAsArrayBuffer } from "./readFileAsArrayBuffer" export { removeFinalVideos } from "./removeFinalVideos" export { similar } from "./similar" export { sleep } from "./sleep" diff --git a/packages/aitube-timeline/src/utils/readFileAsArrayBuffer.ts b/packages/aitube-timeline/src/utils/readFileAsArrayBuffer.ts new file mode 100644 index 00000000..a2ab5066 --- /dev/null +++ b/packages/aitube-timeline/src/utils/readFileAsArrayBuffer.ts @@ -0,0 +1,32 @@ +export async function readFileAsArrayBuffer(input: File | string): Promise { + return new Promise((resolve, reject) => { + if (typeof input === 'string') { + // check if it is base64 or not + if (/^data:.+;base64,/.test(input)) { + const base64 = input.split(",")[1]; + const binary = window.atob(base64); + const buffer = new ArrayBuffer(binary.length); + const view = new Uint8Array(buffer); + for (let i = 0; i < binary.length; i++) { + view[i] = binary.charCodeAt(i); + } + resolve(buffer); + return; + } else { + reject('Invalid input string'); + return; + } + } + + let reader = new FileReader(); + reader.onload = () => { + // when the reader has loaded, resolve the Promise with the result + resolve(reader.result as ArrayBuffer); + }; + reader.onerror = (error) => { + // if there's an error, reject the Promise with the error + reject(error); + }; + reader.readAsArrayBuffer(input as File); + }); +} From be78af93202528b3820c742248bf3f146fd2c695 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 17 Jun 2024 19:06:29 +0200 Subject: [PATCH 156/346] 0.0.28 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useTimeline.ts | 113 +++++++++++++++++- .../aitube-timeline/src/types/timeline.ts | 4 +- 3 files changed, 114 insertions(+), 5 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 06517f80..cad5cfc4 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.27", + "version": "0.0.28", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 1f000b20..b962d971 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -1,6 +1,6 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapOutputType, ClapProject, ClapSegment, ClapSegmentCategory, newClap, serializeClap } from "@aitube/clap" +import { ClapOutputType, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, isValidNumber, newClap, serializeClap } from "@aitube/clap" import { RuntimeSegment, TimelineStore, Tracks } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" @@ -464,9 +464,31 @@ export const useTimeline = create((set, get) => ({ set({ segmentResolver }) }, resolveSegment: async (segment: ClapSegment): Promise => { - const { segmentResolver } = get() + const { segmentResolver, fitSegmentToAssetDuration } = get() if (!segmentResolver) { return segment } - return segmentResolver(segment) + + segment = await segmentResolver(segment) + + // after a segment has ben resolved, it is possible that the size + // of its asset changed (eg. a dialogue line longer than the segment's length) + // + // there are multiple ways to solve this, one approach could be to + // just add some more B-roll (more shots) + // + // or we can also extend it, which is the current simple solution + // + // for the other categories, such as MUSIC or SOUND, + // we assume it is okay if they are too short or too long, + // and that we can crop them etc + // + // note that video clips are also concerned: we want them to perfectly fit + if (segment.category === ClapSegmentCategory.DIALOGUE) { + await fitSegmentToAssetDuration(segment) + } else if (segment.category === ClapSegmentCategory.VIDEO) { + await fitSegmentToAssetDuration(segment) + } + + return segment }, addSegments: async ({ segments = [], @@ -577,4 +599,89 @@ export const useTimeline = create((set, get) => ({ const { segments } = get() return findFreeTrack({ segments, startTimeInMs, endTimeInMs }) }, + + fitSegmentToAssetDuration: async (segment: ClapSegment, requestedDurationInMs?: number): Promise => { + + const durationInMs: number = + typeof requestedDurationInMs === "number" && isFinite(requestedDurationInMs) && !isNaN(requestedDurationInMs) + ? requestedDurationInMs + : segment.assetDurationInMs + + // trivial case: nothing to do! + const segmentDurationInMs = segment.endTimeInMs - segment.startTimeInMs + if ( + durationInMs === 0 + || + segmentDurationInMs === durationInMs + ) { + return + } + + + // let's set some limits eg. at least 1 sec, I think this is reasonable + const minimumLengthInSteps = 2 + const minimumLengthInMs = minimumLengthInSteps * DEFAULT_DURATION_IN_MS_PER_STEP + + // positive if new duration is longer, + // negative if shorter + const timeDifferenceInMs = durationInMs - segmentDurationInMs + + // setup some limits + const newSegmentDurationInMs = Math.max( + minimumLengthInMs, + segmentDurationInMs + timeDifferenceInMs + ) + + // ok, well, there is nothing to change actually + if (segmentDurationInMs === newSegmentDurationInMs) { return } + + const { + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + segments, + segmentsChanged, + totalDurationInMs: previousTotalDurationInMs + } = get() + + // positive if new duration is longer, + // negative if shorter + const newTimeDifferenceInMs = newSegmentDurationInMs - segmentDurationInMs + + const endTimeInMs = segment.endTimeInMs + // const newEndTimeInMs = endTimeInMs + newTimeDifferenceInMs + + let totalDurationInMs = previousTotalDurationInMs + + // we shift everything that's impacted + // overlapping segments will be stretched + // (those should be marked as "TO_GENERATE") + for (const s of segments) { + if (endTimeInMs <= s.startTimeInMs) { + s.startTimeInMs += newTimeDifferenceInMs + } + if (endTimeInMs <= s.endTimeInMs) { + s.endTimeInMs += newTimeDifferenceInMs + } + + // also need to update the total duration + if (s.endTimeInMs > totalDurationInMs) { + totalDurationInMs = s.endTimeInMs + } + } + console.log(`TODO Julian: stretched segments (overlapping segments) should be re-generated`) + + set({ + segments, + segmentsChanged: segmentsChanged + 1, + ...computeContentSizeMetrics({ + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + totalDurationInMs, + }) + }) + } })) diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 44366de1..588a2541 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -243,7 +243,9 @@ export type TimelineStoreModifiers = { startTimeInMs?: number track?: number }) => Promise - findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number + findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number + + fitSegmentToAssetDuration: (segment: ClapSegment, durationInMs?: number) => Promise } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers From c9c330501a0dc074adf5a81612efa5fe5feb4fce Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 17 Jun 2024 19:20:55 +0200 Subject: [PATCH 157/346] 0.0.29 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/index.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index cad5cfc4..c4150ef2 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.28", + "version": "0.0.29", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index ab32afc7..5a8f01a7 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -24,6 +24,7 @@ export { baseClapSegmentCategoryHues, pastel, DEFAULT_THEMES, + segmentVisibilityPriority } from "./constants" export { From 3594f2565cbeeef2e4f5960dee4afbd4348a8044 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 01:55:28 +0200 Subject: [PATCH 158/346] 0.0.30 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useTimeline.ts | 20 +++++++++++++------ .../aitube-timeline/src/types/timeline.ts | 1 + .../src/utils/getDefaultState.ts | 1 + 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index c4150ef2..a303b5fa 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.29", + "version": "0.0.30", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index b962d971..adaba992 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -64,14 +64,19 @@ export const useTimeline = create((set, get) => ({ // let's trust developers for respecting this let totalDurationInMs = Math.max(0, clap.meta.durationInMs || 0) - // TODO: this whole approach is a bit weak, - // having an heuristic is okay but we should do it: - // track by track - // for each track, count length occurrences to keep the most recurring one - // do something for images/videos that don't have the right ratio, - // eg. add black banding + const lineToDialogue: Record = {} + for (const s of segments) { + if (s.category === ClapSegmentCategory.DIALOGUE || s.category === ClapSegmentCategory.ACTION) { + const scene = clap.scenes.find(({ id }) => id === s.sceneId) + if (scene) { + for (let lineNumber = scene.startAtLine; lineNumber < scene.endAtLine; lineNumber++) { + lineToDialogue[lineNumber] = s + } + } + } + if (s.category === ClapSegmentCategory.CAMERA) { const durationInSteps = ( (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP @@ -176,6 +181,8 @@ export const useTimeline = create((set, get) => ({ clap.meta.durationInMs = totalDurationInMs + clap.meta.screenplay = clap.scenes.reduce((acc, { sequenceFullText }) => `${acc}\n${sequenceFullText}`, '') + set({ clap, segments, @@ -183,6 +190,7 @@ export const useTimeline = create((set, get) => ({ visibleSegments: [], segmentsChanged: 1, totalDurationInMs, + lineToDialogue, isEmpty, isLoading: false, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 588a2541..a92288b8 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -74,6 +74,7 @@ export type TimelineStoreProjectState = { loadedSegments: ClapSegment[] visibleSegments: ClapSegment[] nbIdentifiedTracks: number + lineToDialogue: Record isEmpty: boolean isLoading: boolean diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index d9fa28ad..336e964b 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -14,6 +14,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { totalDurationInMs: 0, loadedSegments: [], visibleSegments: [], + lineToDialogue: {}, isEmpty: true, isLoading: false, From cc30b99eab32688f74882e1302f97fc6f918129b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 02:15:40 +0200 Subject: [PATCH 159/346] 0.0.31 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useTimeline.ts | 38 +++++++++++-------- .../aitube-timeline/src/types/timeline.ts | 5 ++- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index a303b5fa..a4a497a7 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.30", + "version": "0.0.31", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index adaba992..c68df110 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -44,7 +44,7 @@ export const useTimeline = create((set, get) => ({ // console.log(`useTimeline: setting the clap to`, clap) // we remove the big/long video - const segments = removeFinalVideos(clap) + const segments = removeFinalVideos(clap) as RuntimeSegment[] const { defaultCellHeight, @@ -61,22 +61,8 @@ export const useTimeline = create((set, get) => ({ let defaultSegmentDurationInSteps = get().defaultSegmentDurationInSteps - // let's trust developers for respecting this - let totalDurationInMs = Math.max(0, clap.meta.durationInMs || 0) - - const lineToDialogue: Record = {} - + for (const s of segments) { - - if (s.category === ClapSegmentCategory.DIALOGUE || s.category === ClapSegmentCategory.ACTION) { - const scene = clap.scenes.find(({ id }) => id === s.sceneId) - if (scene) { - for (let lineNumber = scene.startAtLine; lineNumber < scene.endAtLine; lineNumber++) { - lineToDialogue[lineNumber] = s - } - } - } - if (s.category === ClapSegmentCategory.CAMERA) { const durationInSteps = ( (s.endTimeInMs - s.startTimeInMs) / DEFAULT_DURATION_IN_MS_PER_STEP @@ -102,6 +88,12 @@ export const useTimeline = create((set, get) => ({ defaultSegmentLengthInPixels / defaultMediaRatio ) + // let's trust developers for respecting this + // otherwise we could use the following big for loop to do this + let totalDurationInMs = Math.max(0, clap.meta.durationInMs || 0) + + const lineToDialogue: Record = {} + for (const s of segments) { // TODO: move this idCollision detector into the state, @@ -110,6 +102,20 @@ export const useTimeline = create((set, get) => ({ console.log(`collision detected! there is already a segment with id ${s.id}`) continue } + + if (s.category === ClapSegmentCategory.DIALOGUE || s.category === ClapSegmentCategory.ACTION) { + const scene = clap.scenes.find(({ id }) => id === s.sceneId) + if (scene) { + + // we attach the scene to the segment + s.scene = scene + + for (let lineNumber = scene.startAtLine; lineNumber < scene.endAtLine; lineNumber++) { + lineToDialogue[lineNumber] = s + } + } + } + idCollisionDetector.add(s.id) if (!tracks[s.track]) { diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index a92288b8..26931075 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,5 +1,5 @@ import * as THREE from "three" -import { ClapProject, ClapSegment } from "@aitube/clap" +import { ClapProject, ClapScene, ClapSegment } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" @@ -40,7 +40,10 @@ export enum SegmentVisibility { // some data can only exist inside a browser session (eg. AudioBuffer) // or at least data that only make sense on client side // we could put things like a mouse hover or selected state in here +// or simply large, recursive elements (like the scene) export type BrowserOnlySegmentData = { + scene?: ClapScene + audioBuffer?: AudioBuffer visibility?: SegmentVisibility From 8bafc67d95fa225972bed493e570d9742df83773 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 16:17:53 +0200 Subject: [PATCH 160/346] 0.0.28 --- packages/aitube-clap/bun.lockb | Bin 16869 -> 17271 bytes packages/aitube-clap/package.json | 4 ++-- .../aitube-clap/src/factories/newSegment.ts | 2 ++ packages/aitube-clap/src/io/parseClap.ts | 4 ++++ packages/aitube-clap/src/io/serializeClap.ts | 4 ++++ packages/aitube-clap/src/types.ts | 2 ++ 6 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index c1fd175ebe68cffc29739108d273224cb2c30f24..f57577f359cf3d2c61e354d43358b4d0977a8aed 100755 GIT binary patch delta 3453 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 { category: parseSegmentCategory(maybeSegment?.category), entityId: typeof maybeSegment?.entityId === "string" ? maybeSegment.entityId : "", sceneId: typeof maybeSegment?.sceneId === "string" ? maybeSegment.sceneId : "", + startTimeInLines: isValidNumber(maybeSegment?.startTimeInLines) ? (maybeSegment?.startTimeInLines || 0) : 0, + endTimeInLines: isValidNumber(maybeSegment?.endTimeInLines) ? (maybeSegment?.endTimeInLines || 0) : 0, prompt: typeof maybeSegment?.prompt === "string" ? maybeSegment.prompt : "", label: typeof maybeSegment?.label === "string" ? maybeSegment.label : "", outputType: parseOutputType(maybeSegment?.outputType, ClapOutputType.TEXT), diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index ba11d703..6d223671 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -284,6 +284,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false category, entityId, sceneId, + startTimeInLines, + endTimeInLines, prompt, label, outputType, @@ -312,6 +314,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false category, entityId, sceneId, + startTimeInLines, + endTimeInLines, prompt, label, outputType, diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index 2720d0f9..21b0b6ce 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -91,6 +91,8 @@ export async function serializeClap({ category, entityId, sceneId, + startTimeInLines, + endTimeInLines, prompt, label, outputType, @@ -114,6 +116,8 @@ export async function serializeClap({ category, entityId, sceneId, + startTimeInLines, + endTimeInLines, prompt, label, outputType, diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 20c5135e..27dacde3 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -287,6 +287,8 @@ export type ClapSegment = { category: ClapSegmentCategory entityId: string sceneId: string + startTimeInLines: number + endTimeInLines: number prompt: string label: string outputType: ClapOutputType From e500eddb111c6c3d19c873cd230975314d1139e6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 16:27:56 +0200 Subject: [PATCH 161/346] 0.0.29 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/index.ts | 2 ++ packages/aitube-clap/src/types.ts | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 97add8c3..e8dcbea8 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.28", + "version": "0.0.29", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index e64e87b6..275b5711 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -20,6 +20,8 @@ export { ClapSegmentCategory, ClapSegmentFilteringMode, ClapSegmentStatus, + ClapTrack, + ClapTracks, ClapVoice, ClapCompletionMode } from './types' diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 27dacde3..73cce76e 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -356,6 +356,18 @@ export type ClapEntity = { appearance: ClapEntityAppearance } +export type ClapTrack = { + id: number + name: string + isPreview: boolean + height: number + hue: number + occupied: boolean + visible: boolean +} + +export type ClapTracks = ClapTrack[] + export type ClapProject = { meta: ClapMeta entities: ClapEntity[] From bb614b235d5a2ee17317488ea20c08bc061b5958 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 16:30:07 +0200 Subject: [PATCH 162/346] 0.0.8 --- packages/aitube-colors/bun.lockb | Bin 17236 -> 17622 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 42b97a6147964eb2c7ff4aa6fc0a6b086d79f2be..2bc2911cf8deaa89ee28893d874c62f51f59c49c 100755 GIT binary patch delta 3540 zcmeHJdr*|u760zHySU%N29Vc&yDrQ7A@0I1`v3(N2{p!@O`)c)>zjyH5F!>b(NSTW zTB98W%yBY;@rgC5V z{LVf1+;e{SHR5do%Ar=rvppHka2;z30<028?MEwNn z5e!6r%?gf-LcJWd7Im#swilz;AdXYXT7x(O@jk=}sJEfUeOm(OaDozO3zGv3pr(cY zEl@B(AYLse6pAy1iBUo>%#Pwt2Ui@xN3 z8-FOzZK$a}tX0A*tLp3UPp%6FnOnU-qVLh;CqJ?GB=Kt*Q$eyO2QDaPLYgKE+7)VM z2EWqH+Mok}Pr((XTi}tmXE7dw-C-_%1`m2w3EK&Nm79GF9V$2PQovO-wSpMt7A_#0 z6VY1@yHzf>1v=1n1&Jy`TNqTST!IPtBcvk4&sM>#F(twgG|oVyf;JIikjWA`2yR&! z26}ag>NPZ$!CciOb_+VxZa!@cTve9{^Tx>G#=xN3C3FUnyj35fQfaH*N|%s^d{a~b z29+-UIW_1tC2Sw~HE!VsPED1zuhO`LGNg|jl@yW%Kn!;aU!l#0HlFGdL_Fsp!gM`| zrpR-Mb|5N~Vqq!lGw?^a`K)m0j3|j-fJZY4r|`?veqernPn zP3y+WP|_4nhk}R68BoZ7910E6WH%AOfx0&Ihvb-qh!!MER$0@6w4gmbXeUkftRNmu zQ)1(T^Q0B9Ju<;d(Q|{=(KM~HqL3dRlQc*Z&PSnn2MP@b+>K2AKY{;A=>JBbKf0;Z z@j-pjlLv|_XSA+6J@)eF>&kko)33ZYGU2-GhwViRpI!6u5&NOm?#`{9vtyzUE*NZn zyRv_ved3q<=N`NFZR`4~RiGW)P-;-5SIlc`A93lu?@Sl@JuwF_eAA!&LVZrk&AnyL zyQcn0j}q-)Ew*@jt@RD%H(UIs4-Ubr?9OcE(AJ~piyrqJ8JomPo0NYOzVtr+Fsi$* zdsXq`4_8g!^6*{LiM6XoKFRA@`o-|NrMJ4?KK%IBx%nUW6;*UC4PSVqB7Nf12Db z5B`W~jnTu>;WVNZiCQoxdc2wPH!uAvUtgNjSGVbMZ}sY32b7sRSHI-cS8QxLbNu_Y zYrN$R`(KVpm_Gm5`Wx>a(hm2`5aw)bE~(PoHl?&(yyq;O{Mqj^z-U6A5&DlGmFa4E(x2GZ)q*>7Y2t!^}M!lFsw6KoN`2lrrigypHjn z4O~V|ZzfoiD`*0arK;6Byk>*OYBKf|q#aj7Alj-au*k`MY5|40sO8aPd61E)q5C0p zEfS{NiT)L0P-u>BAi`viLm}IQpvE_j+5^dEMom8WsBwuXv?dRQ{OM{HQP4l*pO+NA zQ=DElN*5M6s)IM%B^b11LX;)8g|03;3QbTr3QyM@g`^1hh|$YW#85{dU98!tsibI> zU`HU8L8nBi)2$zif*lieNgNSG>C@$$fnr3Vi#wSrp({TLh4`TQsa|>xs73=Ex5SJk zL=T3PAF4}vFl0_?q1}j3ib!NoeMAr~q)aJus)ni{BB>(6p=z){lioMth$^ACiL#{x zs4A*}>|~>ADM6}?FeW-*DvwH`0JNA+Ae1ZNBowNS%1%YWa=8=~DxFT9-X@}wG|@xU zsfl|WwNCgvH-n;u7!I_nu3xXy|EfERh z4Ua59HygU)VGKZSzUU0K)6eAg?h((Nh?Vw{G8iQ{hrCiQ-Vti~XR+7*G-Y^aLoh`Q z9qQHnC!IeTn)cvpoWXOYvbMq5d?`0%kDnmCV%PC50rYkoI|^RAmu-e^cF_=O%Dc{P zUAeRNVhzul3oLjhdE8z&Zx7&8{Bhd#V%Z0^|M9h+Qwzi zn-~9lS-rWsrm+dexxTkHRE;*3Yt9{g!fb^@lTv#U3epAU=qa8&hOxq)AC*P2e*hw5 Bxbgr1 delta 3371 zcmeHJeNa@_6@T~buIyWQd?>KHEDH;WpvL`Tmj$J}#u`7elCce8)v8UZMle_yHBn=g z)yA)}jvpsxs$&e38PZ@deo$kzNsZ97F(b9s)L^1S+UY1n6U{hQ?P&TtZ+BDv$V{jI z_YQ}%zjN+A_nhCm@4S0qv-o&}*zOz|{L?FR_xTx%8g-Mc%lrF6?_5f91$J~dCFi{| zWv+eghTl(+v@vE!BwxPw$c`1I%_%~Xk|im+xc;a0P0uV{S_`ZI>*9KZEJ-_FPa2Hd7^fL*!(PMIxM2 zGyZX|9y%w?qLTVWsKYJ4BxqTxkFM#alTRt77M)R;sa_uvE2$0t4^zKBBwrV_$Pg5M zYBPkyX6iSD=RX{`NFwoIBGBA>F z>1lsbP$ z2`Fxm_Mfd9fX2gzt@Huq1Q176=$1Yp-%X-Lrl6>zHd9D>5nN7zOGk%I0i_3sC+az* z$fo+_kg^)AdSR2b`VM}JxV}E1Nt%z554__T#!3+{P+Lk!{+)>iQi2(G;2H-Pj-JG# z(lfdejqt~)UJZ#Y)TV~yGs!fd1~d3cRbn#cX~U*Xb|foQpBfTNs4ex$X7I!hR>Ilk zL#mCznm56r);7bL&<1OspAmza28VojB|Jna2g2)Y5FV`Ap2q-VkZ#r{=EKMf91tE3 z2rnptuzfg$2Wz&MFu?dO&54cFyfMx5AAxY3F>yO<#!hK+%;JnY25S!FhVVpB+|QaZ zo}y?gGuRgvBswvqb1ki%P0BEV5{(H9|A2D!m6} zCM73A#vGLv=Y)lojsyJ$$ZiV@8`aw)RA*DE8^})9+z456Ra%`J7Ws4<=tH0}_OK|R zmG%g&u&Z<#sE9`9MW{4SrLB2kQA`(sdh*n1w%Y^diR~V-<>01qqnlpP9~AAkq>mq8 z7f6}eIDF1FsyMc<>}1NG{kNx9F21|-?*mJJ;__W+eXRQWsk7p58!IyLDhTOe+C%6P z+MFMuP5GcHKP*O4r2{lM)M>r*E^U#&?pizFy>)ia)Gzl$7ASZAdc2FOCpEU6*1?04{Jl{lK#)o~UbA_nsTH#c1kB&}$C0qq?9=M$^+P z^UycZ5u=OAGkl)$ZT#f#8}${;KT`aG(KJ5(!e1G)(^=K5oz92f#0G;A5Pq8zeT^}< z3qGwwA?)K;!kF!u5VnnuYkY>J?D%hPF+7L+sU5;=To9hmz0tzE@Pb53NutBfVW#x> z+tTBtURNRMU6w5FEoBh)a0HI%CXdV9%sI4|zW!ys9ZR0uP` zxpC_(hU7wuAPxxkVQ#%#E7!)gaIfb4xrcKNq@? z%_TDx90pHBN`i0^Ts>34zwv$KI}(4Pw9gN3!6osQoHnPTLbw#RvyIEk=7~8p@-xDi?x$Y&2n+9pJfqtUpMTzv zv;I)Ja68>jZ-5-0n`ZDIU7tR?q2VR5R~B@FFv=)ObF2e%WzP&^~ zb^iMB7aP-OYMXLo$&LpF?xP;ltuIDR%GAq3fdyI(oazVoTh1XNkR^P5S3+O_<@2k>H`eGApi8|0=WE5_e;J zVPDbvO5t(LDv!-7CYR4zp11;^o3a1TQ*Xca4_T}M-%g(-B` w~^N%Z=9fEV4#O z?sudS-=IB-&iE|3iOci#`Lmw7T=o7$WKik!^23M)NL-qyuW5Mq(&3JF_yaKxx{c)X zdqoW`^jF(rcV{VT>W|n%Ex)*rX=Sl#9y;r{`V$xG9j;khM;!fLB?|H4(R!T~i7U3! zSoMd2AME)pJbtIQ95s$5d$|>t?m&5&sl~4yQR#|*r!$i_mAmPk@(Jej@|gAA2{CP| zdcGp)@X$@Sg-QaAI-k=|y93LFhf*s_X Date: Sat, 22 Jun 2024 17:35:11 +0200 Subject: [PATCH 163/346] work on line mapping --- packages/broadway/bun.lockb | Bin 32802 -> 33180 bytes packages/broadway/package.json | 8 +- ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 175097 -> 168312 bytes .../src/analysis/analyzeScreenplay.ts | 123 ++++++++++++++---- .../src/analysis/parseScriptToClap.ts | 39 +++--- .../broadway/src/factories/createSegment.ts | 28 ++-- packages/broadway/src/tests/main.test.ts | 10 +- 7 files changed, 132 insertions(+), 76 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 36a3ef3422e67a8c90be3666d7bd64a1440309d2..cbd446105932697da9f08fd69cbba8ec0bfb4c63 100755 GIT binary patch delta 5528 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 DURjsk delta 5363 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 diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 2ee588e5..184c2fd9 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.16", + "version": "0.0.17", "description": "Convert a script to a clap file", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", @@ -17,11 +17,11 @@ "bun-types": "latest", "prettier": "^3.3.2", "rimraf": "^5.0.7", - "typescript": "^5.4.5" + "typescript": "^5.5.2" }, "peerDependencies": { - "@aitube/clap": "0.0.27", - "@aitube/colors": "0.0.7" + "@aitube/clap": "0.0.29", + "@aitube/colors": "0.0.8" }, "repository": { "type": "git", diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap index a6a7349032bc546a7d50d1c7c631c5e616293799..98be523dfe7bbef0b9d02115994a301130890d85 100644 GIT binary patch literal 168312 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
4(zF)Wh>&X3ahP&g^7OR>N2Z7-|D5 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 b5_&6+{5XLO(X(dqjxYW{?^XV9ncW!xt?;t3 literal 168312 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 ^bsL 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%0D&^ndu>?^=euS!?#M<(& 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 diff --git a/packages/broadway/src/analysis/analyzeScreenplay.ts b/packages/broadway/src/analysis/analyzeScreenplay.ts index 550d06be..3e8b684e 100644 --- a/packages/broadway/src/analysis/analyzeScreenplay.ts +++ b/packages/broadway/src/analysis/analyzeScreenplay.ts @@ -21,6 +21,7 @@ import { parseCharacterName } from "./parseCharacterName" import { analyzeName } from "./analyzeName" import { parseDialogueLine } from "./parseDialogueLine" import { isVoiceOver } from "./isVoiceOver" +import { findSubtext } from "./findSubtext" export async function analyzeScreenplay( screenplay: Screenplay, @@ -106,22 +107,10 @@ export async function analyzeScreenplay( const sizeOfProgressChunk = Math.floor(screenplay.sequences.length / 3) - let finalPlainText = "" - let nbTotalLinesInFinalPlainText = 0 let totalDurationInMs = 0 for (const sequence of screenplay.sequences) { - // we prepend any missing text - const nbMissingLines = sequence.startAtLine - nbTotalLinesInFinalPlainText - for (let i = 0; i < nbMissingLines; i++) { - finalPlainText += "\n" - nbTotalLinesInFinalPlainText += 1 - } - - finalPlainText += sequence.fullText - nbTotalLinesInFinalPlainText += sequence.fullText.split("\n").length - if ((++nbProcessedSequences % sizeOfProgressChunk) === 0) { await onProgress?.(progress += 20, `Analyzing sequences (${nbProcessedSequences}/${screenplay.sequences.length} completed)`) } @@ -198,7 +187,6 @@ export async function analyzeScreenplay( for (const scene of sequence.scenes) { - const sceneCharacters: Record = {} for (const event of scene.events) { @@ -208,17 +196,12 @@ export async function analyzeScreenplay( } for (const event of scene.events) { - + let startTimeInLines = event.startAtLine + let endTimeInLines = event.endAtLine + // console.log(`---- event [${startTimeInLines}:${endTimeInLines}] = "${event.description}" ---`) + try { const segmentCandidates: ClapSegment[] = [] - - /* - // console.log("\n------------ EVENT -------------\n") - // console.log({ - description: event?.description, - character: event?.character - }) - */ // the "action prompt" is very interesting for us, because we can look into it // to extract infor about weather, sounds etc @@ -370,8 +353,8 @@ export async function analyzeScreenplay( if (currentLocationName) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [currentLocationName], categoryName: ClapSegmentCategory.LOCATION, @@ -404,8 +387,8 @@ export async function analyzeScreenplay( if (locationTypeAsPrompt) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [locationTypeAsPrompt], categoryName: ClapSegmentCategory.LOCATION, @@ -430,8 +413,8 @@ export async function analyzeScreenplay( if (currentTime || currentLighting) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [ currentTime, @@ -448,8 +431,8 @@ export async function analyzeScreenplay( if (currentWeather) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [ currentWeather, @@ -501,8 +484,8 @@ export async function analyzeScreenplay( if (currentShotType) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [ currentShotType, @@ -590,8 +573,8 @@ export async function analyzeScreenplay( if (event.behavior) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [event.behavior], label: `${currentSliceEntities[0]?.label}: ${event.behavior}`, @@ -603,15 +586,14 @@ export async function analyzeScreenplay( })) } - const dialogueLine = parseDialogueLine(event.description) if (event.type === ClapSegmentCategory.DIALOGUE && dialogueLine) { // console.log("found a dialogue! currentSliceEntities:", currentSliceEntities) segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [dialogueLine], @@ -629,8 +611,8 @@ export async function analyzeScreenplay( if (currentAction && !isVoiceOver(currentAction)) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [currentAction], label: @@ -683,8 +665,8 @@ export async function analyzeScreenplay( if (currentSound) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [ currentSound, @@ -703,8 +685,8 @@ export async function analyzeScreenplay( if (currentMusic) { segmentCandidates.push(createSegment({ startTimeInSteps, - startTimeInLines: event.startAtLine, - endTimeInLines: event.endAtLine, + startTimeInLines, + endTimeInLines, sceneId: scene.id, prompt: [ currentMusic, @@ -807,6 +789,49 @@ export async function analyzeScreenplay( scenes = scenes.concat(sequence.scenes) } + let finalPlainTextLines = screenplay.fullText.split("\n") + + // let lastRow = 0 + + for (const segment of segments) { + let needle = "" + if (segment.category === ClapSegmentCategory.DIALOGUE + || segment.category === ClapSegmentCategory.ACTION + ) { + needle = segment.prompt + } + if (!needle) { continue } + + let searchZoneLines = finalPlainTextLines.slice( + segment.startTimeInLines, + segment.endTimeInLines + ) + + let haystack = searchZoneLines.join("\n") + + + // console.log(`searching for: "${needle}"\ninside: "${haystack}"`) + + try { + const found = findSubtext(needle, haystack) + // console.log(`found:`, found) + + if (typeof found?.startAtRow === "number") { + // this improves the quality of results a bit, + // but sometimes the findSubtext function doesn't find anything + segment.startTimeInLines += 1 + (found.startAtRow || 0) + segment.endTimeInLines += 1 + (found.endAtRow || 0) + } + + } catch (err) { + // console.log(`not found`) + } + + } + + // const finalPlainText = finalPlainTextLines.join("\n") + const finalPlainText = screenplay.fullText + return { movieGenreLabel, extraPositivePrompt, @@ -817,4 +842,4 @@ export async function analyzeScreenplay( totalDurationInMs, scenes } -} \ No newline at end of file +} diff --git a/packages/broadway/src/analysis/findSubtext.ts b/packages/broadway/src/analysis/findSubtext.ts new file mode 100644 index 00000000..d9a3b6bd --- /dev/null +++ b/packages/broadway/src/analysis/findSubtext.ts @@ -0,0 +1,82 @@ +export interface SubtextPosition { + startAtRow: number; + startAtCol: number; + endAtRow: number; + endAtCol: number; + remaining: string; + startIndex: number; +} + +export function findSubtext(needle: string, haystack: string): SubtextPosition | undefined { + const haystackLines = haystack.split('\n'); + const needleChars = needle.split(''); + + let needleIndex = 0; + let startAtRow = -1; + let startAtCol = -1; + let endAtRow = -1; + let endAtCol = -1; + let startIndex = -1; + + let totalCharacterCount = 0; + + for (let i = 0; i < haystackLines.length; i++) { + const line = haystackLines[i]; + for (let j = 0; j < line.length; j++) { + const hayChar = line[j]; + const needleChar = needleChars[needleIndex]; + + if (hayChar === needleChar) { + if (needleIndex === 0) { + startAtRow = i; + startAtCol = j; + startIndex = totalCharacterCount; + } + + needleIndex++; + endAtRow = i; + endAtCol = j; + + if (needleIndex === needleChars.length) { + return { startAtRow, startAtCol, endAtRow, endAtCol, remaining: '', startIndex }; + } + } else { + if (hayChar !== ' ' && hayChar !== '\n' && hayChar !== '\t') { + needleIndex = 0; + startAtRow = -1; + startAtCol = -1; + startIndex = -1; + } + } + totalCharacterCount++; + } + totalCharacterCount++; // account for line return + } + + if (startAtRow === -1 || startAtCol === -1) { + throw new Error("Subtext not found in the provided text."); + } + + const remaining = needle.slice(needleIndex); + return { startAtRow, startAtCol, endAtRow, endAtCol, remaining, startIndex }; +} + +/* +// Example usage +const haystack = ` I'm a busy man. When I give jobs, I + don't have time for a lotta B.S. If + a guy comes to me and says, + "Michael, this job has been my + dream since I was a little kid. My + whole life has been leading up to + this job," That, I respond to. + Nothing is more important than + enthusiasm, from the Greek word`; + +const needle = `If a guy comes to me and says, "Michael, this job has been my dream since I was a little kid"`; + +const { startAtRow, startAtCol, endAtRow, endAtCol } = findSubtext(needle, haystack); +console.log({ startAtRow, startAtCol, endAtRow, endAtCol }); +// Expected output: +// { startAtRow: 2, startAtCol: 6, endAtRow: 5, endAtCol: 43 } +*/ \ No newline at end of file diff --git a/packages/broadway/src/analysis/getScreenplayFromText.ts b/packages/broadway/src/analysis/getScreenplayFromText.ts index fb8ed0b9..ab16ec44 100644 --- a/packages/broadway/src/analysis/getScreenplayFromText.ts +++ b/packages/broadway/src/analysis/getScreenplayFromText.ts @@ -24,9 +24,13 @@ export async function getScreenplayFromText(fullText: string): Promise { line = line.replaceAll("\r", "")// .trim() + reconstructedFullText += `${line}\n` + // if (lineNumber < 25) { return } // use this if you need to debug something // if (lineNumber > 200) { return } @@ -101,7 +105,7 @@ export async function getScreenplayFromText(fullText: string): Promise export const state: { isReady: boolean - - // unfortunately we cannot use this kind of caching for now, - // as this is Node-only, and break when used in the browser - // import Cache, { FileSystemCache } from "file-system-cache" - //cache?: FileSystemCache - nameToStats: Record + nameToStats: NameToStats } = { isReady: false, - // cache: undefined, nameToStats: {}, } -const DEFAULT_DOWNLOAD_URL = "https://huggingface.co/datasets/jbilcke-hf/detection-of-age-and-gender/resolve/main/baby-names-us-year-of-birth-full.csv?download=true" +const dirName = 'detection-of-age-and-gender' +const fileName = 'baby-names-us-year-of-birth-full.csv' +const storageFilePath = `${dirName}/${fileName}` + +const DEFAULT_DOWNLOAD_URL = `https://huggingface.co/datasets/jbilcke-hf/${dirName}/resolve/main/${fileName}?download=true` // note: this takes about 140 Mb of memory -export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) { - let nameToStats = {} as Record - - // unfortunately we cannot use this kind of caching for now, - // as this is Node-only, and break when used in the browser - // import Cache, { FileSystemCache } from "file-system-cache" - // if (typeof window === "undefined") { - // if (!state.cache) { - // state.cache = Cache({ - // basePath: ".age_and_gender_dataset_cache", // await getRandomDirectory() - // ttl: 30 * 24 * 60 // (optional) A time-to-live (in secs) on how long an item remains cached. - // }); - // } - // - // - // try { - // const rawString = await state.cache.get(CACHE_KEY) - // nameToStats = JSON.parse(rawString) as Record - // if (Object.keys(nameToStats).length === 0) { - // throw new Error(`failed to load the dataset`) - // } - // return nameToStats - // } catch (err) { - // nameToStats = {} - // } - // } +// we store the dataset inside a big JSON in the IndexedDB +export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promise> { + + + if (typeof window !== "undefined") { + try { + const fs = await require("indexeddb-fs") + const rawCacheContent = await fs.readFile(storageFilePath) as string + const cacheObject = JSON.parse(rawCacheContent) as NameToStats + if (Object.keys(cacheObject).length === 0) { + throw new Error(`cache is empty`) + } + return cacheObject + } catch (err) { + console.log(`couldn't load the cache, we will try to re-generate it`) + } + } + + let nameToStats = {} as NameToStats console.log(`downloading age and gender detection dataset from Hugging Face (jbilcke-hf/detection-of-age-and-gender)`) @@ -75,15 +66,21 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) { nameToStats[key].sort((a, b) => b[1] - a[1]) }) - // unfortunately we cannot use this kind of caching for now, - // as this is Node-only, and break when used in the browser - // import Cache, { FileSystemCache } from "file-system-cache" - // if (typeof window === "undefined" && state.cache) { - // try { - // await state.cache.set(CACHE_KEY, JSON.stringify(nameToStats)) - // } catch (err) { - // console.error(`failed to cache the dataset: ${err}`) - // } - // } + if (typeof window !== "undefined") { + + console.log(`trying to save the dataset to the browser's IndexedDB for faster reload`) + + try { + const fs = await require("indexeddb-fs") + if (!await fs.isDirectory(dirName)) { + await fs.createDirectory(dirName) + } + + await fs.writeFile(storageFilePath, JSON.stringify(nameToStats)) + } catch (err) { + console.error(`failed to store the cache (${err})`) + } + } + return nameToStats } diff --git a/packages/broadway/src/analysis/parseScenes.ts b/packages/broadway/src/analysis/parseScenes.ts index 208f9466..15e157d8 100644 --- a/packages/broadway/src/analysis/parseScenes.ts +++ b/packages/broadway/src/analysis/parseScenes.ts @@ -261,7 +261,7 @@ export function parseScenes(screenplaySequence: ScreenplaySequence): Scene[] { } } else if (endOfAction && currentEvent?.type === "action") { - const action = currentEvent.description + const action = currentEvent.description.trim() ? `${currentEvent.description.trim()} ${line.replace(")", "")}` : line.replace(")", "") @@ -297,7 +297,7 @@ export function parseScenes(screenplaySequence: ScreenplaySequence): Scene[] { } else { // current event type has not changed, we are just extending it currentEvent.description = - currentEvent.description + currentEvent.description.trim() ? `${currentEvent.description.trim()} ${line}` : `${line}` diff --git a/packages/broadway/src/tests/main.test.ts b/packages/broadway/src/tests/main.test.ts index a3dfe609..272d5359 100644 --- a/packages/broadway/src/tests/main.test.ts +++ b/packages/broadway/src/tests/main.test.ts @@ -1,14 +1,12 @@ import { test, expect, describe } from "bun:test" + import { ClapProject, serializeClap } from "@aitube/clap" import { readPlainText } from "@aitube/io" import { parseScriptToClap } from ".." -// hack for Bun -require("./bun-shims.js") - describe("main demo", async () => { - + test("parseScriptToClap", async () => { const scriptName = "Afterglow v10 X Rewrite Bryan E. Harris 2023" const inputScriptFilePath = `./samples/scripts/${scriptName}.txt` @@ -47,4 +45,5 @@ describe("main demo", async () => { }, 30000) */ + }) \ No newline at end of file diff --git a/packages/broadway/src/tests/bun-shims.js b/packages/broadway/src/tests/setup.js similarity index 88% rename from packages/broadway/src/tests/bun-shims.js rename to packages/broadway/src/tests/setup.js index 7603b4e9..185831df 100644 --- a/packages/broadway/src/tests/bun-shims.js +++ b/packages/broadway/src/tests/setup.js @@ -1,5 +1,12 @@ // @bun + +// --------- disable IndexedDB ------------ +global.indexedDB = false +globalThis.indexedDB = false + +// -------- mock other things ------------- + // see https://github.com/oven-sh/bun/issues/1723 /*! MIT License. Jimmy Wärting */ @@ -35,4 +42,4 @@ globalThis.DecompressionStream ??= class DecompressionStream { format === 'gzip' ? zlib.createGunzip() : zlib.createInflateRaw()) } -} \ No newline at end of file +} From d4165df69a0be67ff8b5b623bf7e962b73fa04a4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 23 Jun 2024 16:30:11 +0200 Subject: [PATCH 168/346] 0.0.19 --- packages/broadway/package.json | 2 +- .../src/analysis/loadAgeAndGenderDataset.ts | 49 +++++++++++-------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 38f1ed93..eef23839 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.18", + "version": "0.0.19", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts index bae5be21..1ae2c5ff 100644 --- a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -19,7 +19,7 @@ const dirName = 'detection-of-age-and-gender' const fileName = 'baby-names-us-year-of-birth-full.csv' const storageFilePath = `${dirName}/${fileName}` -const DEFAULT_DOWNLOAD_URL = `https://huggingface.co/datasets/jbilcke-hf/${dirName}/resolve/main/${fileName}?download=true` +const DEFAULT_DOWNLOAD_URL = `https://clapper.app/datasets/${fileName}` // note: this takes about 140 Mb of memory // we store the dataset inside a big JSON in the IndexedDB @@ -28,7 +28,7 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promi if (typeof window !== "undefined") { try { - const fs = await require("indexeddb-fs") + const { default: fs } = await import("indexeddb-fs") const rawCacheContent = await fs.readFile(storageFilePath) as string const cacheObject = JSON.parse(rawCacheContent) as NameToStats if (Object.keys(cacheObject).length === 0) { @@ -42,36 +42,43 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promi let nameToStats = {} as NameToStats + console.log(`downloading age and gender detection dataset from Hugging Face (jbilcke-hf/detection-of-age-and-gender)`) - - const res = await fetch(url) - const rawData = await res.text() + try { - rawData.split("\n").forEach(line => { - const [yearOfBirth, name, gender, numberOfBirths] = line.trim().split(",") - - const key = normalizeName(name) + const res = await fetch(url) + const rawData = await res.text() - if (!key) { return } + rawData.split("\n").forEach(line => { + const [yearOfBirth, name, gender, numberOfBirths] = line.trim().split(",") + + const key = normalizeName(name) - if (!nameToStats[key]) { - nameToStats[key] = [] - } - nameToStats[key].push([ - gender === "F" ? "female" : "male", - Number(numberOfBirths), - Number(yearOfBirth), - ]) + if (!key) { return } - nameToStats[key].sort((a, b) => b[1] - a[1]) - }) + if (!nameToStats[key]) { + nameToStats[key] = [] + } + nameToStats[key].push([ + gender === "F" ? "female" : "male", + Number(numberOfBirths), + Number(yearOfBirth), + ]) + + nameToStats[key].sort((a, b) => b[1] - a[1]) + }) + } catch (err) { + console.error(`failed to fetch the dataset (${err})`) + + return nameToStats + } if (typeof window !== "undefined") { console.log(`trying to save the dataset to the browser's IndexedDB for faster reload`) try { - const fs = await require("indexeddb-fs") + const { default: fs } = await import("indexeddb-fs") if (!await fs.isDirectory(dirName)) { await fs.createDirectory(dirName) } From 2efb3816420f28cd880cb0a23eae62e39a876260 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 23 Jun 2024 16:32:54 +0200 Subject: [PATCH 169/346] 0.0.32 --- packages/aitube-timeline/bun.lockb | Bin 159708 -> 159685 bytes packages/aitube-timeline/package.json | 7 +- .../src/components/cells/types.ts | 5 +- .../src/components/timeline/Cells.tsx | 2 +- .../src/compute/computeCellHeight.ts | 4 +- .../src/compute/computeContentSizeMetrics.ts | 8 +- .../aitube-timeline/src/constants/index.ts | 3 +- .../src/hooks/useSegmentLoader.ts | 3 +- .../aitube-timeline/src/hooks/useTimeline.ts | 86 ++++++++++-------- packages/aitube-timeline/src/index.tsx | 5 +- packages/aitube-timeline/src/types/index.ts | 2 - .../aitube-timeline/src/types/timeline.ts | 27 ++---- .../src/utils/findFreeTrack.ts | 3 +- .../src/utils/getDefaultState.ts | 2 +- 14 files changed, 78 insertions(+), 79 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 5a7f28eaff101820a912c2fea14ecca7fb3dd77c..f4b89ecc3113d612ff1b0daa05cd25297fac82df 100755 GIT binary patch delta 22750 zcmeIacUTlj*EZhOGRmk3MnFI?3knK?fJiWlBWA^{2#7;Y229|tab4F?x`o-@byqPX zDq_xxIY-P9lvQ`luKL}lds=z+efD{u@49}!|Gv4rJ$0X|t~zzU- zyE$KOG-F4jnX$u9Bwv~{>q%DQlO7S1pFG^VZBJUgvEikw5B5rsCHjatp^oy7x!I$y zu=LhUlFCX_MzS$3Ic%6DMa3ozr7|O}C8-?ramILKVpvMbUT{755Xfqfp(cLcMv^SS zeQhPF0%T{C{v5a!_#sFO$lcY|>*qjHdqz7&re_R-qC6Dup}@5n&mgJcS|)kVUai2x zLA~%FD*957c71dW)gY~&08~x}&2Uuf&rl?9SE`b}l9Sqp2Ry8lb$SDM1Z`(TroqlTxBN)Ag*Op~O9 z`0z-oHYPG{B*~pFYWZQYVX3K+5fVCQX6-ztp=z|Dk?M5;NyFy{N#40=YI_v_$;`S{ zjH_DeCpT5jgQUT1+*lnoZTaToUvYTTv!? z%uDH1dPZ#I$awO}UMQ%*I+M(Wq>3XVBNJVXDbhgGg*_n^eL{F@vN1j~GG#=n5&aux zjE`^~ktp@?Q4I+($wb%Kgz&IbR1#~9Gp0%*zG{ACO45kPO@{m-41W66_Z>=^MnGzlr8x|4S z8Jr@ZIV2hA21(`ia#qGVeE@31w94qzPLdGy84V$+c1uWmNFDNN;NP{EBnQZwkYx7j zAXQ%n`4z!C2dmNePi`|!mA|hM=^5H0Q3VxIIOiBt|9W&%8?u8WH!Oypq-TgERfUXB zK?mV;Es$TfRm-QX}~;}QHyJ--U2 zGO*nwsSfy&uBvA?Kw`zrn8sV0*H6FOT^;TjJ=C~73rS%xG&w9hGDVU)^i=gfKvJ`} zAt_&*01?JyWdU2rtM>5xa`oM(m@FA* zlG9Vwt5U$p{s>5_r8^{9bf4EOZ=JpZw=Wvf=A%^YTyV-A2U!g=0HrCvCwxhZN30PI z<71ho)_NIw>VJKdBky7=EB*5@Nv;0B*NX*;>QB!|7^lt>56GIRpa&!}Gs;8K+^#)A zomGF1Rp2ha3Y*j*f<;;RTf8>^M<1{Mla~UR&1YG_!cm z%vYDc^yzc!i=H`6ESIwex<~Vy#b>TBUvXiPwau*yQB{9!wExN7GZzjnzIv+uxRD=@ zZfvz6b97kQoVQkq=6(L!HYe*+-IzsL-IBuFTE3pz_`9~JynD@@#9k$rnff;9di5>& zrN;|yG^{VFVwcT8Sr}p&Zs~U9WKHZwIiQL&aklo`({BOszoCEc}Z6v8D`o?&6BX72v z7ee1rA2w6Iw;i{}GJJoAGQ{Z+3wfqJ*E5Bq17M4)rtc3!{E615=$v><=(9ycGFB z=ZR?a;l<5caHD%5+sw1v17*iryvRL3ccr!@CG+B%e!7mh-SncAei>5Tm8RihxqMw- zBIha5q~8YS1BN(q_GZs{mUp18feY&4aV~zk0Z29B#nt`T_uSbhP=5rR zu0?>MJzYadYNoIx_`_WU$zbF!1R_;IrfPpMOEDjgfYBghUSc3i!Q$q;xRIaUA1N9Pi9DqrYhtC9 z_|F4Vy+xt;4vcD$xx2f!-V2*6V(R=#;>K2i`fJcpSiwqfZ+$IXN};3npgWja9wD#) z!NlOt#@_50&uSg0H}h6oQ!J62dn>ai0ZJH(K4u|B?olS3{*I|IA`YfmBZCapDbXDc zMqN^e?k5u~t>oPT!#`6=YhU#`)QQgb0aIN8#(v~k?E>{Dpo4Q!7p9fIJjRjy43{Ec zx`I(%N;|q~VEwpjkY7c6KS{#B3?@ku!HVCpt+qN#{>F*&=4SocT z&H;D)X39hyf)wHjD^T`GA2X04ib2Vk(D6#@Hd3m&ZBTbVMYj~GASG1|?i-+9ft2DI z-7%!p+_J$KCcds?3o|5I@wl!nxO2Ba{W(&jO+-mMZ+*3nS});9U1zYa+!ZV3Qluyf zl$!)A;KuHO`Wgl`co|O$^w#wQL#^=I3GUn@P!8$Dqk9DCmt$CPEiR-`DKarcv!}N{ zIONM(g?P{8#-4%tW6)9fl;bb_y>)VDZG`(FMe7NymEkYKy!9@)wG8^g=7IJ6!XATB!)i%4j5dM? zOCFgK4@TpK`#_Ml{%0`Eb(l``<_VYwm^w2ZdZ;CFT?21jH?ZbB4omNRq-X)aY{7zd zjr3qxps^fOfe}=@vVQ5igHcJeg@tA@m^x~7w(s4B?Oy6wsT+VWFmkARU-=n~ zN~)_sfvKdjfai2dwWq z`Y9VReSgg>h)}&h7)GBK4cwP!fKlUWupI)Ur54_VZ(o67vQwPHW6cJr{!{PuW56)m zGAyYf_Lw_|VP}YMbi<%i@8vte$opUoye-~>QF$5jx&mf=Lw>u1-W(A`!-YFRLmwjK z6U+^S{a!HB)v)<5Fx4)Kp+_K4HI4~MlHEQ;P1$<$jz^E477*VqQ5VZwmm#Uu* zW@-WL9Redis5i#XL-=aD0J&`#3H|smwFPy|&wEkvGgJcG*_$ zJUmb@MQV`Yf2I>!j zt4^gRUUFl!vg3@#9dx+XMVdIB!Du?D_t+`i7!$}&^Q@RaeOaSwB-W-tZ;MV~4F`6ca_bozgqe$Vd@9(FtFj{RD_d3k8G_XO64KFaW?toE%V$2ZN zHfd@vFkdXEh?#{E{DBvy1+r`0c}$>OeGGRQ6QJuih752Ww6wU!rPbZ=Fee}-v?qqHy!jOL)4cOHy9uCR&~CrXkpm}L4meA(djn8;ny zn>*VhgCGMnfKotBfC05kvNoi|$ERDTmqVhlNsEcCd`ikn&|pnbKL0;RI02vkn~JGB zZI!G3y|hN&08{?|F4gw`FD_7P{@*M9FU!^W50=t^;SMO3=4~fB<_ws)iqSAi`{+M> zNXozgBKVMGId#8HFi*Ecaw77`SCb&A*c6kTX420v@tKf1dtd+g z!?dumT(>SU$gWh~u7hUHe(zm9WJ?cQ`RB?T&iqkOb3|OjS`SvVYWBjh!0%HH&qu@D zLiW4ICAN8x-q-P9Hvf@5?{8L=x%+gB&pBJxIk8TuX3z8wLq4Cd+8DcWtpBhRV|&c| zxYhB%q;c;rHpz*(_hw4W<6k!CeSUmu@Yzc(y8aSVE__$ly3K=KO5a@3ap}!-U9cK3 z>67Ir$d){ReJCHj!GgPPFtFAnU^6!wSbKgIY+AMj_s=%4 zU_L!Nl>2P5;Kg7D?z<_JKL%T}$-qK*Ay{UP1rNzFur7Q-PAKoN*@Axr>&AmOhw`^z z>oyx$5B?5p)fNjraEpQU;#pfld7rHo++wSNh4Q{zL%Dgb1>XhMm+Nyw`8Ke)Tm$RR z^T390v)~Tf3~V4bZVTl$c^3R6*kEp(7s`)QS2Hn0S~ zU^n`=2mJ#};=y~+Kd^Os3@nAe16#Eh{o8B6wpYI&{oA*TTkJEiG@i8=J=%{R?Kfce zo`<~Q2hgJf1~#4>51>Z}(Ic>QZhH_t0vmtOfG6VlV51MAM~4jTTb_0ZJvxjYflcPl zhtVUjnTHK*D!&Rg?Ff2w#K5NW=||9`qv#RX4DNdrJpx;D)PTp7gNt9I+`#7ZtmEj>35?hY10MGDJ%JHBi4g-^!1X85 zKd`uy2DXUjfek-}{+%*l>uNlO{+&kuz?N~_)94@A_|pdV6VC@5eFptIV_?7Vv@_`6 zS@aL=SMGck{R5kM)_^BXSHY&8L;ubhuz#L@4*ffi{(-IGzUR?DuqEdWY#lEI%e;X8 zT`=Hb{(=kW-$nEfESm>kME}6nT{N&9{tj%_CG_u-fo zzsrV@JY`8%|1)!&UGv3-8n@4Fm|QpaO`C`b1)kfZHZPpCqFwyh2gSirJ)YNo6FPIt zA3rQ8UQ;~z?3UgadW{WTKCa@c?DMDX-kp!%z}H=|;c-_CYzNP~0zX}apRO9%E^fRE zKV5^L!1i$4Yw#1;_-h7yCCCRGeI0(fZeRy^+I9G;0Db~H#GMP^C$O0X26lvB1)FvQ ze!5{``F#2f_~|D61a_SJ-h`jPmfSS3le`ct^A`Mc%Mfz9WDlL!hV7X2p~IZ4w&lma zzP9!9DtV3Z#KDCD+wZ^M(c+^xc+oq?wQ-K;`WCudt;KK^mbqEosqR>%8|pWN{mhx_jz#GXj3*Ry`P zVb#K`4q3T=Rz#PHW@ksvoK(eZ`Kk+DZw@Q5aGmABw=rzDF>JRD>^y%5w(1Us?T&$6 zM8p7)DZHjmdV`a9w!;M;Qf!mHqjJonuHT2|753KuE&Y{!-J{?)ED|FEQ}p~C?FvDl{5)AdK(56*Tf)wEV~$d@l@1X?Le!Y6mi zc~a5Ob^Dj=u-b0y&odou!`=rC*tc%$jM*m!RfxWE`buo;p5NUr&N2V%Q=VHL+mYP$ zrA_*rg+IR=*3~FZyNq?5x2bEnfCXdEw(W4_^7>5`QtGXlSZH-H?n6bl19h$ickR;k zsASTW#A|mfv`3(`hPi zTE*&J%!{8semFUDnK9)3bhcx5xf!x|WKLe%(r106t1PnJy!GCpmn-h>Dm))KP0pG8 z^492Iua}z^vu;JRCj(1ZXTb|!Vs^a3?098hmVCi0%#PQX9bgrC@N3KtuywButTKNG zw(1RL#~TBy%Cp{J_P@pKe`{dYyzg7g{&$%DV76TU4#N)?_s)P9%6VYJ-(&dS8<+z( zzQ^!?!0>}Pa@!9Wez5T$3?Vg3dMZY=t=AweVr$)YX9~_<>K(XwsLSqbr?n54y_beK zJxkqu$9Qqb(ZzM6Cs{7A>(p`ar}ZHfY|PDf+%IT)_JVc$`xkiJUpCzJF9WO1)BZvj zeMA_6)#c6~5k_D$KN?tleidxmCxp=_19RrnKVcR5j8z1zA@}`^RRnCwX9IKPg`Y#` zXEKZVA!Ao1)AdmJlw}s3 z>Q1$vzry^-hGp8O_^0k08~h-l_0l>?Q~iS04Qf!+UGH(M-^kVnKiRK*f7x+zgP1<= zJ}k7VAGG+|;Z}dW`gvNs%e4}5W)Qw*QSD*Sy7$}TZP}o$2;v^{s3)_lN93{p0ico}!d{T_A1chrQ zD8fZrB`6wHhT;Y(B878hD6WuVW@RX%#8pyEs{)086)22idKD;qszOmriWuQr6^h5C zSW*>=I8jK7%xX}CRD&WxET{%W2Wu!kk|Ie2TSM`d6zi;^ND=QyvC0ODfi_T#5Lq@* z^s$A)!WN2AqOUC!=GCFtMT#_`uMWjFQp8n@btw?i#qCpKPZjfTKaIOKx6;jNs!3-gEbI?9!sce7w z3W51`&-%2!*6z~xq4TFUK0Uq6^Xs{FuGec;C%jE)<}Velrxhlufx%qD$c+~-{}(*}&(eYKN)$`BU(MxOs@*dUv(0o@jjKNuQc z*Q)kh`>oJs{95GpV!`APRy(c z^Qs0ddywL|Al_li^f9kR_uI{0G;Cad*0+AaEB9r*i#&E>*oc)ikEINrSH}2BTDxTO z%nGAx6rJ<`dEAMWvnz(3?C4#>yjdm9OPIE@`IUvuM>@Xzb(7!dy=k|nJPzG7{)b;j z*0hWsd0}SMgoD$4_lc>tF(>BlkIujLX3%=OJ-Tv#mfh6hT(=t^I3t8UTV2x-22C!B5St(=wKEziYR&vR)-GqI#L%nKb|@l@529(@NI=HHQCK3)`h zs@4zo$=mML(@%Q4soB(53#-j}c%-$JJnxh9oJU6vFS1+Sc*~onccRUbYu8`V^Nm9Z z^X8W{@BX-P1p{Qa8vWnvqJIebx!Sic1NYr~b3@-!v;w(dY;ZJ&;HS2xOi zd9B`$6Am8C(;PXhF0 z%UIG`Xun~O>H*(_?OWG)4)y%W;( zp}Pnrt$?khz~?)Yt|HQd0cvuF2%{>#H)U0ZDwwXrhn7-GRsrbA2UVpm7Rt}pr6_Rv z%o5pD1&sl@lHQ=;)vNOP(Nu*E7~X)pG~@&NOwn? zs{h5LyJDKi!xxMAMXZ*%FpmwdNaj*ybTPfWSRq2@v&I%fkqieS01GjFK1*RWb3Y=7 zRj1LU7c}*N`oK~Yq1PuxOtcfMl|?P+9s;d^He$X&gf|xcnQT;5dTlcZ7y^U=LxHwp zUnc9XqnB$QqUHh?m>aPG(}dL!yB4yB*e4b)WMj)_lDqI}v{EshDw3!-w88impg`;f zv<6xMG+;1E3PidJP#LHQQ~)f1vH(4L*a1)sgaO-tA;93=;zi7krH3Nj251T3MWYl1 z_yd6eaq3@d0Pl#ES8qKaI|BI40{yy&UTV^Bup}%Xik@`A0A6oO27ox;nM+tn=yj+> z*VDE5>5kM3Q;~iKq$v7A_5sLsPxVa(rUKsq(}5Yl55OE?Hb91_6QN%J2+RjKFb`M) zEH+^|-~h1O#P>t)1NH)187lWDKy{I4{s7JcF96D;a?gS5z!l&D`LqCu zXTa~k1>h(^7o7!;1IK`T;0$mYI0c*lP6AE~4d5oA1Dt@pz+K=Da0|E%+ym|dPXM~U5O@eY z1|9)LKsqHzNd?F{tq^f)xTHJZg1-UuOp;zhh5^)@55Rk1InWY#2WVv@P3h*4=D4mj z@Cj)O){iv)e<49pJs!{@6H4hbz>t;z87Kvq0n4E(1F2O`m8=1%!Azh$^5P)rIhkf? z82BrI45e~ZMl=2`jei7`C3{4xrxjocR04?8cBB-_5dy&dffm4W@EQc9JpfmLde;cD zAwV5*0-TXv21$QNS|6Z|r#)at-+pX>s(>|64X6&-0#q?IOnH>92U&;GCQi?|oB&6l z7El|g3%CGO-W`&>NM5B4>2m0(aW|kG(&XLrCist(L}={&AX`Avw?;3(6KD$f0KPyo zfW8wE4+2^OU4YI&C%^!706GG+7ojrkfwn*!fI37U8ErtMQ(F1Z&5PVi?rvvFQz5F% z43hFR8B(Gw>8VlLN>F1HfpNe{AQeafl7U2kwqEf-91sf_8OA>xiJ<^l8wT_TdI3Fw z9sq4HsCQ%xHP#wwGM4VNeStneD9{@qJ)s{k1Q-mECk6rZsB{3Jm5D%lIE_CQhysQI zkw7${^_E;71JFfu0m&qwFASmd2!P7cHg^m#8W;tTk))?GX(pXkj<{AXos=4(^mt^_ zMH#>ZfDD`hOa>+a-vA{mCr;N<87-f9$@DzrabPYm3z!4U24*tMzZpnO2fhQQ0W|&= z098URr##XT|GWJD-{k#Z(v_@(8vXmVD);-Ep;-p2l$|maC|Svm;50Rdti*r#)Dn@u zu~y7CchzsqiP>p?A9?gj&VXu_YR$7^o^D=l9w@j(d|b(F?Xr-xf@7!c`0bp{sI!gC znG02ePo8jJ#cbJCVSuosn^qN+EBm9@v~jKxA?9q5r(09ECRjT~`YP7c&Jyk0qCoG| z-_!bju6jTz(2SaDAWp7gAvQEVWl>;R-Hb*JCr1uN0WY#8*CUJdF5_MeS=t|y$!w6j zTNA2W`|JM6Rs&*VC$Ys!j=Q^?yR=s<+sGQ$$+uSa&>7mF_xIiNyKeE#;sz+_fhydw zKG=%A+n9~rAy{XDMwYIg`=nacbCXfR2PI(OIZ-p4*~){eix$}^II+6wlDF^24&UEr z-mfx?h6e3q%n=DFn7$FT0%%0v1N)a+F4xIy5j0hy(f;PY*ZHS)#w1wvRoXyTaMwZ! zYTdo;izhDas+h^_2sGqT?eG3OH{SoV?Xd$@aE+(hdF{l3kFjiHVy!mUlpJ?AGgLQ6 zu&u0G4Wvxx6J+#bi?6qPvn&yXywr|A6M>sBa@u(XYZKfz$NnC^6a_GDWRp^fExRXX zqFgiWPm<5}S$!t><+2Adn*cw%c_OCll%+YNgoVwJgBswnf=$eZsg9A2cET!$*?4J3 z8uUHftb0+%cTdqI98DK!haNnQ=-2B;i@j}-&f?9>0dfI`M(RD)X&VuZmwJ6}N zT029`$ze_9N>1W%4(r4ojlyq19 zuASjlxxLB!%;TkOQOcG_tXDLZ?uSub0@P)aCcHeWm=GqmF+dROmo z*6~G7zEZg|!(c|8ZOnze5M8!0Kek59*oN}|W=2vxd4HLaY=OACjWxxK0gF5~v6^-+ zg!VV0O8rg6iagd`wssb?^O%iIEoXIV9y(sMWy0W2NhTYbh*sNKGcjm8t8S+qClTjd zW9aI6L%Ya~q8%NT#t6Qhh1hE+NX&?sm%Z~^{wUyAnX`bB_6L+$v z_Pr7RdQAAtc|iv+Z0lo#0$x}`5o~banVrltv^$FcG%D=ArhPwy#i!X&K%nmhD1NsY0CF#j3MsqL@_cM48=ibFT2)4YpVG0`oE* zIgv3s@0GW%dGH!kL~dw??@Dk5t2q5}t*wh33L+S@SL~u1)``ogK@RZ|<@dm} zK0cz}9+;+`CDC|gz}|o&yChe$#<2jBU1EYh#MaAB39=MN5+9473oT_;{j_Y+p%W;>yT8OoKVO;wb z;_zO0wkLLvR_Ii*n01&{)ipsFz88a!u&QGAK4vDD_7`sZuyAR|QIwzCwr9mjSK7;8 z?uOcd7XF9L8}u+gvgK<|iF)j`V=Y=%S!1leq4!uAL|%mt?uiZi;JZ&^#v!;uIqm}H zShj9=-O|6;Ou?7IqM_uBE7P3@)hBQgl6l#i341^-tnEZuxxs=78J1G-r8BUdX8gYo0t_xUfg# z1D(EF-M*z*ifio#poAkz^c}Ne*Q=^G*MGfstT=lBvAq|!M~dy|2gfHazI@_53V2~` zY1*|CP6zQ&TsyGiuzlrEOA0M1`jt`imb4>1o~()db?LcfTfgRLhjuib8$M>=lH~}g znyuB2YsY##@e2#f_voz0HCUD1ynUN#2Y=++94a_-=F@%T&=Ba{J*EDw#mVy}M#R|Pgf=iD=rHrtN~j~Kjg{R$kJU|a<1prgb}&ivycs<|RE^m5 z)sTNSQM2t|jZ&lKZ+6saDUKdt9&+bk@z)VH%oMhAEjuycD8fNI*5rquHud^A{xpRW zf|u6NPa^v$!a+L=X=qX%|DbY~6yNS{zBCU!9DdAa9$IsYMMysUlOwtzv}<@t+Oa1? zg2T(zn%;|cJWbUl!lRQolaC#br=%T)a_7^@^$k2NGL^cO^+_#bqgJPRU2``p*_M`R znk(#o%rkqoL4=(`dx&7|NEEqX%DBwwP2*+e?dA@%@Q6axJkF}wAyvAYdVETj!;PaC zH?@7Ol@a4kGkXz#oPEQli5JJwSG8Wp|5&f-zFxwHzi*zcSb)E$a%;aVW}d+6epl=} z!J_Q`=gm!te%xb}%|tabY(K_|fhTbV_EQk{+EFgOhCKcJes&lv#}!KNI`kB`PhzyS zLtV`Jc=SA3di5ccFzqmJi^`{PYt&A4SzoZ@Y0Z>I)ltB-gH=20`yV^2oy}C#{c!%3 z$ls!s>JVC;fI~%4<=dq&_oqunoxfL}y!i*WSnJ})G(-0TKQsjTqK=ClNZDc63TE_6Fbf^2RrT1 z8N00XTk9Wf!P6{dz+k4j?ZutM;ykYTQ=Gnpot%0Ij+D_P;q-zz*5kcU+?`hUCX!`8 zG2lG2vDc2xv2R+*r|y|LOO!FhvWsU={lsjPkc0Y(As4Vs-+vw(lXc?8c{umDsCa>e zn6fX+A_`Uc?GER(!q)hkA#J>X)$o{3${%VQ+UNW|7%jo0|(d{x?Iw6)_ zhDW)mc?At>$MAHYerbJ;J{`-Nx{3idRBLyj*RVXmJHz96C(&zQTsd zo>5}=73N{D9kg?B)Z22aEj*mR?n;8AMER?@0#|k|VpU3eyZK1HqeKvNcG@vM>pvM? zs{J*A?qc+fLy6Lqt1OEBAg*79m6=hh5e-(aeD!Kmc5D?aI@ltj*DHkOHFQde(n9Qz z+h0dd)tD6>3z=1UD(c=0ZAvh8<8|ChG(!-$QvDe5={k%Hh!Hjg$m<>>Iu*b$?VO#W zigW(FUCs_u8-`(-!}BtcUI2@<1A3f#z5n?0?aJDhT@N2=ipVK|<+Fv|4Md8m_jXJ1 ze3ibbmkDUqsk}>SQ)P7UeG)HX#F87RP&<35&8iH$>^@5ilmeb~r^**+QGlHnPj0Y6 zJMAnYr#+Vos@?8B=xe!m;@M3ER{1zl_7-!I9pi-4ZDv#35l?(+L!=#A)ZgyN*3n*{ z=nEu;7P?d_!$PWP$13T|k9ohvZTxRm?0kx1l>U5*YV35e?hf3QA&%TZ_%0fuYVV5= zL|>WcIMMhnoUR>c^y~X_ON;lO^F`yn>X*?KBI+J~TlnK$)=1X^PZJ%)tUK7FC*EN? zokugN`6$u(9u|>L$k!|RaGYAHY|3Lw6>Y!ds z6S4QPZ5t;N9-tR<#j^VlD@5LXHu&#`2=521@t68dSF8}zAFz_G5>3}y)ecg!v+D77 z(xzXg(ekbA_9gA8rLai{3@eidSNocy9mb>`YV6A4fR^Ve@nkqQ+t9WIiWi3V5z@Z z@Q>BJ5NC^6;ALtp<2)Wxz@jpdWk{*=b`Rh{Zr;q zHt{J#Sm3Qiu{ipa1<{KSNthS2u5wft(XW`*AUOsyz2{K%k>T}TV^@T(ak3o@ULKyG zXx*#A=PI5zW5BJz5BU!65je8>W$mQ3Bc&o%JMIj%znQ8&9F-eR9{l6V@=yN&w?ui% ztC>?j{CIp9!-_&rN~EV39vnOE-(-2QYMHBga;&iao$VI4erLaxrQ-rq!jp}Osbc3d zW}o}hGuF3iDLi);AI;=c<{^@Ga)T=2F=0`WIAks%-gQ`VLY!-aF(p-G>f{fN6T|*p zUSrpP$Pis^H_cYAusWWVLUL%aw{|yU1m7C$^QpEiIC)gf$C|vWEzamaB=1F>)1AD_X88N=M7~9x28# zk%Q=-?=)_l(;#=;Wz_^8va1Q)Rlg+Mnz$y1i?FxML5z<@A8N&@Tlng?F56uT%DIVtwqtA6;e~X+)Z8*j+l&F|_1)2y));>@Q#Rkwypi@A}^b&Rd{TOYBoaz&Y^dkqP5y??W zNonwCNNh}UTxv?(kOA>=17lOyLytlVXNHqrm-;F{AU-NJHKu>2G|Jr3fT)zzp-@PU z8I}?^AWgDvpt^D!6oZxJ)=&-68SvEcVDoiWZmQm(6t}dfgm@_`d0uP77Y@`Nc3ntv4XqK>y~S2g_xf>IttCr9;*Ns*)*W_itSYTgV7rFt#T`^P0KiS7}q$`jCD8PtzP zFD{__VFl6D?rL;sp{iPUgqpy;A zF;1EmXwkwa6avb+$>s*ffRewdpw!UmzUqa8%zPBTt*@d# z5vevG##!kq&7z~#Hj?6!F=JDtgmh|IlA2+(m9}DIhER9)%)AdMO`*=Xjxw~YKv`imPz~81xb@Oi{bQmNhhaH?3Z6paEvq5B37%R%2TB8R z6qG`VRo-nt+>jWp9c@6OhYc8jdBs1Mwr>_USiQC{D0$xjl=@m8ui7--Ofx{qrs%l- zac+ZBq#FrpeRCdO#yMOd;8;_#vOvp$`k)n}NPyH7_d!SuP-NK;NvegVhN`{115Y#e z2`G6mfbKeoMs4%;q5MplI+>1U+bWo;bEddiH)Bh+ac9|u#gQc5c@EYwi~C?NbsDRmJ%Eo3`Dp_8@5Ovi!JLXbX&3~GvdDFpTq)BvT9yO?=@P@0R@ zpya6pN|^yDnNXOO<7HJ+&IvBRl+``5vHARYBcnt45|@y902e(;S$Z`QYV7wN;d*X_iQ1T|uVxnDgaJHgZNzmDhO|6uM{->9Dq z&%S~)GH2Bda*-Y1Q9nrUiZJ*?Sb{SL0~^Wx8W{CE%rZ-!9qnt0z>z{JUeM5>-w&=S zxRTU{UhklCI^tL>p4QMPuX5l!8V2bEdA+4T(ia=0Z@!+Kr-u06Px;3Qt)YG5;Xnuk$; z5;EMG;8M1SLEjK7Jn36d%WM$$Yh=`)febkYLkj8}^d(&WWC#6Rkr=8#^25JPY>Z;9^peX6vg7ZNgIC!4{t`WFW zJRANV0oO+H#kwBk{A1MsT`)>MJimT`J{2Wj=*qlVeFIy^^9)A)J;*4&Od06vJk8gr zkEpN8kW|Q$h2WYf{bg4*$Y<(vf4?ABgQxi!_1zn&RZMB{TmIh9sCx!ku;NlvxJyI9 z$Ta=e;EZbLaH0SlB?X4i&7gB}lcWwj!?UR+3e*>kwl6WNxn#y;aCAip-ptLQZ{elgfI6CG_nky7HE{Wd+;5BLHakSCS@Hj@HDV4 z+%L$;#`ClwqkN|k-w_m~xAoL4fb04W;An`DtU(6-5^%l2VLG}SaMXy*vpo&^V`fgBPo;QXbE7_~v6@Q=wZWj@4vz9gb>bm7x*Cb< zV9?h@v&3P*JPa(7zi(mGFMy1CQ!J5BH&LdH&H!7L13>Cy7l0amCO8)wFnU!@M*8M$IW>P|Jq%y!J*`iob7f)W@_?J;54? z#bR*_o*oiZ;TD9nC^1QrEPxs%_)GiRe4~S9MK1)QwYds4(w)LW{=&W%)#=kvr)D`a zM3)1u38q?r{w+#K7i1LzpsSCYccfyGCFbl9r8FER)!wTp^;Bd&=mygp-mF8Zw|WKQ zs02nAiBd2R?A+7>g_cU?Ym~4ABWg|BY6~?(_Q!&Q1sHeM+MrtpPRS$PJ(N1}KrD$q z?bJL`ZUiiu=XEjaw?L+*Xo1n7djU>qn?>`qu15K;iSOtdq;G<;K@E}!(bH#{Ib^Vp zL4OmRc~QdM#XUqbDZ8#g9|?}~rwnfvWYEn6rw;cEl;|3yHfCd!4#fsv_cgd6a!=md zf%|t4(wFM^XOmc&{J?cr;xHX0C9GB-Q9@9%N@1X^FoX?gn5_0D(SMpc`36t$E<~^0hb?u^XK_U zjs{)TIAbayFiGGjg|NtA9b5~JT2_`e{X?@R`oRL^1!K*liZweE99^ewKJviPyjM2@ zzk#D*W00EqT865M%FNX#gCj*{X|>u2t~)jIFX1W)(ch&rA)+PvUv+Oo`uA|v2}ANg zw}KL`IB;ZY1zzCjYXPPS&o>6hkHh$fh#s#DjX8x0PF>KY*b(u42l6Qr*Z zu4QULJA?iiI5G`4Z`>I=_oR)Q?z^4{niBGJC?RQRmBRhowU^qjlB=v2Pm46_r$B}U zf|f+AYRAD*NY%Z7b#F<+RLv@{tchcIT9i@$6tV%3Dfe)Fmxw>72!?JNIMPS%h8gtd z!1*W~^<4@1MiIbzk9pD^oOxy8q#AItx2 zl;~>QxiRoX;HYI~uc~*B{Ig~B(+eC$TD@`3iR3#Rg5+xo(N~O8eO2o8vEXPPD>mph zgToSG3}7}qZGe&1%K=9H;b?7SaCehGMsxpxLHhRn)bT(-a9f)Tt_hk!h>^X=|E!}~ zQo6rtC~ zBvvq^!R8J)G7r;1(gD_3Lh8^G!f;KzQP(|=;`Fga0Gr1B5{&YVIG&ymq^~qc9r}{W z{kaV|iiz6U816U3s2_{(k7TG`8NwWJxZ%(&Z(z{B1xLdxQK~R6?w4rP?~Yd!8EwF^ zvOF)*sOyy=Ng+HxF+jf>CAEiUslJwADCd=N^ng@K^@qD5X*N`_=jOZdiT^n?;^OTZUX1e0~-a%Pg41g;X!);Vd_d;niq8N zwFDD{zDg_i*|Su|^8*8P9foVAX(-_~2H72ykUJ>3jL=GbP{Ix&FhKtUmCzD~1nWZi zk?IXY*?j9qfTR3G9nyLOIPwqQ5wPcb2#y91(Z}G`;>_acq@&q&7( zC7pVuQW8pEQAxiIC7OlGDxvckElGovZy38#>Z6n#GidLC?@hYVD0Np#XSI^P?ilm7 zh2pQ91`gif+sJv8Xib6rkk`z_T~)a<38hX-X)j70lu|ildrPI%1*IS=m7ReSHhlPB zlK9@i4VCdZo5j;J{q3C~BglX=Py(n9FkX~dC6l343!o3tG5``^BDp6(pW?IvcuWQ5 z^S?mh6+ZuO8X|X)2+HT*(JH8kFxUT`s{Q{D3hI@Azwm!ajvJ8j`ENR)A?X9?c*r#8 zoL$*VnJbC*DGmH9rLjIh@|=vZiI$nxD18l?1?U7&irHi{{nkvUo9Qf2J?a;NlKyv~ zB|%r1>sOoUkLLQHK*@}aX1WO!|D+uHPyJL?^3Mqj$^K6cDpC0|;{PWH|G&?{PdPQ_ z%awxj_xX029Xa+ytZQXmfs<{U?4!961M6(b>fYU|`Y$t9uG-xD^U@V^^2a4XRlb^V z(AC##U5&y~7e6+=HDjaaWj3*Z$E;5ZzG_%8p=WNzNwL37NbZ)CdgJTGY)-eqD@qLX zGu8!np4yE53M>iM8gBz&!*Pvf0Gi^7)&? z_`J_wuJH3TdcU%Ruk*Y!?%X<9$T$= zKDe%2zb%YgZnNSE+e|E!=YiV}&MDV~okv`57>~`h;wQj`bNlUK+-|!S&)9Cl#=H>R z5pZsKCKkcd^1}GYJS$!Vt}m~*BaGMGVa2EJFtI3p1>9wDfjdpCAD_Gv{_TW+;9|Jn zF8H?#{_Qfcf&3A;hu}i;O)QSj&xe2c@DJQz-gYlQ3fC9FzXJHM&%}oDxP9=iAfG1`m{=OO-w%)W!=wEsHi{R5 zI|9z_fQg=q9e_s%;1Re?Uhg10ItY&rnpif!0`4-nz(XcBmQOwej}E~jaO1h(VR&>H z9vwDebM*+^LvSHSOl&fre*_*Kfk)t`@V15Us1P0%n%GqS9^5-{5l2mII$v`X9vy{8 z$4qP{4?hNvj=>{voa>LnqvIH{<0dwT=YiV}&gq1S2_AO>BX$Dbf}79nPr|>G@b9FF zE#!sZj(~GJWnznY+9~*V3jTrnj@LU4|4zfd(T&)&I1E zuJdG5ewq}}AZfV8Pi);w>3qAd4Q0a`Unb=|e2;4((Ava8{kk7w? zFx^0yz#ZdlZz4=L5vH3ayybWg?%hqR%qN{c&f9g!xB9W}g~uj4?n^kCyCbaQY5kp6 zV=vsWJ=Fc&)Dk`0JpW;WOKz`auSbO5IEo>^}D_Yd$mhrb=Uoa>ve2AvZ!3H_tKVp@hv-Ub=$e26vzPJw&`8BHj;8>;ZoS?jg94M<(`&&wqq? zKSI30J>hNf45Q6s#QU*{J>&1ey#p8V#KeB#Yn~u2pCB!tn%GMo{uKT_g@52)as4y+ z_slA@g158yshyuk&w^n$UX7e-*kNfiI=^t@pzsfi*LAX!N`J_y@yEzbx*FSB-Yxn# zXw=ZF{UQS^@A!iD|EM}Kv$Td|ROQ+#BS$`s_ctDCUaGWna;hr3tZnzE{0#I3_c zKk65hZTZLXCJjnVIx&2+>vH=!HGJQn4Nf<0aPnPPBQ~_mz{?HxM7Qa6aXMfB%r5gg z`%lBaJ$?9Y=_lb2{@|ayCw@I6>FmMk`&TkU_<_3T9^Cu3U9H7S)21Ewa9O&&!IJD_ z`^#ocihcI6W0;MNW4oq56|?TQ;?^}Aym8@mN4vf59gcVWuxiOuyK3;nSGKPg zbQn3UUu+qdrz=xD?7Q#ZRAYHVulTCR#4ywO4cDH?^*_ev#-)$s5zp=TiRUKvp4q4t#rjdmUSjZb}TmwBMT&AaKKH~0DvbZ^?{X^chhN8R>5UmxsT z?s?}^eI_iw<<=*mVr=P(Rs836>Ut`#WR)5(#>QqAjCH=rKl|ps=>58wb!CcMH}&w? zmv&Bd?}aX^X7{k_f=$2Hw6!0(Vs*hK-OzP?s&ebM!LORyU94fB6>o83-0r($ZtUy1 zc0;-S`=2i!f3=^N$ga!--`Mf>Z%oXJzkh=X@&*&+t%;TAYu;jlyu}3h&4kBJ;lE*m z{Duhvt|HgJ!vuMU1>l{DRpxo%wu5teZ(>z=+I`SFo2)G7w+On`Y zZJ5=Z^~}WF=DY{@j#-Ha2G&EYVJu9nW)N7(5O|7k8G;@%1o~s)h=pYCXg(Nsa0=JS71d6nh5R5DdK@kaz zqFyNo>Xw3FYAFbsi7O4D?)(ukDRjcpNw`*hnH9JQ8ROzleQ!;!}SKZ?oFD|xdSNrPy_G>~* zjcK?gx}npy_^5J+&z|cS__pu1W`~!Gsim2n_=t9yNwh74j@pz#N9)T#5F*}_;2jAf z%0kdltSJk@>aq}6SwYZQgj+$-!wQ0Y5_A>%au8USW97tg<)INK z;>zQ{*zypZAVIjWw}!yZ8iEXK2zrS^5*#6cn+*gJBFzSZkv0$%k)W@rR{?^$6(E>e z0fH!Tg#?#L5Lgj{eqwS(2qsm8;28;GgkL2Hu<<}xD?u<&JR-qE5`N=+dBp5IJoFVXaW>%R# zKQ_L%FL}-%7dF;j8d~d{aZytmJ9U4%V%@t@kwaqdh6ax)b#p~x%H?IFL#I8v=f9)x znJ$~VH3(nzkQelvWyZ34K(^@sVJL*g1~KfY|^gs7|Id`5~H|M}Hsk>|v)9{uNDaH#rmM&da!e7mvq!WwfH{yusANK?JU zn>Wkk=(0n5>Iw7mR&vHt$o+;23hPsm>e;^f5&Z025nek%9UbNqB zm&Q}7Qb;u$~c?Mpec1kpexKPYIyPY78ieUX|_z?^;L=9 zRWELe4Xo1cnY&xF$PH&MpWEwrxI@?2;nU`KIrGa1pXtBV|DkE#^`-3tcKVEP+Bok{ z372B#O)YL-)V)VLHaMmA-BIp|M`)|<-@J%i((HwGE%(!QQ|~6f@8ohY`*M7%R$2C6 z+jXtN9d?~RbuxB*fOG1gy=S{L-e7rg%|7vr%sc8nIe|Do@4KD0=7x_@(4{)N5rPv6$f}yEZCj-pu0WP2RToea|1W z4^4XfTh?;lhofIq+!waEPtBEmZ*8f+vHxegdVQ}J9Dg&y-v986xs{wc-R?E<&e7)I z9E&n;3K^Ckc6{+!5mE!@6_&4SpE03(ft_d6rsOHlFW#Qpv|;Eyo4#p3d#--Jp+sXZ zH{+oB-&bj48MY$dcEiy&=_|cc7xbSv_^{W+wm}wc1{X7r7dNltJj-ESw=L**@%p)_ zZ!cRIN7VNmdCB8~LqKp!_`#d`r{mvMbxkOnXg}iDyz#Z#Ey&EAv!!U0u3bXw^7o_n z?R(=;QhbDY?QitEK1Kd@e|G;yQ+r=-`+PxIjQ;I~y!|}ntHd?O=XcNPHagj3x<~su zr6V6K*tf3bi1n8WS6rJoWBq^~9b(s6Ejm-oyg9jfHCc;Nc&2VqIu}nbOXER%fwQRA zkVP|DWH)4WbgNzQ`Z^bHMp`gZ%YE&}<}o%zO!Z*bbZzlGU7wq6WQlU_-iE9Z6ZpTq zj-19~?!%_oYCnhW7axaTM5>QTUp5z?eAq1Aqn75TPciYrz)F@Yr93^lMR^2ZM1 zlYuRfAGOR~;>()LY>v3?&!(`H+=KuYCd;S$=kBh<)+$!%hYgGCPb=i`+zcZt*Hu4D zjr;1^;@~XS)alb_^`odL{;N-b6<)YD zvXTeN4V7q}q0c0unrvLeuy3iy0$mQ_MI51^)K>7we&0A6b>dcvGo-=9ty(z~RND za@kzS$R~RMFCP`zJi+FmiTUO#2Z-?!QK?#JmN|m&fU+&~3p2T-D%a(}FXrjY+ z<|=wHkM~>j^HOQ4S>}Rr5Vs13S?bm)!1 zW)U)%d01tj7!C9T`isePSqiJ3`w=y)Dh(vPfT{!31sj1l%8CMejuV0#QJ;D4frF>3XB+De5g?M%FwxW&!KPn6oHY$QrOn@oXU* zReA=+2%p|7$=>P_Wc~!;Yk)G3Lev~+2G9t>5Ge@dia-UxAG|fF6;Kw?1Fs?50c-~% zfn0#>>XZ9&5p!Uf-BBj%gMlC*5HOm{%|M$2tpH4T`fZcc7U%@D2JkZ(l4#pc~MYeydD^9zYmC;l__Cq;Q}oKoN@sW&%F|TL4PG zX}}a92UrKJ2fhWq1I7bC0&4-v>@~o0fQ(xPP+v=c#lQmeFU?0`9xxXWz*t~3kOb>uYoKe8=#12ks!}08WREXo(vfWOaLYWlYno4slW_iIzWa~ zIg`Ae1Iz|y0UTHaEHr~cx)fLmtOiyAD}Wz>?*Wn%Pn3q@Ctw4x5!eK52B@v}z*b-z z5DDY~dh!qdNr!+}z(HUauoJKZ_5-_t1He8Y-^>?)?gjP$nhxpx3Q$`VnU}y>-~~W+ zr1uMO6}SZ41FlhgpQG>$I0qaC=%UlWQJ@ew0-OR)0w;iDz;VC@Ae}S7Q{Wq2Iyk#BC=Mqp7dOR>p&5p16%;=@HTJ@xB=V* z?f`dz#{gab5V#LK0DcA@nQ0~oNr9}>l!&K}i-+?!@NWT2CP{BVBLVW}1MnXB4hRO` z0h%r)8I}EkQn-$G7avikWc>s9oyMQCdNg2xN)mnoB$PiB0hNIg0Ci9jRBN0XSqo5y z0-)zj@t~zaHA5r8zXr%q(jy(scxtB~jel{EXyv3YAmsoXfOy(}lz=iJ5PVZ003d^^ z0Zu4;0u2H3t^sI$fE;lF>Y}^^v<_%(z!7i&sshSS9V($<3seT^kK^nBYM45vIx5!! ztpQMH#JhkxQyFjtsslBFdH~haMw_BYQFRB%SnAvjD1-86zyswt5)wmW?~ig*P(M%~ zz#H%a41h1t7-(YVjiA8*-O57%6VMK54baA;4L~|y0WE16&?agKkO0I3gMnBe8i)eOl1QK@&<*Gc zbOAa8WI1(Dec{fUsoX~C7TN;{1G)pD0NG6l2l@hi0CF<|=neD&G@X7Z4+N-w01yN8 z2jT$g$O52n4g%;J(kGh4GS%A?F{uD4)21~I7y%3iV5K4_osnjlrboP{N3!DO(Ws+q zGJyf##GobRj8{fXbw#DG*=0Y!p!|S(VIbQ27>^0(=8Z1||YD$YlY# zjG|1VILRz08S$j^f2T}+Ob4jXsQ|9e{97laRJ>uc;@|X&>l81O1I2kVbPhnXbH+;i zhtKY(DlOeq1g&Cz%#b^B6?0)77o)B;vh}-KSq&SEkBPQseHy#_xHra7n*YA=$mN{g zwiT++wq_8!dqIB{P!`uztz63{yGGaJmaIM`^vMw?Rx^8t{V2LX;mGlmkE?d-<8I0N z7~DO*+#5-E1zW@H*&o7zh_z_EhIu=Xo%T@gp87m3{Bz~~Q1@|fLS1=@v1?d}-CvD_ zf?{Ou!!@jXsVZ0@vc_BYj*lP57RjuSr@JTqNoz&oCf1;4P8IVXd)cXf#TLHjxo**o zXLX?ngP1e@P#D?rF{RL~A_N zMjxICj5HJ)R?zS){qjluuPRx{ECP~BkZ6A{+reYsa{HtEE8!X+*oAA%f5@NpF`jKq zs^0RdQse1vfvP&<%r<6Q4JGZb{(G`T*S`AgyCf(zRvjNN%I9FTv{L}qC3TApVczm;XEApRYtKgI-rd5+Gx@Qr$U23G?A$yFa2Z2 zJQ|T4etQ-4ywtdl62CyfQ9G-^D?aDd(NnPlq0mGf;f2+O^$BJtZ>TPUwlljX+9?N{ z?VU{p6>F4&rl%Tr?Hq*Lldh$1>TuK&H8ck?J$|h&zQwf;+8GNeyF!25AeVosXeeXW zKs#;#`$GVq0+cA!(hhi?W{hVD4g?H0N$eX%7eakj76~-N%>^>b4Jp8 zpgiWyN{FI7mTjvYrJ(&GrP{to-NCwuK08=dTkTASgU23k9n-h{P_u&dPF77(5S4ba zst(!-3<>qBMX#M5-BD(g?Qm4G7X5az5J&BVg(>}KZ`yUW@TSaYp}>kL-EJU`??g7c ziTgX*LdHb)E*64E@~3uT71It__|dh;@(<%b*EGA2oHhuje2k-Z^1_p{F7{=uRBfk_g6h7gMQ) z7Gf1zknbAA^*u1{xk0?$1Jkq<7d%!4?frRtbOx?N+*Q*e_98(4W*PBO6=sW>ds(Z} zBmLE%AwTmMxAtO+CkwX%EKJ%T^dHM{Zf6|Sb}Sk;xO>q}Ogl@Vwu`O7d30!zR^urh z3lO6VU|dmvm|K9zJ`PaV^s%DvVOCk!2x&M&cpPDsMdUtaAunnwK0&>)c4$M{S*^O+ zjJw=g{`1ynKKCIj@Q`KQu9kafa_cN1zXs~)WQTn#W z`y+T|&&G%|r2VaU0wOOA7SE3&1Z#tZ%K_<1)9iQ-c0S}kYmM9iyxJz>{mw7AZKO}mHTi0V#q(6sM+?fMyc8I7dv(Yi+M+wmwc~{IDUi;FsH4&y{hO?h;-0S z`k1zCbLhv6Qs^w64t!DY%*etWw6(L6ZfC{7nLFRec>;dB%M zYAalk+tnIN+F2lxZTpp}J~@=OJl^UWal|B+9>tc&N7Bv*x&7(HhPpmh^OVMw1xnSi zQ=8MmuEm=b?@OyRPZm7-{L4gh#H)VKQ|cB=J2^zYK4J8{$=*X`hV8Dh=#CaIk1<<& z_@$jPvc{?C$c4?V-l{rc?_OprB2P0*5p!ict9oY&jePp~ z!;B~xk1G&&I{rj#Jc$w4jz6*J;nnR#$+ZWeVcum97kANwgLeMOhU+_@x~4R&3I+2n zR(00ze{@zotq2c@x*RIJ9J6we(!64Td3&ctPTey#)=p6=)nU|#qh$^PGN>mGM~$#b-4zJ;p+X#8&{OC$Q8q#as^fPJ#-)wa4PG1Z z>=JzJEL<<6r)ZIQ83C;)UV=Dir`vRyd~rjy9_>n-Jw^PRiTul~f&QC*>g`I^m)FIJ zvR4qqcQK;&6*fRVIzUXj!n_={^J@-_cvohvl~=tlJCvIP#C2TZsGXQ&`>A@XJwKhB zhMq8O4DPoEM^n}wW~ z@&}2N*Wv2noN)0l!b$d4oN2&<^@>*>mZ-?X50-zUWOCdu}4>mdA^$H(7moYrJ@I zi`muKil@YQ>5!$J2-M5r@V1eSKhYOWN;|leC7Ru$c{fBo1*cWRE02Pv^tP7SG)U;u za|6WiTWqAfeu&a!>3T`(jQAl*RJi>=CdQK_5qTTiUhN?^L^#?Hw{{C=B-RMJi;(w9yDu+=?dr8SF7QH;{# z1UJQ4XOVFS;j$It4pQ55m?}*d$B3O`W-Ex#P;$@?0$TB*%#vq&&-$TrKlMwizcAdx zj|2zYWes&_u^c*yzIU)>2j5{jomUg-^l(w_9@dwWsMjm?2$R~VY_4NU6RrNNRoT*- z^5YTW{5^bc(2Z1MnIKBt#|pAyq-c5{+q(+F_%pnyD-!R6_>0N+S>L}JB1-+tJpOFo ze1*RV|Ctr zxxyyo|M^fLmmM)!e@_=R!vDo+{>8BW!mj`Q@%=B%{O253Jq`NL1NzSyU6>_aJYim? zEuS%r2i_?@7Y(1XV3G8cb;|tML0!?rC-3I*8%-5vL4h9bwtH6?ulwcuZhx&$8P+d3 zDkVnRb}*^T!jQ_zkFh@@{cEA4ehB-~#r_R=`ZAqeCA8eKf0wnu9(!mm8$P5l0xOOx#6wkjFO_Wvs^v*ok^}&M%Z*km(9ZD zeKsYq6%r-mWIr)1POdDn2FaG9cY#m|0H%PYolhuoELo{~!5ZOVkH~|^{2;k=-^3DGX(c|(g diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index a4a497a7..50bdd519 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.31", + "version": "0.0.32", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -27,11 +27,11 @@ "eslint-plugin-react-refresh": "^0.4.7", "prettier": "^3.3.2", "rimraf": "^5.0.7", - "typescript": "^5.4.5", + "typescript": "^5.5.2", "vite": "^5.2.13" }, "peerDependencies": { - "@aitube/clap": "0.0.27", + "@aitube/clap": "0.0.29", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", @@ -43,7 +43,6 @@ "tailwind-merge": "^2.3.0", "tailwindcss": "^3.4.3", "three": "^0.164.1", - "typescript": "^5.4.5", "zustand": "4.5.2" }, "dependencies": { diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts index d1eab899..392a4514 100644 --- a/packages/aitube-timeline/src/components/cells/types.ts +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -1,6 +1,5 @@ import { ClapSegmentColorScheme } from "@/types" -import { Track } from "@/types/timeline" -import { ClapSegment } from "@aitube/clap" +import { ClapSegment, ClapTrack } from "@aitube/clap" export type SpecializedCellProps = { segment: ClapSegment @@ -14,5 +13,5 @@ export type SpecializedCellProps = { widthInPx: number widthInPxAfterZoom: number isResizing: boolean - track: Track + track: ClapTrack } \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/aitube-timeline/src/components/timeline/Cells.tsx index 2c4a81ce..c7cadf81 100644 --- a/packages/aitube-timeline/src/components/timeline/Cells.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cells.tsx @@ -15,7 +15,7 @@ export function Cells() { // // another solution can also consist in rendering more hidden cells, // to avoid having to re-compute - const refreshRateInMs = 500 + const refreshRateInMs = 100 const contentHeight = useTimeline(s => s.contentHeight) diff --git a/packages/aitube-timeline/src/compute/computeCellHeight.ts b/packages/aitube-timeline/src/compute/computeCellHeight.ts index cc854a8d..0e71a0fb 100644 --- a/packages/aitube-timeline/src/compute/computeCellHeight.ts +++ b/packages/aitube-timeline/src/compute/computeCellHeight.ts @@ -1,4 +1,4 @@ -import { Tracks } from "@/types/timeline" +import { ClapTracks } from "@aitube/clap" export function computeCellHeight({ tracks, @@ -6,7 +6,7 @@ export function computeCellHeight({ defaultCellHeight, defaultPreviewHeight }: { - tracks: Tracks + tracks: ClapTracks trackNumber: number defaultCellHeight: number defaultPreviewHeight: number diff --git a/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts b/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts index 0bec41f5..772b1839 100644 --- a/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts +++ b/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts @@ -1,6 +1,6 @@ -import { ClapProject } from "@aitube/clap" +import { ClapProject, ClapTracks } from "@aitube/clap" -import { ContentSizeMetrics, Tracks } from "@/types/timeline" +import { ContentSizeMetrics } from "@/types/timeline" import { computeCellHeight } from "./computeCellHeight" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS, NB_MAX_SHOTS, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants/grid" @@ -13,7 +13,7 @@ export function computeContentSizeMetrics({ totalDurationInMs, }: { clap?: ClapProject - tracks: Tracks + tracks: ClapTracks cellWidth: number defaultSegmentDurationInSteps: number totalDurationInMs: number @@ -38,7 +38,7 @@ export function computeContentSizeMetrics({ ) let contentHeight = 0 - const newTracks: Tracks = tracks.map(track => { + const newTracks: ClapTracks = tracks.map(track => { contentHeight += computeCellHeight({ trackNumber: track.id, tracks, diff --git a/packages/aitube-timeline/src/constants/index.ts b/packages/aitube-timeline/src/constants/index.ts index 7289270b..16b952ad 100644 --- a/packages/aitube-timeline/src/constants/index.ts +++ b/packages/aitube-timeline/src/constants/index.ts @@ -14,5 +14,6 @@ export { export { baseClapSegmentCategoryHues, pastel, - DEFAULT_THEMES + DEFAULT_THEMES, + leftBarTrackScaleWidth } from "./themes" diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 017dc5af..467f0168 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -126,7 +126,8 @@ export const useSegmentLoader = ({ // we actually don't use the camera.zoom anymore, so.. const securityMarginInCellStepCount = - // this is useful for horizontal scroll only + // note: I've try to multiply this thing, but this didn't really solve + // the blank grid flash issue maxPossibleNumberOfVisibleHorizontalCells + // if the camera is already zoomed-out a lot, it means we only need diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index c68df110..ddcb64fc 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -1,8 +1,8 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapOutputType, ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, isValidNumber, newClap, serializeClap } from "@aitube/clap" +import { ClapOutputType, ClapProject, ClapSceneEvent, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, isValidNumber, newClap, serializeClap, ClapTrack, ClapTracks } from "@aitube/clap" -import { RuntimeSegment, TimelineStore, Tracks } from "@/types/timeline" +import { RuntimeSegment, TimelineStore } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideos" @@ -41,8 +41,6 @@ export const useTimeline = create((set, get) => ({ set({ isLoading: true }) - // console.log(`useTimeline: setting the clap to`, clap) - // we remove the big/long video const segments = removeFinalVideos(clap) as RuntimeSegment[] @@ -57,7 +55,7 @@ export const useTimeline = create((set, get) => ({ let idCollisionDetector = new Set() - let tracks: Tracks = [] + let tracks: ClapTracks = [] let defaultSegmentDurationInSteps = get().defaultSegmentDurationInSteps @@ -88,45 +86,41 @@ export const useTimeline = create((set, get) => ({ defaultSegmentLengthInPixels / defaultMediaRatio ) - // let's trust developers for respecting this - // otherwise we could use the following big for loop to do this - let totalDurationInMs = Math.max(0, clap.meta.durationInMs || 0) - - const lineToDialogue: Record = {} + const lineNumberToMentionedSegments: Record = {} - for (const s of segments) { + for (const segment of segments) { // TODO: move this idCollision detector into the state, // so that we can use it later? - if (idCollisionDetector.has(s.id)) { - console.log(`collision detected! there is already a segment with id ${s.id}`) + if (idCollisionDetector.has(segment.id)) { + console.log(`collision detected! there is already a segment with id ${segment.id}`) continue } - if (s.category === ClapSegmentCategory.DIALOGUE || s.category === ClapSegmentCategory.ACTION) { - const scene = clap.scenes.find(({ id }) => id === s.sceneId) - if (scene) { - - // we attach the scene to the segment - s.scene = scene - - for (let lineNumber = scene.startAtLine; lineNumber < scene.endAtLine; lineNumber++) { - lineToDialogue[lineNumber] = s + const isSegmentDirectlyMentionedInTheScript = segment.category === ClapSegmentCategory.DIALOGUE || segment.category === ClapSegmentCategory.ACTION + + if (isSegmentDirectlyMentionedInTheScript) { + for (let i = segment.startTimeInLines; i <= segment.endTimeInLines; i++) { + // we only add the segment if it is not already in the map + let existingArray: ClapSegment[] = lineNumberToMentionedSegments[i] || [] + if (!existingArray.find(s => s.id === segment.id)) { + existingArray.push(segment) } + lineNumberToMentionedSegments[i] = existingArray } } - idCollisionDetector.add(s.id) + idCollisionDetector.add(segment.id) - if (!tracks[s.track]) { + if (!tracks[segment.track]) { const isPreview = - s.category === ClapSegmentCategory.STORYBOARD || - s.category === ClapSegmentCategory.VIDEO + segment.category === ClapSegmentCategory.STORYBOARD || + segment.category === ClapSegmentCategory.VIDEO - tracks[s.track] = { - id: s.track, + tracks[segment.track] = { + id: segment.track, // name: `Track ${s.track}`, - name: `${s.category}`, + name: `${segment.category}`, isPreview, height: isPreview @@ -138,10 +132,10 @@ export const useTimeline = create((set, get) => ({ } } else { - const track = tracks[s.track] - const categories = track.name.split(",").map(x => x.trim()) - if (!categories.includes(s.category)) { - tracks[s.track].name = "(misc)" + const track = tracks[segment.track] + const categories: string[] = track.name.split(",").map((x: string) => x.trim()) + if (!categories.includes(segment.category)) { + tracks[segment.track].name = "(misc)" /* if (categories.length < 2) { @@ -155,8 +149,8 @@ export const useTimeline = create((set, get) => ({ } - if (s.outputType === ClapOutputType.AUDIO) { - const rs = s as RuntimeSegment + if (segment.outputType === ClapOutputType.AUDIO) { + const rs = segment as RuntimeSegment if (rs.outputType === ClapOutputType.AUDIO) { try { rs.audioBuffer = await getAudioBuffer(rs.assetUrl) @@ -167,6 +161,8 @@ export const useTimeline = create((set, get) => ({ } } + + // ---------- REPAIR THE TRACKS --------------- for (let id = 0; id < tracks.length; id++) { if (!tracks[id]) { tracks[id] = { @@ -183,11 +179,23 @@ export const useTimeline = create((set, get) => ({ const finalVideo = getFinalVideo(clap) - const isEmpty = segments.length === 0 + let totalDurationInMs = clap.meta.durationInMs + let totalNumberOfLines = clap.meta.screenplay.split('\n').length - clap.meta.durationInMs = totalDurationInMs + console.log("totalNumberOfLines = " + totalNumberOfLines) + + const isEmpty = segments.length === 0 - clap.meta.screenplay = clap.scenes.reduce((acc, { sequenceFullText }) => `${acc}\n${sequenceFullText}`, '') + // ---------- REPAIR THE LINE-2-SEGMENT DICTIONARY --------------- + let previousValue: ClapSegment[] = [] + // we aren't finished yet: the lineNumberToMentionedSegments will be missing some entries + for (let i = 1; i <= totalNumberOfLines; i++) { + if (!Array.isArray(lineNumberToMentionedSegments[i])) { + lineNumberToMentionedSegments[i] = previousValue + } else { + previousValue = lineNumberToMentionedSegments[i] + } + } set({ clap, @@ -196,7 +204,7 @@ export const useTimeline = create((set, get) => ({ visibleSegments: [], segmentsChanged: 1, totalDurationInMs, - lineToDialogue, + lineNumberToMentionedSegments, isEmpty, isLoading: false, diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 5a8f01a7..4c33be42 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -24,7 +24,8 @@ export { baseClapSegmentCategoryHues, pastel, DEFAULT_THEMES, - segmentVisibilityPriority + segmentVisibilityPriority, + leftBarTrackScaleWidth } from "./constants" export { @@ -61,8 +62,6 @@ export { } from "./utils" export { - Track, - Tracks, SegmentVisibility, BrowserOnlySegmentData, RuntimeSegment, diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index f0daaa07..ea59a274 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -4,8 +4,6 @@ export { } from "./grid" export { - Track, - Tracks, SegmentVisibility, BrowserOnlySegmentData, RuntimeSegment, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 26931075..5b765190 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,5 +1,5 @@ import * as THREE from "three" -import { ClapProject, ClapScene, ClapSegment } from "@aitube/clap" +import { ClapProject, ClapScene, ClapSegment, ClapTracks } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" @@ -7,19 +7,6 @@ import { TimelineCameraImpl } from "@/components/camera/types" import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" import { RenderingStrategy, SegmentResolver } from "./rendering" -export type Track = { - id: number - name: string - isPreview: boolean - height: number - hue: number - occupied: boolean - visible: boolean -} - -export type Tracks = Track[] - - export enum SegmentVisibility { // the segment is visible, and the user explicitly requested to render it before the others DEMANDED = "DEMANDED", @@ -42,8 +29,14 @@ export enum SegmentVisibility { // we could put things like a mouse hover or selected state in here // or simply large, recursive elements (like the scene) export type BrowserOnlySegmentData = { + + // used to give more context to the LLM, so it can have the full text of the scene scene?: ClapScene + // use for convenience, for easily match the script editor with segments + startAtLine?: number + endAtLine?: number + audioBuffer?: AudioBuffer visibility?: SegmentVisibility @@ -57,7 +50,7 @@ export type ContentSizeMetrics = { nbIdentifiedTracks: number contentWidth: number contentHeight: number - tracks: Tracks + tracks: ClapTracks cellWidth: number defaultCellHeight: number defaultSegmentDurationInSteps: number @@ -77,7 +70,7 @@ export type TimelineStoreProjectState = { loadedSegments: ClapSegment[] visibleSegments: ClapSegment[] nbIdentifiedTracks: number - lineToDialogue: Record + lineNumberToMentionedSegments: Record isEmpty: boolean isLoading: boolean @@ -87,7 +80,7 @@ export type TimelineStoreProjectState = { nbMaxTracks: number contentWidth: number contentHeight: number - tracks: Tracks + tracks: ClapTracks cellWidth: number defaultCellHeight: number defaultSegmentDurationInSteps: number diff --git a/packages/aitube-timeline/src/utils/findFreeTrack.ts b/packages/aitube-timeline/src/utils/findFreeTrack.ts index 6803744d..c06dc1d4 100644 --- a/packages/aitube-timeline/src/utils/findFreeTrack.ts +++ b/packages/aitube-timeline/src/utils/findFreeTrack.ts @@ -1,6 +1,7 @@ -import { DEFAULT_NB_TRACKS } from "@/constants" import { ClapSegment, isValidNumber } from "@aitube/clap" +import { DEFAULT_NB_TRACKS } from "@/constants" + // search in an array of segment for the first available track, within a given range export function findFreeTrack({ segments = [], diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 336e964b..14c0bb33 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -14,7 +14,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { totalDurationInMs: 0, loadedSegments: [], visibleSegments: [], - lineToDialogue: {}, + lineNumberToMentionedSegments: {}, isEmpty: true, isLoading: false, From 62949e8302491befdf27872d7d5831d2d3b35c83 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 25 Jun 2024 16:06:57 +0200 Subject: [PATCH 170/346] quick fix for the demo --- .../src/analysis/guessAgeAndGender.ts | 8 +++- .../broadway/src/parsers/eras/database.ts | 48 +++++++++---------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/packages/broadway/src/analysis/guessAgeAndGender.ts b/packages/broadway/src/analysis/guessAgeAndGender.ts index 868f824d..c531d0ae 100644 --- a/packages/broadway/src/analysis/guessAgeAndGender.ts +++ b/packages/broadway/src/analysis/guessAgeAndGender.ts @@ -51,9 +51,15 @@ export async function guessAgeAndGender(name: string, referenceYear?: number): P ? "male" : "female" + let yearOfBirth = match[2] + if (typeof yearOfBirth !== "number" || !isFinite(yearOfBirth) || isNaN(yearOfBirth)) { + yearOfBirth = 2006 + } + const age = Math.max(18, refYear - yearOfBirth) + return { yearOfBirth: match[2], - age: refYear - match[2], + age, gender: topGender, } } diff --git a/packages/broadway/src/parsers/eras/database.ts b/packages/broadway/src/parsers/eras/database.ts index c3f18311..0e05dd4c 100644 --- a/packages/broadway/src/parsers/eras/database.ts +++ b/packages/broadway/src/parsers/eras/database.ts @@ -8,41 +8,41 @@ export const data: NamedEntity[] = [ "city of the future", "synthetic food", "artifical life", - "computer", - "computers", + // "computer", + // "computers", "replicator", "replicators", "self-replicator", "self-replicators", "replicant", "replication", - "dna strand", - "dna strands", - "oxygen tank", + // "dna strand", + // "dna strands", + // "oxygen tank", "memory wipe", "grid with vectors", - "hum of the machine", + // "hum of the machine", "dna programming", - "simulation", - "virtual", + // "simulation", + // "virtual", "offworld", "off world", "recombination", "alkylating", "mutagen", - "robot", - "robotic", - "robotics", - "robot dog", + // "robot", + // "robotic", + // "robotics", + // "robot dog", "robot police", - "high-voltage tethers", - "through space", - "galaxy", + // "high-voltage tethers", + // "through space", + // "galaxy", "galactic", "gravitational", "gravitational wave", "gravitational waves", - "graphene", + // "graphene", "tycho", "tycho base", "lunar hangar", @@ -54,7 +54,7 @@ export const data: NamedEntity[] = [ "you're a clone", "he is a clone", "she is a clone", - "vortex", + // "vortex", "biomechanics", "spaceship", "space ship", @@ -65,7 +65,7 @@ export const data: NamedEntity[] = [ "spacesuits", "lunar roving", "roving vehicle", - "mapping computer", + // "mapping computer", "space helmet", "space helmets", "astronaut", @@ -86,13 +86,13 @@ export const data: NamedEntity[] = [ "laser pistols", "servomoteur", "android", - "cyberspace", + // "cyberspace", "air lock", "airlock", "solar system", "solar systems", "teleportation", - "reactor", + // "reactor", "nuclear reactor", "reactors", "asteroids", @@ -100,15 +100,15 @@ export const data: NamedEntity[] = [ "light year", "light years", "diagnostic coffin", - "laser beam", - "last door", + // "laser beam", + "blast door", "blast doors", "alien creature", "alien device", "cryosleep", "hypersleep", - "science fiction", - "science-fiction", + // "science fiction", + // "science-fiction", "sometime in the future", ] }, From d7fcab0d998cc6ab6a102e040e0614d48eac1b66 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 25 Jun 2024 17:18:45 +0200 Subject: [PATCH 171/346] 0.0.20 --- packages/broadway/bun.lockb | Bin 33180 -> 33910 bytes packages/broadway/package-lock.json | 812 ---------------------------- packages/broadway/package.json | 2 +- 3 files changed, 1 insertion(+), 813 deletions(-) delete mode 100644 packages/broadway/package-lock.json diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index cbd446105932697da9f08fd69cbba8ec0bfb4c63..38f3a4b10a18b8a40a6f9644844649b8898a0ca7 100755 GIT binary patch delta 6010 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 delta 5484 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 xYv_UPg-P$r+QrtPvXbA3yBA$P6BN=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@types/node": { - "version": "20.12.14", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/bun-types": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.16.tgz", - "integrity": "sha512-LpAh8dQe4NKvhSW390Rkftw0ume0moSkRm575e1JZ1PwI/dXjbXyjpntq+2F0bVW1FV7V6B8EfWx088b+dNurw==", - "dev": true, - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/color": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob": { - "version": "10.4.2", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/indexeddb-fs": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/indexeddb-fs/-/indexeddb-fs-2.1.5.tgz", - "integrity": "sha512-4TDdof4ou+l1P3O9D+U09DAc2VQ/bWzgKBxC3nQ9qqMhNR2Y3p8JDgELzkY3bwLP8JULMTf2UHsjnYpiKExH2w==", - "dependencies": { - "jsonschema": "^1.4.1" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.0", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/lru-cache": { - "version": "10.2.2", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/prettier": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pure-uuid": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.7", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp": { - "version": "0.33.4", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.0" - }, - "engines": { - "libvips": ">=8.15.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/typescript": { - "version": "5.5.2", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/yaml": { - "version": "2.4.5", - "license": "ISC", - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/packages/broadway/package.json b/packages/broadway/package.json index eef23839..1e93902d 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.19", + "version": "0.0.20", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", From d40d3abc155962b688aafb4e423494bad49a0d8b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 25 Jun 2024 21:54:16 +0200 Subject: [PATCH 172/346] 0.0.33 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useSegmentLoader.ts | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 50bdd519..606f3b70 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.32", + "version": "0.0.33", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 467f0168..10fbd259 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -148,7 +148,10 @@ export const useSegmentLoader = ({ const afterTimeWithBufferInMs = afterStepsWithBuffer * DEFAULT_DURATION_IN_MS_PER_STEP const beforeTimeWithBufferInMs = beforeStepsWithBuffer * DEFAULT_DURATION_IN_MS_PER_STEP - if (state.afterTimeWithBufferInMs !== afterTimeWithBufferInMs || state.beforeTimeWithBufferInMs !== beforeTimeWithBufferInMs || forceRerendering) { + if ( + state.afterTimeWithBufferInMs !== afterTimeWithBufferInMs + || state.beforeTimeWithBufferInMs !== beforeTimeWithBufferInMs + || forceRerendering) { state.afterTimeWithBufferInMs = afterTimeWithBufferInMs state.beforeTimeWithBufferInMs = beforeTimeWithBufferInMs @@ -167,7 +170,10 @@ export const useSegmentLoader = ({ const afterTimeWithoutBufferInMs = afterStepsWithoutBuffer * DEFAULT_DURATION_IN_MS_PER_STEP const beforeTimeWithoutBufferInMs = beforeStepsWithoutBuffer * DEFAULT_DURATION_IN_MS_PER_STEP - if (state.afterTimeWithoutBufferInMs !== afterTimeWithoutBufferInMs || state.beforeTimeWithoutBufferInMs !== beforeTimeWithoutBufferInMs || forceRerendering) { + if ( + state.afterTimeWithoutBufferInMs !== afterTimeWithoutBufferInMs + || state.beforeTimeWithoutBufferInMs !== beforeTimeWithoutBufferInMs + || forceRerendering) { state.afterTimeWithoutBufferInMs = afterTimeWithoutBufferInMs state.beforeTimeWithoutBufferInMs = beforeTimeWithoutBufferInMs @@ -209,7 +215,7 @@ export const useSegmentLoader = ({ // force a re-render when cell width or height change useEffect(() => { - // console.log("forcing a sync(true)") + console.log("forcing a sync(true)") const fn = async () => { try { await sync(true) } catch (err) {} } fn() }, [cellHeight, cellWidth, segmentsChanged]) From 1f54c456f9bec2b27cb6ace262cf32aa97fc3cc2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 12:14:21 +0200 Subject: [PATCH 173/346] initial commit --- packages/aitube-clapper-services/.gitignore | 177 ++++++++++++++++++ packages/aitube-clapper-services/.npmignore | 4 + .../aitube-clapper-services/.prettierrc.json | 9 + packages/aitube-clapper-services/LICENSE.md | 21 +++ packages/aitube-clapper-services/README.md | 4 + packages/aitube-clapper-services/bun.lockb | Bin 0 -> 86360 bytes packages/aitube-clapper-services/package.json | 45 +++++ .../aitube-clapper-services/src/broadcast.ts | 15 ++ .../src/controllers.ts | 23 +++ .../aitube-clapper-services/src/editor.ts | 53 ++++++ packages/aitube-clapper-services/src/index.ts | 52 +++++ .../aitube-clapper-services/src/monitor.ts | 45 +++++ .../aitube-clapper-services/src/plugin.ts | 80 ++++++++ .../aitube-clapper-services/src/plugins.ts | 47 +++++ .../aitube-clapper-services/src/renderer.ts | 68 +++++++ .../aitube-clapper-services/tsconfig.json | 31 +++ .../tsconfig.types.json | 13 ++ 17 files changed, 687 insertions(+) create mode 100644 packages/aitube-clapper-services/.gitignore create mode 100644 packages/aitube-clapper-services/.npmignore create mode 100644 packages/aitube-clapper-services/.prettierrc.json create mode 100644 packages/aitube-clapper-services/LICENSE.md create mode 100644 packages/aitube-clapper-services/README.md create mode 100755 packages/aitube-clapper-services/bun.lockb create mode 100644 packages/aitube-clapper-services/package.json create mode 100644 packages/aitube-clapper-services/src/broadcast.ts create mode 100644 packages/aitube-clapper-services/src/controllers.ts create mode 100644 packages/aitube-clapper-services/src/editor.ts create mode 100644 packages/aitube-clapper-services/src/index.ts create mode 100644 packages/aitube-clapper-services/src/monitor.ts create mode 100644 packages/aitube-clapper-services/src/plugin.ts create mode 100644 packages/aitube-clapper-services/src/plugins.ts create mode 100644 packages/aitube-clapper-services/src/renderer.ts create mode 100644 packages/aitube-clapper-services/tsconfig.json create mode 100644 packages/aitube-clapper-services/tsconfig.types.json diff --git a/packages/aitube-clapper-services/.gitignore b/packages/aitube-clapper-services/.gitignore new file mode 100644 index 00000000..ea8fe6a7 --- /dev/null +++ b/packages/aitube-clapper-services/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo \ No newline at end of file diff --git a/packages/aitube-clapper-services/.npmignore b/packages/aitube-clapper-services/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-clapper-services/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-clapper-services/.prettierrc.json b/packages/aitube-clapper-services/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-clapper-services/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-clapper-services/LICENSE.md b/packages/aitube-clapper-services/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-clapper-services/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-clapper-services/README.md b/packages/aitube-clapper-services/README.md new file mode 100644 index 00000000..05f4eec1 --- /dev/null +++ b/packages/aitube-clapper-services/README.md @@ -0,0 +1,4 @@ +# @aitube/clapper-controllers + +*Base types for Clapper controllers* + diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..e2b09aca00e20d2a279bf946dcd0a6303fe21a2f GIT binary patch literal 86360 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 PMEr>e_A!kAh5!3MqOZ5T literal 0 HcmV?d00001 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json new file mode 100644 index 00000000..6aec082a --- /dev/null +++ b/packages/aitube-clapper-services/package.json @@ -0,0 +1,45 @@ +{ + "name": "@aitube/clapper-controllers", + "module": "index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "version": "0.0.0", + "description": "Base types for Clapper controllers", + "scripts": { + "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", + "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", + "publish": "npm publish --access public" + }, + "devDependencies": { + "bun-types": "latest", + "prettier": "^3.3.2", + "rimraf": "^5.0.7", + "typescript": "^5.5.2" + }, + "peerDependencies": { + "@aitube/clap": "0.0.29", + "@aitube/timeline": "0.0.33", + "@monaco-editor/react": "^4.6.0", + "monaco-editor": "^0.50.0", + "zustand": "4.5.2" + }, + "dependencies": { + }, + "repository": { + "type": "git", + "url": "https://github.com/jbilcke-hf/clapper-controllers.git" + }, + "keywords": [ + "Clapper", + "Clapper.app" + ], + "author": "Julian Bilcke", + "license": "MIT", + "files": [ + "dist/*.js", + "dist/*.d.ts", + "dist/**/*.d.ts" + ] +} diff --git a/packages/aitube-clapper-services/src/broadcast.ts b/packages/aitube-clapper-services/src/broadcast.ts new file mode 100644 index 00000000..fca28b93 --- /dev/null +++ b/packages/aitube-clapper-services/src/broadcast.ts @@ -0,0 +1,15 @@ + +export type BroadcastState = { + isBroadcasting: boolean +} + +export type BroadcastControls = { + /** + * Toggles the broadcast on or off + * @param forceValue + * @returns + */ + toggleBroadcast: (forceValue?: boolean) => boolean +} + +export type BroadcastStore = BroadcastState & BroadcastControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/controllers.ts b/packages/aitube-clapper-services/src/controllers.ts new file mode 100644 index 00000000..0192bc4b --- /dev/null +++ b/packages/aitube-clapper-services/src/controllers.ts @@ -0,0 +1,23 @@ +import { StoreApi, UseBoundStore } from "zustand" +import { TimelineStore } from "@aitube/timeline" + +import { BroadcastStore } from "./broadcast" +import { EditorStore } from "./editor" +import { MonitorStore } from "./monitor" +import { RendererStore } from "./renderer" + +export type BroadcastController = UseBoundStore> +export type EditorController = UseBoundStore> +export type MonitorController = UseBoundStore> +export type RendererController = UseBoundStore> +export type TimelineController = UseBoundStore> + +// the controllers publicly available +// missing from this list are the settings and the plugins store itself +export type PublicControllers = { + editor: EditorController + monitor: MonitorController + timeline: TimelineController + renderer: RendererController + broadcast: BroadcastController +} \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/editor.ts b/packages/aitube-clapper-services/src/editor.ts new file mode 100644 index 00000000..1879f237 --- /dev/null +++ b/packages/aitube-clapper-services/src/editor.ts @@ -0,0 +1,53 @@ +import { ClapProject, ClapSegment } from "@aitube/clap" +import { Monaco } from "@monaco-editor/react" +import MonacoEditor from "monaco-editor" + +export type ScrollData = { + scrollHeight: number + scrollLeft: number + scrollTop: number + scrollWidth: number +} + +export type EditorState = { + monaco?: Monaco + + textModel?: MonacoEditor.editor.ITextModel + + // reference to the React component + standaloneCodeEditor?: MonacoEditor.editor.IStandaloneCodeEditor + + // used to know if the user is actually inside the editor or not + mouseIsInside: boolean + + // the full-text of the screenplay + draft: string + + // map screenplay lines to dialogue segments + // (note: some lines point to nothing, eg. when we have empty spaces) + lineNumberToMentionedSegments: Record + + + /** + * the index of the first step visible in the current screenplay + * + * (the topmost visible timeline step in the current timeline) + */ + scrollTopInMs: number +} & ScrollData + +export type EditorControls = { + setMonaco: (monaco?: Monaco) => void + setTextModel: (textModel?: MonacoEditor.editor.ITextModel) => void + setStandaloneCodeEditor: (standaloneCodeEditor?: MonacoEditor.editor.IStandaloneCodeEditor) => void + setMouseIsInside: (mouseIsInside: boolean) => void + loadDraftFromClap: (clap: ClapProject) => void + setDraft: (draft: string) => void + publishDraftToTimeline: () => Promise + onDidScrollChange: (scrollData: ScrollData) => void + jumpCursorOnLineClick: (line?: number) => void + highlightElements: () => void + applyClassNameToKeywords: (className?: string, keywords?: string[], caseSensitive?: boolean) => void +} + +export type EditorStore = EditorState & EditorControls diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts new file mode 100644 index 00000000..c98ea8a7 --- /dev/null +++ b/packages/aitube-clapper-services/src/index.ts @@ -0,0 +1,52 @@ + +export { + BroadcastState, + BroadcastControls, + BroadcastStore +} from "./broadcast" + + +export { + BroadcastController, + EditorController, + MonitorController, + RendererController, + TimelineController, + PublicControllers +} from "./controllers" + +export { + EditorState, + EditorControls, + EditorStore +} from "./editor" + +export { + MonitoringMode, + MonitorState, + MonitorControls, + MonitorStore +} from "./monitor" + +export { + ClapperPluginCategory, + ClapperPluginSettingType, + ClapperPluginSettingBase, + ClapperPluginSettingString, + ClapperPluginSettingNumber, + ClapperPluginSettingBoolean, + ClapperPluginSetting, + ClapperPluginMeta, + BaseClapperPluginStore, + ClapperPluginController, + ClapperPlugin, +} from "./plugin" + +export { + ActiveSegments, + UpcomingSegments, + BufferedSegments, + RendererState, + RendererControls, + RendererStore, +} from "./renderer" diff --git a/packages/aitube-clapper-services/src/monitor.ts b/packages/aitube-clapper-services/src/monitor.ts new file mode 100644 index 00000000..0dc48227 --- /dev/null +++ b/packages/aitube-clapper-services/src/monitor.ts @@ -0,0 +1,45 @@ +export enum MonitoringMode { + NONE = "NONE", + STATIC = "STATIC", + DYNAMIC = "DYNAMIC" +} + +export type MonitorState = { + shortcutsAreBound: boolean + mode: MonitoringMode + lastTimelineUpdateAtInMs: number + isPlaying: boolean + staticVideoRef?: HTMLVideoElement +} + +export type MonitorControls = { + + bindShortcuts: () => void + + setMonitoringMode: (mode: MonitoringMode) => void + + setStaticVideoRef: (staticVideoRef: HTMLVideoElement) => void + + checkIfPlaying: () => boolean + /** + * Play/pause the project timeline (video and audio) + * + * @param forcePlaying + * @returns + */ + togglePlayback: (forcePlaying?: boolean) => { + wasPlaying: boolean + isPlaying: boolean + } + + /** + * Seek to a specific timestamp + * + * @param timeInMs + * @returns + */ + jumpAt: (timeInMs?: number) => void + + setLastTimelineUpdateAtInMs: (lastTimelineUpdateAtInMs: number) => void +} +export type MonitorStore = MonitorState & MonitorControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/plugin.ts b/packages/aitube-clapper-services/src/plugin.ts new file mode 100644 index 00000000..526ca876 --- /dev/null +++ b/packages/aitube-clapper-services/src/plugin.ts @@ -0,0 +1,80 @@ +import { StoreApi, UseBoundStore } from "zustand" + +export enum ClapperPluginCategory { + THEME = "THEME", + IMPORTER = "IMPORTER", + EXPORTER = "EXPORTER", + RESOLVER = "RESOLVER" +} + +export enum ClapperPluginSettingType { + STRING = "STRING", + NUMBER = "NUMBER", + BOOLEAN = "BOOLEAN" +} + +export type ClapperPluginSettingBase = { + key: string + label: string +} +export type ClapperPluginSettingString = { + value: string + defaultValue: string + type: ClapperPluginSettingType.STRING +} +export type ClapperPluginSettingNumber = { + value: number + defaultValue: number + type: ClapperPluginSettingType.NUMBER +} +export type ClapperPluginSettingBoolean = { + value: boolean + defaultValue: boolean + type: ClapperPluginSettingType.BOOLEAN +} +export type ClapperPluginSetting = +ClapperPluginSettingBase & + ( + ClapperPluginSettingString | + ClapperPluginSettingNumber | + ClapperPluginSettingBoolean + ) + +export type ClapperPluginMeta = { + // a lowercase alphabetical name (letters and digits only) + // used to uniquely identify the plugin + id: string + + // a human-readable name + label: string + + // a list of categories + categories: ClapperPluginCategory[] + + // a list of settings for this plugin + settings: ClapperPluginSetting[] + + // the purpose of the plugin + description: string + + // semver of the plugin + version: string + + licence: string + author: string + + // project or company website + website: string + + // direct URL to the .js file for fetch and injection + assetUrl: string +} + +export type BaseClapperPluginStore = {} + +export type ClapperPluginController = UseBoundStore> + +export type ClapperPlugin = { + meta: ClapperPluginMeta + controller: ClapperPluginController +} diff --git a/packages/aitube-clapper-services/src/plugins.ts b/packages/aitube-clapper-services/src/plugins.ts new file mode 100644 index 00000000..b9e89e7f --- /dev/null +++ b/packages/aitube-clapper-services/src/plugins.ts @@ -0,0 +1,47 @@ + +import { PublicControllers } from "./controllers" +import { + ClapperPlugin, + ClapperPluginMeta, + ClapperPluginSetting, +} from "./plugin" + +export type ClapperPluginSettings = ClapperPluginSetting[] + +export type ClapperPluginApi = { + /** + * Provide some public controllers + * + * @returns + */ + getControllers: () => PublicControllers + + /** + * Load the plugin settings saved by the user + * + * (to the local storage usually) + * @returns + */ + getSettings: () => ClapperPluginSetting[] +} + +export type PluginsState = { + // list of plugins available for install + availablePlugins: ClapperPluginMeta[] + + installedPlugins: ClapperPluginMeta[] + + runningPlugins: ClapperPluginMeta[] +} + +export type PluginsControls = { + refreshAvailablePlugins: () => Promise + + getPluginControllers: (plugin: ClapperPlugin) => PublicControllers + getPluginSettings: (plugin: ClapperPlugin) => ClapperPluginSetting[] + + install: (plugin: ClapperPlugin) => Promise + uninstall: (plugin: ClapperPlugin) => Promise +} + +export type PluginsStore = PluginsState & PluginsControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/renderer.ts b/packages/aitube-clapper-services/src/renderer.ts new file mode 100644 index 00000000..c0595abf --- /dev/null +++ b/packages/aitube-clapper-services/src/renderer.ts @@ -0,0 +1,68 @@ +import { ClapSegment } from "@aitube/clap" + +export type ActiveSegments = { + activeSegmentsCacheKey: string + activeSegments: ClapSegment[] + activeVideoSegment?: ClapSegment + activeStoryboardSegment?: ClapSegment + activeAudioSegments: ClapSegment[] +} + +export type UpcomingSegments = { + upcomingSegmentsCacheKey: string + upcomingSegments: ClapSegment[] + upcomingVideoSegment?: ClapSegment + upcomingStoryboardSegment?: ClapSegment + upcomingAudioSegments: ClapSegment[] +} + +export type BufferedSegments = ActiveSegments & UpcomingSegments + +export type RendererState = { + bufferedSegments: BufferedSegments + + // various helpers to manage buffering, + // cache, cache invalidation.. + dataUriBuffer1?: ClapSegment + dataUriBuffer2?: ClapSegment + activeBufferNumber: number + currentSegment?: ClapSegment + preloadSegment?: ClapSegment + currentSegmentKey: string + preloadSegmentKey: string + dataUriBuffer1Key: string + dataUriBuffer2Key: string +} + +export type RendererControls = { + + // used to clear the renderer eg. when we load a new project + clear: () => void + + // this will be called at 60 FPS - and yes, it is expensive + // we could probably improve things by using a temporal tree index + + /** + * Cycle through the segments to see which ones are crossing the current cursor, + * then this updates the internal buffer of segments + * (this has side effects as it modifies the internal state) + * + * @returns + */ + renderLoop: (jumpedSomewhere?: boolean) => BufferedSegments + + /** + * Cycle through the segments to see which ones are crossing the current cursor, + * and return it (this doesn't change any state, but it reads the state from various stores) + * @returns + */ + computeBufferedSegments: () => BufferedSegments + + setDataUriBuffer1: (dataUriBuffer1?: ClapSegment) => void + setDataUriBuffer2: (dataUriBuffer2?: ClapSegment) => void + setActiveBufferNumber: (activeBufferNumber: number) => void + + syncVideoToCurrentCursorPosition: () => void +} + +export type RendererStore = RendererState & RendererControls diff --git a/packages/aitube-clapper-services/tsconfig.json b/packages/aitube-clapper-services/tsconfig.json new file mode 100644 index 00000000..ab7cc3ed --- /dev/null +++ b/packages/aitube-clapper-services/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext", "DOM"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/aitube-clapper-services/tsconfig.types.json b/packages/aitube-clapper-services/tsconfig.types.json new file mode 100644 index 00000000..a6a3f211 --- /dev/null +++ b/packages/aitube-clapper-services/tsconfig.types.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + }, + "include": [ + "src/**/*.ts" + ] +} From f13d8d02672fe3c4f56a887258f408f83179f874 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 12:24:31 +0200 Subject: [PATCH 174/346] 0.0.1 --- packages/aitube-clapper-services/package.json | 4 ++-- packages/aitube-clapper-services/src/controllers.ts | 10 +++++++++- packages/aitube-clapper-services/src/index.ts | 13 ++++++++++++- packages/aitube-clapper-services/src/plugin.ts | 2 ++ packages/aitube-clapper-services/src/plugins.ts | 8 +++----- 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 6aec082a..ecee6bb7 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,10 +4,10 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "Base types for Clapper controllers", "scripts": { - "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", + "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" diff --git a/packages/aitube-clapper-services/src/controllers.ts b/packages/aitube-clapper-services/src/controllers.ts index 0192bc4b..fdc80005 100644 --- a/packages/aitube-clapper-services/src/controllers.ts +++ b/packages/aitube-clapper-services/src/controllers.ts @@ -5,12 +5,18 @@ import { BroadcastStore } from "./broadcast" import { EditorStore } from "./editor" import { MonitorStore } from "./monitor" import { RendererStore } from "./renderer" +import { PluginsStore } from "./plugins" export type BroadcastController = UseBoundStore> export type EditorController = UseBoundStore> export type MonitorController = UseBoundStore> export type RendererController = UseBoundStore> export type TimelineController = UseBoundStore> +export type PluginsController = UseBoundStore> + +export type PrivateControllers = { + plugins: PluginsController +} // the controllers publicly available // missing from this list are the settings and the plugins store itself @@ -20,4 +26,6 @@ export type PublicControllers = { timeline: TimelineController renderer: RendererController broadcast: BroadcastController -} \ No newline at end of file +} + +export type Controllers = PrivateControllers & PublicControllers \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index c98ea8a7..f228a03d 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -12,7 +12,10 @@ export { MonitorController, RendererController, TimelineController, - PublicControllers + + PrivateControllers, + PublicControllers, + Controllers, } from "./controllers" export { @@ -36,12 +39,20 @@ export { ClapperPluginSettingNumber, ClapperPluginSettingBoolean, ClapperPluginSetting, + ClapperPluginSettings, ClapperPluginMeta, BaseClapperPluginStore, ClapperPluginController, ClapperPlugin, } from "./plugin" +export { + ClapperPluginApi, + PluginsState, + PluginsControls, + PluginsStore, +} from "./plugins" + export { ActiveSegments, UpcomingSegments, diff --git a/packages/aitube-clapper-services/src/plugin.ts b/packages/aitube-clapper-services/src/plugin.ts index 526ca876..010d4e9a 100644 --- a/packages/aitube-clapper-services/src/plugin.ts +++ b/packages/aitube-clapper-services/src/plugin.ts @@ -40,6 +40,8 @@ ClapperPluginSettingBase & ClapperPluginSettingBoolean ) +export type ClapperPluginSettings = ClapperPluginSetting[] + export type ClapperPluginMeta = { // a lowercase alphabetical name (letters and digits only) // used to uniquely identify the plugin diff --git a/packages/aitube-clapper-services/src/plugins.ts b/packages/aitube-clapper-services/src/plugins.ts index b9e89e7f..7248bf99 100644 --- a/packages/aitube-clapper-services/src/plugins.ts +++ b/packages/aitube-clapper-services/src/plugins.ts @@ -3,11 +3,9 @@ import { PublicControllers } from "./controllers" import { ClapperPlugin, ClapperPluginMeta, - ClapperPluginSetting, + ClapperPluginSettings, } from "./plugin" -export type ClapperPluginSettings = ClapperPluginSetting[] - export type ClapperPluginApi = { /** * Provide some public controllers @@ -22,7 +20,7 @@ export type ClapperPluginApi = { * (to the local storage usually) * @returns */ - getSettings: () => ClapperPluginSetting[] + getSettings: () => ClapperPluginSettings } export type PluginsState = { @@ -38,7 +36,7 @@ export type PluginsControls = { refreshAvailablePlugins: () => Promise getPluginControllers: (plugin: ClapperPlugin) => PublicControllers - getPluginSettings: (plugin: ClapperPlugin) => ClapperPluginSetting[] + getPluginSettings: (plugin: ClapperPlugin) => ClapperPluginSettings install: (plugin: ClapperPlugin) => Promise uninstall: (plugin: ClapperPlugin) => Promise From 7c56ece6d134c4ec1e6bf58050977cb7ccc8edc9 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 12:49:01 +0200 Subject: [PATCH 175/346] 0.0.2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/audio.ts | 64 +++++++++++++++++++ .../src/controllers.ts | 3 + packages/aitube-clapper-services/src/index.ts | 10 ++- 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 packages/aitube-clapper-services/src/audio.ts diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index ecee6bb7..d5df8df8 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.1", + "version": "0.0.2", "description": "Base types for Clapper controllers", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/audio.ts b/packages/aitube-clapper-services/src/audio.ts new file mode 100644 index 00000000..f645cf34 --- /dev/null +++ b/packages/aitube-clapper-services/src/audio.ts @@ -0,0 +1,64 @@ +import { RuntimeSegment } from "@aitube/timeline" + +export type AudioAnalysis = { + audioBuffer: AudioBuffer + bpm: number + durationInMs: number + durationInSteps: number +} + +export type AudioState = { + isPlaying: boolean + isMuted: boolean + userDefinedGain: number + currentGain: number + audioContext: AudioContext // we keep a single audio context + currentlyPlaying: CurrentlyPlayingAudioSource[] +} + +export type AudioControls = { + play: () => void + stop: () => void + setUserDefinedGain: (userDefinedGain: number) => void + setCurrentGain: (currentGain: number) => void + mute: () => void + unmute: () => void + syncAudioToCurrentCursorPosition: (activeAudioSegments: RuntimeSegment[]) => void +} + +export type AudioStore = AudioState & AudioControls +/** + * This is the data structure used to keep track of currently played audio nodes + */ +export type CurrentlyPlayingAudioSource = { + /** + * The unique ID associated with this audio source + * + * This exists because the same segment might can be present multiple times + * + * Eg. the same "cymbal crash" sound might be triggered multiple times + */ + sourceId: string + + /** + * The segment being played (this is for identification so we only need the ID) + */ + segmentId: string + + /** + * The actual source node (this allows us to call .stop() on it) + */ + sourceNode: AudioScheduledSourceNode + + // the original value that was set to the segment + originalGain: number + + /** + * The gain node, to control the volume + * + * Note that for the moment, we do not persist the changes to the gain, + * but this is something we should do since it is part of the project data + */ + + gainNode: GainNode +} \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/controllers.ts b/packages/aitube-clapper-services/src/controllers.ts index fdc80005..1cee8dcf 100644 --- a/packages/aitube-clapper-services/src/controllers.ts +++ b/packages/aitube-clapper-services/src/controllers.ts @@ -6,7 +6,9 @@ import { EditorStore } from "./editor" import { MonitorStore } from "./monitor" import { RendererStore } from "./renderer" import { PluginsStore } from "./plugins" +import { AudioStore } from "./audio" +export type AudioController = UseBoundStore> export type BroadcastController = UseBoundStore> export type EditorController = UseBoundStore> export type MonitorController = UseBoundStore> @@ -21,6 +23,7 @@ export type PrivateControllers = { // the controllers publicly available // missing from this list are the settings and the plugins store itself export type PublicControllers = { + audio: AudioController editor: EditorController monitor: MonitorController timeline: TimelineController diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index f228a03d..4e6b7ed8 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -1,12 +1,20 @@ +export { + AudioAnalysis, + AudioState, + AudioControls, + AudioStore, + CurrentlyPlayingAudioSource +} from "./audio" + export { BroadcastState, BroadcastControls, BroadcastStore } from "./broadcast" - export { + AudioController, BroadcastController, EditorController, MonitorController, From 9c98974c5c961482fd63a50b7ad1917b25a6f922 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 12:55:45 +0200 Subject: [PATCH 176/346] 0.0.2 --- packages/aitube-clapper-services/bun.lockb | Bin 86360 -> 87341 bytes packages/aitube-clapper-services/package.json | 4 + .../src/controllers.ts | 3 + packages/aitube-clapper-services/src/index.ts | 16 +++ packages/aitube-clapper-services/src/tasks.ts | 119 ++++++++++++++++++ 5 files changed, 142 insertions(+) create mode 100644 packages/aitube-clapper-services/src/tasks.ts diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index e2b09aca00e20d2a279bf946dcd0a6303fe21a2f..d5aa2528cd2fb7d85fac6bd905d68278721ae1d4 100755 GIT binary patch delta 15746 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 Fe*jv!s6hY# delta 15054 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index d5df8df8..56364205 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -13,6 +13,8 @@ "publish": "npm publish --access public" }, "devDependencies": { + "@types/react": "*", + "@types/react-dom": "*", "bun-types": "latest", "prettier": "^3.3.2", "rimraf": "^5.0.7", @@ -23,6 +25,8 @@ "@aitube/timeline": "0.0.33", "@monaco-editor/react": "^4.6.0", "monaco-editor": "^0.50.0", + "react": "*", + "react-dom": "*", "zustand": "4.5.2" }, "dependencies": { diff --git a/packages/aitube-clapper-services/src/controllers.ts b/packages/aitube-clapper-services/src/controllers.ts index 1cee8dcf..3d9b0da6 100644 --- a/packages/aitube-clapper-services/src/controllers.ts +++ b/packages/aitube-clapper-services/src/controllers.ts @@ -7,12 +7,14 @@ import { MonitorStore } from "./monitor" import { RendererStore } from "./renderer" import { PluginsStore } from "./plugins" import { AudioStore } from "./audio" +import { TasksStore } from "./tasks" export type AudioController = UseBoundStore> export type BroadcastController = UseBoundStore> export type EditorController = UseBoundStore> export type MonitorController = UseBoundStore> export type RendererController = UseBoundStore> +export type TasksController = UseBoundStore> export type TimelineController = UseBoundStore> export type PluginsController = UseBoundStore> @@ -24,6 +26,7 @@ export type PrivateControllers = { // missing from this list are the settings and the plugins store itself export type PublicControllers = { audio: AudioController + tasks: TasksController editor: EditorController monitor: MonitorController timeline: TimelineController diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 4e6b7ed8..2d4b780e 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -15,6 +15,7 @@ export { export { AudioController, + TasksController, BroadcastController, EditorController, MonitorController, @@ -69,3 +70,18 @@ export { RendererControls, RendererStore, } from "./renderer" + +export { + TaskVisibility, + TaskProgressType, + TaskCategory, + TaskStatus, + StatusGetter, + TaskRunner, + NewTask, + Task, + TaskRemoteControl, + TasksState, + TasksControls, + TasksStore, +} from "./tasks" \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/tasks.ts b/packages/aitube-clapper-services/src/tasks.ts new file mode 100644 index 00000000..3a0ed570 --- /dev/null +++ b/packages/aitube-clapper-services/src/tasks.ts @@ -0,0 +1,119 @@ +import { ReactNode } from "react" + +export enum TaskVisibility { + BLOCKER = "BLOCKER", + BACKGROUND = "BACKGROUND", + INVISIBLE = "INVISIBLE" +} + +export enum TaskProgressType { + RATIO = "RATIO", // number between 0 and 1 + PERCENTAGE = "PERCENTAGE", // number between 0 and 100 + COUNTER = "COUNTER" // number between min and max +} + +export enum TaskCategory { + DOWNLOAD = "DOWNLOAD", + EXPORT = "EXPORT", + IMPORT = "IMPORT", + ANALYSIS = "ANALYSIS", + STORYBOARD = "STORYBOARD", + VIDEO = "VIDEO", + GENERIC = "GENERIC" +} + +export enum TaskStatus { + UPCOMING = "UPCOMING", + RUNNING = "RUNNING", + PAUSED = "PAUSED", + CANCELLED = "CANCELLED", + ERROR = "ERROR", + SUCCESS = "SUCCESS", + DELETED = "DELETED" +} + +export type StatusGetter = () => TaskStatus +export type TaskRunner = (getStatus: StatusGetter) => Promise + +export type NewTask = { + id: string + category: TaskCategory + visibility: TaskVisibility + initialMessage: ReactNode + successMessage: ReactNode + priority: number // 0 = lowest, 1 or more = more and more important + value: number + progress: number + status: TaskStatus + min: number + max: number + mode: TaskProgressType + run?: TaskRunner +} + +export type Task = NewTask & { + currentMessage: ReactNode + startedAt: string + endedAt: string + value: number + promise: Promise +} + +/** + * A nice helper to do various operations with tasks + */ +export type TaskRemoteControl = { + task: Task + + // a promise tracking the current status of the task + promise: Promise + pause: () => void + continue: () => void + setStatus: (status: TaskStatus) => void + setProgress: (options?: { + value?: number + sleepDelay?: number + message?: string + isFinished?: boolean + }) => Promise + + success: () => void + fail: (reason?: string) => void + cancel: () => void +} + +export type TasksState = { + tasks: Record, + expandTasks: boolean +} + +export type TasksControls = { + setExpandTasks: (expandTasks: boolean) => void, + get: (taskId?: string) => TaskRemoteControl | undefined + find: (params?: { + status?: TaskStatus + category?: TaskCategory + visibility?: TaskVisibility + }) => Task[] + add: (partialTask: Partial, status?: TaskStatus) => TaskRemoteControl + pause: (taskId?: string) => void + continue: (taskId?: string) => void + setStatus: (status: TaskStatus, taskId?: string) => void + setProgress: (taskId: string, options?: { + value?: number + sleepDelay?: number + message?: string + isFinished?: boolean + hasFailed?: boolean + }) => Promise + + // cancel and clear all tasks (used when switching project) + clear: () => void + + // mark a task as completed + success: (taskId: string) => void + fail: (taskId: string, reason?: string) => void + cancel: (taskId?: string) => void +} + +export type TasksStore = TasksState & TasksControls \ No newline at end of file From d59a69ebc6de7ec94cbffb47183a7696830d2e47 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 13:17:03 +0200 Subject: [PATCH 177/346] initial commit --- packages/aitube-clapper-services/README.md | 6 +- packages/aitube-clapper-services/bun.lockb | Bin 87341 -> 87338 bytes packages/aitube-clapper-services/package.json | 10 +-- .../aitube-clapper-services/src/assistant.ts | 71 ++++++++++++++++++ .../src/controllers.ts | 37 --------- packages/aitube-clapper-services/src/index.ts | 40 +++++++--- .../aitube-clapper-services/src/plugin.ts | 4 +- .../aitube-clapper-services/src/plugins.ts | 6 +- .../aitube-clapper-services/src/resolver.ts | 58 ++++++++++++++ .../aitube-clapper-services/src/services.ts | 43 +++++++++++ 10 files changed, 214 insertions(+), 61 deletions(-) create mode 100644 packages/aitube-clapper-services/src/assistant.ts delete mode 100644 packages/aitube-clapper-services/src/controllers.ts create mode 100644 packages/aitube-clapper-services/src/resolver.ts create mode 100644 packages/aitube-clapper-services/src/services.ts diff --git a/packages/aitube-clapper-services/README.md b/packages/aitube-clapper-services/README.md index 05f4eec1..90c2ef60 100644 --- a/packages/aitube-clapper-services/README.md +++ b/packages/aitube-clapper-services/README.md @@ -1,4 +1,6 @@ -# @aitube/clapper-controllers +# @aitube/clapper-services -*Base types for Clapper controllers* +*Base types for Clapper services* + +This module is used by Clapper and by Clapper plugins diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index d5aa2528cd2fb7d85fac6bd905d68278721ae1d4..9aac412a26fc5ab121b92f2c2346bcd6d5a2c93a 100755 GIT binary patch delta 7847 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 MqTRhBM9|Rx20;~^&;S4c delta 7840 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 boolean + + setVoiceTranscript: (transcript: string) => void + + /** + * Run a prompt command (which can come from a transcript or somewhere else) + * + * This returns true in case of success (if something happened, and we don't need to do anything anymore) + * @param prompt + * @returns + */ + runCommand: (prompt: string) => boolean + + /** + * Add a chat event to the history + * + * @param event + * @returns + */ + addEventToHistory: (event: Partial) => ChatEvent + + clearHistory: () => void + + processMessage: (input: string) => void +} + +export type AssistantStore = + AssistantState & + AssistantControls diff --git a/packages/aitube-clapper-services/src/controllers.ts b/packages/aitube-clapper-services/src/controllers.ts deleted file mode 100644 index 3d9b0da6..00000000 --- a/packages/aitube-clapper-services/src/controllers.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { StoreApi, UseBoundStore } from "zustand" -import { TimelineStore } from "@aitube/timeline" - -import { BroadcastStore } from "./broadcast" -import { EditorStore } from "./editor" -import { MonitorStore } from "./monitor" -import { RendererStore } from "./renderer" -import { PluginsStore } from "./plugins" -import { AudioStore } from "./audio" -import { TasksStore } from "./tasks" - -export type AudioController = UseBoundStore> -export type BroadcastController = UseBoundStore> -export type EditorController = UseBoundStore> -export type MonitorController = UseBoundStore> -export type RendererController = UseBoundStore> -export type TasksController = UseBoundStore> -export type TimelineController = UseBoundStore> -export type PluginsController = UseBoundStore> - -export type PrivateControllers = { - plugins: PluginsController -} - -// the controllers publicly available -// missing from this list are the settings and the plugins store itself -export type PublicControllers = { - audio: AudioController - tasks: TasksController - editor: EditorController - monitor: MonitorController - timeline: TimelineController - renderer: RendererController - broadcast: BroadcastController -} - -export type Controllers = PrivateControllers & PublicControllers \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 2d4b780e..850e7156 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -1,3 +1,10 @@ +export { + ChatEvent, + ChatHistory, + AssistantStore, + AssistantState, + AssistantControls, +} from "./assistant" export { AudioAnalysis, @@ -14,18 +21,20 @@ export { } from "./broadcast" export { - AudioController, - TasksController, - BroadcastController, - EditorController, - MonitorController, - RendererController, - TimelineController, + AudioService, + AssistantService, + TasksService, + BroadcastService, + EditorService, + MonitorService, + RendererService, + ResolverService, + TimelineService, - PrivateControllers, - PublicControllers, - Controllers, -} from "./controllers" + PrivateServices, + PublicServices, + Services, +} from "./services" export { EditorState, @@ -51,7 +60,7 @@ export { ClapperPluginSettings, ClapperPluginMeta, BaseClapperPluginStore, - ClapperPluginController, + ClapperPluginService, ClapperPlugin, } from "./plugin" @@ -71,6 +80,13 @@ export { RendererStore, } from "./renderer" + +export { + ResolverState, + ResolverControls, + ResolverStore, +} from "./resolver" + export { TaskVisibility, TaskProgressType, diff --git a/packages/aitube-clapper-services/src/plugin.ts b/packages/aitube-clapper-services/src/plugin.ts index 010d4e9a..b553f038 100644 --- a/packages/aitube-clapper-services/src/plugin.ts +++ b/packages/aitube-clapper-services/src/plugin.ts @@ -74,9 +74,9 @@ export type ClapperPluginMeta = { export type BaseClapperPluginStore = {} -export type ClapperPluginController = UseBoundStore> +export type ClapperPluginService = UseBoundStore> export type ClapperPlugin = { meta: ClapperPluginMeta - controller: ClapperPluginController + controller: ClapperPluginService } diff --git a/packages/aitube-clapper-services/src/plugins.ts b/packages/aitube-clapper-services/src/plugins.ts index 7248bf99..def8af36 100644 --- a/packages/aitube-clapper-services/src/plugins.ts +++ b/packages/aitube-clapper-services/src/plugins.ts @@ -1,5 +1,5 @@ -import { PublicControllers } from "./controllers" +import { PublicServices } from "./services" import { ClapperPlugin, ClapperPluginMeta, @@ -12,7 +12,7 @@ export type ClapperPluginApi = { * * @returns */ - getControllers: () => PublicControllers + getServices: () => PublicServices /** * Load the plugin settings saved by the user @@ -35,7 +35,7 @@ export type PluginsState = { export type PluginsControls = { refreshAvailablePlugins: () => Promise - getPluginControllers: (plugin: ClapperPlugin) => PublicControllers + getPluginServices: (plugin: ClapperPlugin) => PublicServices getPluginSettings: (plugin: ClapperPlugin) => ClapperPluginSettings install: (plugin: ClapperPlugin) => Promise diff --git a/packages/aitube-clapper-services/src/resolver.ts b/packages/aitube-clapper-services/src/resolver.ts new file mode 100644 index 00000000..bdcd585c --- /dev/null +++ b/packages/aitube-clapper-services/src/resolver.ts @@ -0,0 +1,58 @@ +import { ClapSegment } from "@aitube/clap" + +export type ResolverState = { + // this indicate the status of the loop + // normally once it is running it is never stopped, + // since this is used to check if we have pending tasks + isRunning: boolean + + // used to "pause" the resolution + // request have have already be sent to the API providers + // will still be honored, which is why the number of pending + // requests won't drop to 0 immediately + isPaused: boolean + + defaultParallelismQuotas: { + video: number + image: number + voice: number + sound: number + music: number + } + + // used for UI display, show some metrics + currentParallelismQuotaForVideo: number + currentParallelismQuotaForImage: number + currentParallelismQuotaForVoice: number + currentParallelismQuotaForSound: number + currentParallelismQuotaForMusic: number + + // just some aliases for convenience, + // used for UI display, show some metrics + nbPendingRequestsForVideo: number + nbPendingRequestsForImage: number + nbPendingRequestsForVoice: number + nbPendingRequestsForSound: number + nbPendingRequestsForMusic: number + nbRequestsRunningInParallel: number + isBusyResolving: boolean +} + +export type ResolverControls = { + startLoop: () => void + runLoop: () => Promise + + togglePause: (isPaused?: boolean) => boolean + + /** + * This resolve a segment + * + * Note: while we return a clap segment, the original will be replaced, too + * + * @param segment + * @returns + */ + resolveSegment: (segment: ClapSegment) => Promise +} + +export type ResolverStore = ResolverState & ResolverControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts new file mode 100644 index 00000000..c057a1f3 --- /dev/null +++ b/packages/aitube-clapper-services/src/services.ts @@ -0,0 +1,43 @@ +import { StoreApi, UseBoundStore } from "zustand" +import { TimelineStore } from "@aitube/timeline" + +import { AssistantStore } from "./assistant" +import { BroadcastStore } from "./broadcast" +import { EditorStore } from "./editor" +import { MonitorStore } from "./monitor" +import { RendererStore } from "./renderer" +import { ResolverStore } from "./resolver" +import { PluginsStore } from "./plugins" +import { AudioStore } from "./audio" +import { TasksStore } from "./tasks" + +export type AssistantService = UseBoundStore> +export type AudioService = UseBoundStore> +export type BroadcastService = UseBoundStore> +export type EditorService = UseBoundStore> +export type MonitorService = UseBoundStore> +export type RendererService = UseBoundStore> +export type ResolverService = UseBoundStore> +export type TasksService = UseBoundStore> +export type TimelineService = UseBoundStore> +export type PluginsService = UseBoundStore> + +export type PrivateServices = { + plugins: PluginsService +} + +// the controllers publicly available +// missing from this list are the settings and the plugins store itself +export type PublicServices = { + assistant: AssistantService + audio: AudioService + tasks: TasksService + editor: EditorService + monitor: MonitorService + timeline: TimelineService + renderer: RendererService + resolver: ResolverService + broadcast: BroadcastService +} + +export type Services = PrivateServices & PublicServices \ No newline at end of file From 597fb732eba856bd5124b0728b5088a16df39ba0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 13:25:33 +0200 Subject: [PATCH 178/346] 0.0.1 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/plugin.ts | 2 +- packages/aitube-clapper-services/src/plugins.ts | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index f64b9a20..b14c3344 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.0", + "version": "0.0.1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/plugin.ts b/packages/aitube-clapper-services/src/plugin.ts index b553f038..919f4b03 100644 --- a/packages/aitube-clapper-services/src/plugin.ts +++ b/packages/aitube-clapper-services/src/plugin.ts @@ -78,5 +78,5 @@ export type ClapperPluginService = UseBoundStore Promise - getPluginServices: (plugin: ClapperPlugin) => PublicServices - getPluginSettings: (plugin: ClapperPlugin) => ClapperPluginSettings + install: (plugin: ClapperPluginMeta) => Promise + uninstall: (plugin: ClapperPluginMeta) => Promise - install: (plugin: ClapperPlugin) => Promise - uninstall: (plugin: ClapperPlugin) => Promise + pluginApiGetServices: (plugin: ClapperPlugin) => PublicServices + pluginApiGetSettings: (plugin: ClapperPlugin) => ClapperPluginSettings + + connect: (plugin: ClapperPlugin) => Promise } export type PluginsStore = PluginsState & PluginsControls \ No newline at end of file From f6d724544a2ada1fa6cc4e8c0cffb6a3c3c57a1c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 13:31:44 +0200 Subject: [PATCH 179/346] 0.0.2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/plugins.ts | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index b14c3344..0394ee49 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.1", + "version": "0.0.2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/plugins.ts b/packages/aitube-clapper-services/src/plugins.ts index 9c032142..f0d9a587 100644 --- a/packages/aitube-clapper-services/src/plugins.ts +++ b/packages/aitube-clapper-services/src/plugins.ts @@ -12,7 +12,7 @@ export type ClapperPluginApi = { * * @returns */ - getServices: () => PublicServices + getServices: () => Promise /** * Load the plugin settings saved by the user @@ -20,26 +20,24 @@ export type ClapperPluginApi = { * (to the local storage usually) * @returns */ - getSettings: () => ClapperPluginSettings + getSettings: () => Promise } export type PluginsState = { // list of plugins available for install availablePlugins: ClapperPluginMeta[] - installedPlugins: ClapperPlugin[] - - runningPlugins: ClapperPlugin[] + installedPlugins: Record } export type PluginsControls = { refreshAvailablePlugins: () => Promise - install: (plugin: ClapperPluginMeta) => Promise - uninstall: (plugin: ClapperPluginMeta) => Promise + install: (id: string) => Promise + uninstall: (id: string) => Promise - pluginApiGetServices: (plugin: ClapperPlugin) => PublicServices - pluginApiGetSettings: (plugin: ClapperPlugin) => ClapperPluginSettings + pluginApiGetServices: (id: string) => Promise + pluginApiGetSettings: (id: string) => Promise connect: (plugin: ClapperPlugin) => Promise } From 8a173983a98c0d31edf632fe00287227888d1dbe Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 14:41:05 +0200 Subject: [PATCH 180/346] 0.0.21 --- packages/broadway/package.json | 2 +- packages/broadway/src/analysis/parseScriptToClap.ts | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 1e93902d..6833e691 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.20", + "version": "0.0.21", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts index 0d9b41ac..a2206f03 100644 --- a/packages/broadway/src/analysis/parseScriptToClap.ts +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -25,11 +25,11 @@ export async function parseScriptToClap( // fix any mess which might be in it const content = cleanUTF8Characters(input) - await onProgressUpdate({ value: 10 }) + await onProgressUpdate({ value: 5 }) const screenplay = await getScreenplayFromText(content) - await onProgressUpdate({ value: 20 }) + await onProgressUpdate({ value: 30 }) const { movieGenreLabel, @@ -47,13 +47,13 @@ export async function parseScriptToClap( // so we want to continue the progress bar in the range [20, 70] await onProgressUpdate({ - value: 20 + (ratio * 50), + value: 30 + (ratio * 60), sleepDelay: 100, message }) }) - await onProgressUpdate({ value: 60 }) + await onProgressUpdate({ value: 90 }) // TODO: return a ClapProject instead @@ -88,6 +88,7 @@ export async function parseScriptToClap( entities: Object.values(entitiesById), segments, }) - + await onProgressUpdate({ value: 100 }) + return clap } \ No newline at end of file From a0c3584fe31d7ff62edefe34bf64f780d07146dd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:03:27 +0200 Subject: [PATCH 181/346] 0.0.30 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/io/parseClap.ts | 31 +++++++++++++++++++++--- packages/aitube-clap/src/types.ts | 10 ++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index e8dcbea8..52691cad 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.29", + "version": "0.0.30", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index 6d223671..1ade7a9d 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -1,6 +1,6 @@ import YAML from "yaml" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat } from "../types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat, ParseClapProgressUpdate } from "../types" import { getValidNumber } from "../utils/getValidNumber" import { dataUriToBlob } from "../converters/dataUriToBlob" import { UUID } from "@/utils/uuid" @@ -9,6 +9,8 @@ import { parseMediaOrientation } from "@/utils" type StringOrBlob = string | Blob +const defaultParseClapProgressUpdate: ParseClapProgressUpdate = async () => {} + /** * Import a clap file from various data sources into an ClapProject * @@ -22,7 +24,13 @@ type StringOrBlob = string | Blob * note: it is not really async, because for some reason YAML.parse is a blocking call like for JSON, * there is no async version although we are now in the 20s not 90s */ -export async function parseClap(src?: ClapProject | string | Blob, debug = false): Promise { +export async function parseClap( + src?: ClapProject | string | Blob, + debug = false, + onProgressUpdate: ParseClapProgressUpdate = defaultParseClapProgressUpdate +): Promise { + + await onProgressUpdate({ value: 0, message: "Opening .clap file.." }) try { if ( @@ -63,6 +71,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false }, null, 2)}`) } + await onProgressUpdate({ value: 10, message: "Analyzing .clap file.." }) + if (typeof stringOrBlob === "string") { if (debug) { console.log("parseClap: input is a string ", stringOrBlob.slice(0, 120)) @@ -81,6 +91,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false if (debug) { console.log(`parseClap: input is a remote .clap file`) } + await onProgressUpdate({ value: 20, message: "Downloading .clap file.." }) const res = await fetch(stringOrBlob) stringOrBlob = await res.blob() if (!stringOrBlob) { throw new Error("blob is empty") } @@ -112,6 +123,9 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false if (debug) { console.log("parseClap: decompressedOutput: ", decompressedOutput) } + + await onProgressUpdate({ value: 30, message: "Decompressing .clap file.." }) + // const blobAgain = await decompressedOutput.blob() inputYamlArrayString = await decompressedOutput.text() @@ -125,6 +139,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false } } + await onProgressUpdate({ value: 40, message: "Parsing .clap file.." }) + // we don't need this anymore I think // new Blob([inputStringOrBlob], { type: "application/x-yaml" }) @@ -147,6 +163,9 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false console.log("parseClap: the YAML seems okay, continuing decoding..") } + + await onProgressUpdate({ value: 50, message: "Importing data from .clap file.." }) + const maybeClapHeader = maybeArray[0] as ClapHeader if (maybeClapHeader.format !== ClapFormat.CLAP_0) { @@ -207,6 +226,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false const maybeSegments = maybeArray.slice(afterTheScenes) as ClapSegment[] + await onProgressUpdate({ value: 60, message: "Importing entities from .clap file.." }) + const clapEntities: ClapEntity[] = maybeEntities.map(({ id, category, @@ -251,6 +272,7 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false region, appearance, })) + await onProgressUpdate({ value: 70, message: "Importing scenes from .clap file.." }) const clapScenes: ClapScene[] = maybeScenes.map(({ id, @@ -275,7 +297,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false endAtLine, events: events.map(e => e) })) - + await onProgressUpdate({ value: 80, message: "Importing segments from .clap file.." }) + const clapSegments: ClapSegment[] = maybeSegments.map(({ id, track, @@ -338,6 +361,8 @@ export async function parseClap(src?: ClapProject | string | Blob, debug = false console.log(`parseClap: successfully parsed ${clapEntities.length} entities, ${clapScenes.length} scenes and ${clapSegments.length} segments`) } + await onProgressUpdate({ value: 100, message: "Buiding entity index.." }) + return { meta: clapMeta, entities: clapEntities, diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 73cce76e..c4b2f4ae 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -405,3 +405,13 @@ export enum ClapCompletionMode { */ REPLACE = "replace" } + +export type ParseClapProgressUpdate = ({ + value, + sleepDelay, + message +}: { + value: number + sleepDelay?: number + message?: string +}) => Promise From cedc2da2f7f20655486b4ae1cbdf7a195aeeb4c1 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:04:42 +0200 Subject: [PATCH 182/346] 0.0.9 --- packages/aitube-colors/bun.lockb | Bin 17622 -> 17622 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 2bc2911cf8deaa89ee28893d874c62f51f59c49c..a75713d027cce27e32c636b026a36ecefbbfdff2 100755 GIT binary patch delta 317 zcmV-D0mA;)i2>G$0gx^rOHC#;pa@B`*>IeEHM}wkjxoRrMsCI0B#sQX3Yctzu}&%l z0R@v`11Gbf1(*i`5tCs9CzD_e*a04sVFM?#U=B3~KpUj=Wqv%y3Ny#PeC|pfU)C(x z)-vd6umAJ>_Q5TC)qTPe8l=NT;wMVRb+$s#oGv8RmA~+OCYu7#1zH$EqqEf%XbM1Q zkB+8S5_k3)tF~;d@bu6!iFhn7HII60QUfO>d*A011))eww1VikX=C-b0KpeK*qE!6 zN$16Y!h8$Xo^L9%eIFnJK)ezS^XOh7QP>4GH2ECe$E1=1APZhx>ymvoN+3cD5Zzf_ z>OP2&K88E+=LnHjrZtzR5uQgxug0d}JAK*<5wqPOK@b8nFtZ>rlL!Gdv$Q!12>~~= Pzd{B90y8kP$3qVR4w!}j delta 315 zcmV-B0mS~+i2>G$0gx^rR^jeQHNP6K$_nry8|8O3uJ#7bnT$wIDE-SN-0Ii&u}&%l zlQae>v!Df-2LTV0VFM?VU=7#-9g|@LC$nGkgiS!TW@LO+;|2hZ7f5U%-guwy_QOvsMXQjD9|03h5sr zkJ9!wIYHpMCbNAXAOS$+e0#7i=O}h diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 5e4871c6..fb0c0fed 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.4.5" }, "peerDependencies": { - "@aitube/clap": "0.0.29" + "@aitube/clap": "0.0.30" }, "repository": { "type": "git", From 2f0bcfe10409a1b3df3230863570504ec9db3996 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:06:00 +0200 Subject: [PATCH 183/346] 0.0.22 --- packages/broadway/bun.lockb | Bin 33910 -> 33910 bytes packages/broadway/package.json | 6 +++--- .../src/analysis/parseScriptToClap.ts | 9 ++++----- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 38f3a4b10a18b8a40a6f9644844649b8898a0ca7..982eeb8ae9d54d03c7b6f51f9cd50d69a9f5a4c7 100755 GIT binary patch delta 428 zcmV;d0aO0=hywPA0+22s{qH_@-{bU0#~q?ziJ*5C#x6gw3c9gMOWvb_yR6m4u}(?~ z0R@u*1}C$?3YZ505t9K1C$oSO*a!g$lK}=NlRyRtlZYD-0Unb91}C$?8wCtN8>IAQ zemuqsGsnJs?n)kC)-2f8GU#cq|MUFz!7Y2$eZmqNq{BtxCrZY3wnEUHE+p2Kzwmq} zn*z`US{Om2vjr$<3P5L%j;2=4GH2ECe$E1=1APZhx>ymvoN+3cD5Zzf_>OP2&K88E+=LnHjrZtzR5uQgx zug0d}JAK*<5wm4K`5Xc>Fq2?h7y&u6d0dYQ12ZrHli^|;vnFS(1_3p*(`^a~0XMVW Wc9IMMIg@dNHvuz~pmHFS$%CyuY`q`= delta 421 zcmV;W0b2g{hywPA0+22sL{1?`$*T>bhV%rm^}2q&t|lFYHuGIHz9BesCx;$`u}(?~ zlT-^Rv%m_N2LTV00R|_tfD+gUlh_6@lZYD-0UeV81}C$?8wCtNDy5XM%E9}DeN9Ags)rL7Q(wS{8O{jy*aK`< z&{s)OB`5(S9_}hic_TG^L8G)Bd#ZF2T`lmjXs2}f-imD} zFSBJo`5Xc=Ig?;q7y&r5d0dYQ12Q=Pli^|;vnFS(1_3m)(`^a~0X4JUc9IMMIFoUM PHv%#_lc91SlgWdvqgS=p diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 6833e691..c7f7c69c 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.21", + "version": "0.0.22", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", @@ -21,8 +21,8 @@ "typescript": "^5.5.2" }, "peerDependencies": { - "@aitube/clap": "0.0.29", - "@aitube/colors": "0.0.8" + "@aitube/clap": "0.0.30", + "@aitube/colors": "0.0.9" }, "repository": { "type": "git", diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts index a2206f03..f5e49a7a 100644 --- a/packages/broadway/src/analysis/parseScriptToClap.ts +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -4,7 +4,6 @@ import { cleanUTF8Characters } from "@/utils" import { analyzeScreenplay } from "@/analysis/analyzeScreenplay" import { getScreenplayFromText } from "./getScreenplayFromText" -import { Scene } from "@/types" export type ParseScriptProgressUpdate = ({ value, @@ -29,7 +28,7 @@ export async function parseScriptToClap( const screenplay = await getScreenplayFromText(content) - await onProgressUpdate({ value: 30 }) + await onProgressUpdate({ value: 10 }) const { movieGenreLabel, @@ -47,8 +46,8 @@ export async function parseScriptToClap( // so we want to continue the progress bar in the range [20, 70] await onProgressUpdate({ - value: 30 + (ratio * 60), - sleepDelay: 100, + value: 10 + (ratio * 80), + sleepDelay: 25, message }) }) @@ -76,7 +75,7 @@ export async function parseScriptToClap( isLoop: false, isInteractive: false, }, - scenes: scenes.map(scene => ({ + scenes: scenes.map((scene, i) => ({ ...scene, // let's deprecate this field, this was a bad idea // (too much redundancy) From d8eb761d99d73a9afe004e9261976ef21ea6633e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:07:00 +0200 Subject: [PATCH 184/346] 0.0.34 --- packages/aitube-timeline/bun.lockb | Bin 159685 -> 160192 bytes packages/aitube-timeline/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index f4b89ecc3113d612ff1b0daa05cd25297fac82df..60ce448b427791e53978dde8ce4a741b2e2a6e59 100755 GIT binary patch delta 6357 zcmeHLX;>7;*6wN;V1QvqW>^PQ6orvhK$bxRD4;||1*3pV*dl@p$R^C7qM)Kc2MVGg z7(t0%<1*^t4k`#nB9dHjBSfQu3W^bpCNAHpnI1KHp8I^i?!Q|PXWnz(bLv!ebyZVU z%{|=4-?$|rhoLS5?e8NcFFAg$eiUU!QPKfliqZvq2euvHT|f)KPCz3-OTb}(8Z5qoc%E#ZMi_0ti=rq) za4lZBGA(Oa93|7@_R(5;%asY4K^;Ci&v12ZBsQy*fv(U8W2g|sVh`{pV5es&+iC}! zv?&K12I#*;>ED{E>{D`59C-{XG>f9R;5P!)1{?)(FEj zOEjKB8=Tra6m0S&tHt|8nyyY3Qz~mTg+b=(X8(Cal)Fn-&#y6Lrr5g3vc_DtV%Dt~ z%^a}Ml4VX&M~rWnFREmYg@`$}{uC9@oC@*bYyd5aXxtvqrb3TsrpeKh9xGloJVoB(kRLuNW?U`dve0S^2JS~kQ?bN+Q7U@7ju6CGFTCk@8Zds zlTJ|+7(ZtpRKgrvCFb^k9ROZ!Cg0qX>kab`hDB*{GQbL8PWkz8p1s%HV5Uw|a2r7L zS7^=eH8q&0!Gz<65DhY^F%xY)xrf1uQS@Qr7*DPx%vzDs=j6$a0BeH6YV!2t7K7yr z7Q7V)Pt?YEXNzgmY$iL~pPsD%PI)%zL2kAWrwcTHg=PxVELfq<11*#}W$VKogsB;> zXcLJ%x&FBnwcx!~4c46Z)(}`gPjIQ8q5IH2VBqEMS$=}ZDO&Q{Z8WS6%y(_P=}f`bCpd&cAcd8kyIg3%WBZv?cxMq>k;P5m(F446e4{Mt5*N z<4@eVvwgoqK*H87yCRJ;UI_LcP2M*+)Zto`=_vBpn!RME+NcpZJ-x=99aF*%ujy+@ zTKrs2HJSNbtK7?k^fpV+uGYC)ojOLwyPk=dfm>m+jvGr6Q*a}UDZIsF{BDJzW~S&? zq|B>(q*_4#85^C2u5V74WezqwSjjAP8>-|Q{M%h z6q~+VCl>IX9NtXK_1g5y(!ROr*38$x@&mf8#sn6}>wo5#^Z35{mM*zVfViN){osw+ zOLPn4JAIE@m(;eI9Xf4teFEKl;ZC!|%7=Ro6hD}w`F!McNkft-ME3mGOx=LrXMX8@ zzuoD4n*QO`^0q|p-NxR@KYsV1!Z1lYpxx;b!;Kb4P^Cz5%|3!D(~)XBSTU{>!z;O;0WlsW@2gF{`zuYsIKZzaMxWme|cW=Lt}YuZRy*h z0U@pK8>wExL_g*SRGxn3{z*yOaqr2?%uj8VZacK;Ok?7|HvMI3Z*>1qy+>Jz{>|jo zaSlFfzNT~gL&AP466sG0eerUi_Q;cq2PM<=WJexXass4(Hius1uei{&Fzv^LzKDU> zMf-nQk{;Pm5*K-On>g*8wRuSinW22Il>jlxYCoZMH^WTtqC zFG-}M9~`o|@mEK%hemf5FD4|vwx?(yA+2i2u4sCZ>yx>669jQxmYrg=#-1j(Uz)L8 z9vax?vZKXDvP&C>`=$R1MVYOZTN+8P%)KCHKjlUi>RMuKH&8>5UKlk1t9~ z7H-!1!(+4T%;g2s1yyk-Gjh6|j(6mYYg_9X^!i@j@QP;!$=p)L?>Rp}tF3(2q+VIp z4JO0EepuoGZ~I4CZ}q7-oL>vpEvkg98pk??YX!7m2D)i0CxVj&-)p-Bag%9=SJU8LCyk|7yFf-nf`ZIx>0RXw3&F zPB#s+skyf#;ZylE9%|rDrOHl@EaA8trj?l9p^CD0Y4NeM247#8HOFASroL9dl~kdB z&6K-!0rN+EHQ?!ASV#|EN;qgzT4j-3-o1pc`OynV#jl2;NL+7*csSY&g`ws6J2N1n z_(1UZK&-@b`9Nq1fH*~nbj%e1(Lji$0w6N*F+wDoBRyehe%3$~ z;38`vylj9NAjAgjZ39FfA-=W&q6j}AM5PdjX+j`2;VK~zQ*42FLx^G=VhhAeLhQ2z zVk>?{h9Bv^o@R*xe1pnk`~x{o02VTDr{jn@(1onlLtQe;6!w3Iu?#ZF5EAb zi>admH^Z*2r3^Cm+t0ezur4@DQ72e# zEz7~Vib`U+bu6a?+*^DbQb^{5O3HfH#REN%?ZpO`(*w>6II?XjWI3|4Nd=vxFJd`z zI5G#Fl#MJ0=SoV*a+_EVj)v4x5=6n4Ycos2F^h@?fzuUL%yK56F9IQD3(J{;9s)Wk zTUl-x=*K`v;u4lK13dwRlv3cx){GAl3OdPA4yXq0lk*^z1VTzBTN%!NWGhY1f>af7 zWI!xH;C!m!wy|-RU@rwBWjh;Z1$qhysawr*)}V)jPC8J-*0lkBI(gBA+`*DU&|#~t z=+w6?XA3qQ5y*j-+R1Wupf3Xx$yJG`(0Sy<(Qng=2Qk%HudkezTMNRqsu0?Co-PSDBD>LKJL+h?)` z50lTRL}s)pY@?|-ka-|eKte!5aqd^>42s8o+t3C>vQeJ_G7}^M#0y{9hHU6y8b98K zvb9^;o-V7$hsu#XuL2q&la9>Yweq^{NKKu42A-%Hc2mpa{-=2=A41zeN^E`yCXrL)Sxc(N6R&vL)*$7bF8D9V888CCGA+Wgw~e zX)TgVQb08ZNdzI&C;=oMBo1T+$Xv)t{Hs7n{?&jvAXy-pAfJE`p2TFcoGOmksyM=Z ztmlCb>PV=3P{@oSp8~Qt$)YU)A#45PLq41}x`vd+kw zBny}UN*Ig6a3O)Med@9?}9MfkW@WU6dUS#_A= zE)0fMbz=inJw-0~^;uK{*&$q@?3X~^aSm;ym6@igTx^6AaQ{VQjtwp#ca>Z5L`PJX zBFar=DSQI#bsp**Xhmz-KH{lu=qMY5Eia-qSoi}(R6}YN3(bTpbvK;y16qvS@!%!s zr#p7;P(b(<1qd&p%O8B!4agdgZbzobUGCqGH0ckn1(#92nmasoN&_;(e_e*A{+SYT zS>wbGMPnb*TVwSrBq27xg4_T;_N>1G-9Ao!YT$=|IZE+al*$6FN7Z*qZqUd@1n-E# z8l7l7HtIu06`e>68{I@k^6*Y1GQeYQ!=RkUxpz>I_Eos!A-9D#tMH{eXbjhRmC}~u zcX#0ZtL_Ht{?w@+XzcW+QJ%MGyvT*3da&nRfqi|E1Ta-#^B|?i7Q|NU*6nu!8+I&G{p*z*{;K%l zlrPxuKVC}p|9tP_Wk2TyPn1bUFPCQzAdUce$fX+e3Ok;sC@mp7fZU3&9G8J@V`*z# z5=3+4b`JCkWT@Z+7A;&9mppFS!WApy@X0Z>lNlSY;A3MG;!@&PEKEyXfn9=VJG{|} z{!~79EWHh3#)jy8-gT=nrHgpBPE!Bjh4K7e)W9MS?W(tr*$} XdEhHU$X1RQ($jeGQOEaF=$`)rf(yYv delta 6133 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 diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 606f3b70..741df920 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.33", + "version": "0.0.34", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -31,7 +31,7 @@ "vite": "^5.2.13" }, "peerDependencies": { - "@aitube/clap": "0.0.29", + "@aitube/clap": "0.0.30", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", From 655511fc7d50c923a174bcc8a97b19fcecf308a9 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:08:36 +0200 Subject: [PATCH 185/346] 0.0.3 --- packages/aitube-clapper-services/bun.lockb | Bin 87338 -> 86831 bytes packages/aitube-clapper-services/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 9aac412a26fc5ab121b92f2c2346bcd6d5a2c93a..72e5bad4319dceef50c7784297bd786b4933baf9 100755 GIT binary patch delta 3575 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 SUFom$Ts@v`*P6+EJO2+sIx0W_ diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 0394ee49..72fffb73 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.2", + "version": "0.0.3", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -21,8 +21,8 @@ "typescript": "^5.5.2" }, "peerDependencies": { - "@aitube/clap": "0.0.29", - "@aitube/timeline": "0.0.33", + "@aitube/clap": "0.0.30", + "@aitube/timeline": "0.0.34", "@monaco-editor/react": "^4.6.0", "monaco-editor": "^0.50.0", "react": "*", From 373e14bb88bed6056fcf402d7acfc1f0ea8bba6c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:09:47 +0200 Subject: [PATCH 186/346] 0.0.26 --- packages/aitube-engine/bun.lockb | Bin 17622 -> 17622 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index ea1e5ccffa4d74d4f3eb9e2a461976235c553f5f..b39dfd1af668b50c8699032b98779ef8ecd49340 100755 GIT binary patch delta 325 zcmV-L0lNOyi2>G$0gx^rOHC#;pa@B`*>IeEHM}wkjxoRrMsCI0B#sQX3Yctzu}&%l z0R@v`11Gbf1(*i`5tCs9CzD_e*a04sVFM?#U=B3~KpUj=Wqv%y3Ny#PeC|pfU)C(x z)-vd6umAJ>_Q5TC)qTPe8l=NT;wMVRb+$s#oGv8RmA~+OCYu7#1zH$EqqEf%XbM1Q zkB+8S5_k3)tF~;d@bu6!iFhn7HII60QUfO>d*A011))eww1VikX=C-b0KpeK*qE!6 zN$16Y!h8$Xo^L9%eIFnJK)ezS^XOh7QP>4GH2ECe$E1=1APZhx>ymvoN+3cD5Zzf_ z>OP2&K88E+=LnHjrZtzR5uQgxug0d}JAK*<5wqPOK@b8nFq0rLWdk)XGP8&=D+mEK Xv$Q!12>~~=zd{B90y8kP$3qVRKF5dQ delta 323 zcmV-J0lfa!i2>G$0gx^rR^jeQHNP6K$_nry8|8O3uJ#7bnT$wIDE-SN-0Ii&u}&%l zlQae>v!Df-2LTV0VFM?VU=7#-9g|@LC$nGkgiS!TW@LO+;|2hZ7f5U%-guwy_QOvsMXQjD9|03h5sr zkJ9!wIYHpMCbNAXAOS$+e0h%qY&0W`C; VISL5@HM74$1_1&xIkU$@4*_3)je-CG diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 018e0b34..d1420bdc 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.25", + "version": "0.0.26", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -16,10 +16,10 @@ "bun-types": "latest", "prettier": "^3.3.2", "rimraf": "^5.0.7", - "typescript": "^5.4.5" + "typescript": "^5.5.2" }, "peerDependencies": { - "@aitube/clap": "0.0.29" + "@aitube/clap": "0.0.30" }, "repository": { "type": "git", From 342fa2b40669ee1e961cdec3101a1600bcffdf48 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 18:11:12 +0200 Subject: [PATCH 187/346] 0.0.38 --- packages/aitube-client/bun.lockb | Bin 19102 -> 19102 bytes packages/aitube-client/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index c77b2f5bca072a0e4e6322145b7eaecbdbeb824a..5992a8db394d74044f359006cd1256e7969a17ac 100755 GIT binary patch delta 317 zcmV-D0mA;Cl>wfW0gx^rHp!N_Q5TC)qTPe8l=NT;wMVRb+$s#oGv8RmA~+OCYu7#1zH$EqqDUaXbM1Q zkB+8S5_k3)tF~;d@bu6!iFhn7HII60QUfO>d*A011))eww1VikX=C-b0KpeK*qE!6 zN$16Y!h8$Xo^L9%T_PX>K)ezS^XOh7QP>4GH2ECe$E1=1APZhx>ymvoN+3cD5Zzf_ z>OP2&K88E+=LnHjrZtzR5uQgxug0d}JAK*<5wpD`c@Y9LFta!{Lka;kvwS}a2>~~= Phe!qi0y8kPk4X;!0Pc&f delta 315 zcmV-B0mS~El>wfW0gx^rv8!~G9!T{T_Z))NT$XA4L}u8mvbtj>%2}TNY;l!su}*3R zlXM3tv)~4p2LTV0p#vwApbppp9h0F0C$pdr)dxT-rJ?y(A%7PPH4q7oJ*}R^iFDS- zu~;XN7*jU2y8<<6=kgiS!TW@LO+;|2hZ7f5U%-guwy_QOvsMXQjD9|03h5sr zkJ9!wIYHpMCbL~4AOS$+e0 Date: Wed, 26 Jun 2024 19:23:25 +0200 Subject: [PATCH 188/346] 0.0.4 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/assistant.ts | 14 +- .../aitube-clapper-services/src/base-types.ts | 168 +++++++++++++++ .../aitube-clapper-services/src/editor.ts | 11 + packages/aitube-clapper-services/src/index.ts | 37 +++- .../aitube-clapper-services/src/services.ts | 3 + .../aitube-clapper-services/src/settings.ts | 195 ++++++++++++++++++ packages/aitube-clapper-services/src/types.ts | 48 +++++ packages/aitube-clapper-services/src/ui.ts | 83 ++++++++ 9 files changed, 543 insertions(+), 18 deletions(-) create mode 100644 packages/aitube-clapper-services/src/base-types.ts create mode 100644 packages/aitube-clapper-services/src/settings.ts create mode 100644 packages/aitube-clapper-services/src/types.ts create mode 100644 packages/aitube-clapper-services/src/ui.ts diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 72fffb73..e6b40f21 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.3", + "version": "0.0.4", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/assistant.ts b/packages/aitube-clapper-services/src/assistant.ts index 6a26203d..217e21ef 100644 --- a/packages/aitube-clapper-services/src/assistant.ts +++ b/packages/aitube-clapper-services/src/assistant.ts @@ -1,16 +1,4 @@ -export type ChatEvent = { - eventId: string - senderId: string - senderName: string - roomId: string - roomName: string - sentAt: string - message: string - isCurrentUser: boolean -} - -export type ChatHistory = ChatEvent[] - +import { ChatEvent, ChatHistory } from "./base-types" /** * Assistant diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts new file mode 100644 index 00000000..2530c0e6 --- /dev/null +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -0,0 +1,168 @@ +import { ClapSegmentCategory } from "@aitube/clap" + +export type ChatEvent = { + eventId: string + senderId: string + senderName: string + roomId: string + roomName: string + sentAt: string + message: string + isCurrentUser: boolean +} + +export type ChatHistory = ChatEvent[] + + +export enum SettingsCategory { + NONE = "NONE", + PROVIDER = "PROVIDER", + ASSISTANT = "ASSISTANT", + IMAGE = "IMAGE", + VIDEO = "VIDEO", + VOICE = "VOICE", + MUSIC = "MUSIC", + SOUND = "SOUND" +} + +export enum ComputeProvider { + NONE = "NONE", + CUSTOM = "CUSTOM", + HUGGINGFACE = "HUGGINGFACE", // https://huggingface.co + COMFY_HUGGINGFACE = "COMFY_HUGGINGFACE", // https://huggingface.co + REPLICATE = "REPLICATE", // https://replicate.com + COMFY_REPLICATE = "COMFY_REPLICATE", // https://replicate.com + COMFY_COMFYICU = "COMFY_COMFYICU", // https://comfy.icu + ELEVENLABS = "ELEVENLABS", // https://elevenlabs.io + KITSAI = "KITSAI", // https://kits.ai + OPENAI = "OPENAI", // https://openai.com + STABILITYAI = "STABILITYAI", // https://stability.ai + FIREWORKSAI = "FIREWORKSAI", // https://fireworks.ai + GROQ = "GROQ", // https://groq.com + ANTHROPIC = "ANTHROPIC", // https://anthropic.com + GOOGLE = "GOOGLE", // https://google.com (in case you didn't know) + MISTRALAI = "MISTRALAI", // https://mistral.ai + COHERE = "COHERE", // https://cohere.com + FALAI = "FALAI", // https://fal.ai + MODELSLAB = "MODELSLAB", // https://modelslab.com + MIDJOURNEY = "MIDJOURNEY", + SUNO = "SUNO", + UDIO = "UDIO", + LUMALABS = "LUMALABS", + KUAISHOU = "KUAISHOU", + RUNWAYML = "RUNWAYML", + HEDRA = "HEDRA", + LEONARDOAI = "LEONARDOAI", + EVERARTAI = "EVERARTAI", +} + +export enum ComfyIcuAccelerator { + T4 = "T4", + L4 = "L4", + A10 = "A10", + A100_40GB = "A100_40GB", + A100_80GB = "A100_80GB", + H100 = "H100" +} + +export type ResolveRequestPrompts = { + image: { + // the positive prompt - elements we want in the scene + positive: string + + // the positive prompt - elements we don't want in the scene + negative: string + + + // the "identification picture" of the character, if available + identity: string + + // TODO: add LoRAs etc.. for location consistency + } + video: { + // input image to use for the video generation + image: string + + // input voice sample to use for the video generation + voice: string + } + voice: { + // the "identification voiceprint" of the character, if available + identity: string + + // the positive prompt - elements we want in the voice + positive: string + + // the positive prompt - elements we don't want in the voice + negative: string + } +} + +export type AssistantResponse = { + prompt: string + categoryName: ClapSegmentCategory + llmOutput: string +} + +export type ComfyParameter = + | string + | number + | boolean + | Array< string | number | boolean> + +export type ComfyNode = { + inputs: Record + /* + inputs: { + "seed": number + "steps": number + "cfg": number + "sampler_name":string + "scheduler": string + "denoise": number + "model": any[] + "positive": any[] + "negative": any[] + "latent_image": any[] + } + */ + class_type: string + _meta: { + title: string + } +} + +// note: they keep the high digit first in all cases +export enum FalAiImageSize { + SQUARE_HD = "square_hd", + SQUARE = "square", + PORTRAIT_4_3 = "portrait_4_3", + PORTRAIT_16_9 = "portrait_16_9", + LANDSCAPE_4_3 = "landscape_4_3", + LANDSCAPE_16_9 = "landscape_16_9" +} + +export enum StabilityAiImageSize { + SQUARE = "1:1", + PORTRAIT_2_3 = "2:3", + PORTRAIT_4_5 = "4:5", + PORTRAIT_9_16 = "9:16", + PORTRAIT_9_21 = "9:21", + LANDSCAPE_3_2 = "3:2", + LANDSCAPE_5_4 = "5:4", + LANDSCAPE_16_9 = "16:9", + LANDSCAPE_21_9 = "21:9" +} + +export enum StabilityAiGenerationMode { + "TEXT_TO_IMAGE" = "text-to-image", + "IMAGE_TO_IMAGE" = "image-to-image" +} + +export interface ImageSegment { + id: number; + box: number[]; + color: number[]; + label: string; + score: number; +} diff --git a/packages/aitube-clapper-services/src/editor.ts b/packages/aitube-clapper-services/src/editor.ts index 1879f237..4adf0217 100644 --- a/packages/aitube-clapper-services/src/editor.ts +++ b/packages/aitube-clapper-services/src/editor.ts @@ -2,6 +2,14 @@ import { ClapProject, ClapSegment } from "@aitube/clap" import { Monaco } from "@monaco-editor/react" import MonacoEditor from "monaco-editor" +export enum EditorView { + PROJECT = "PROJECT", + SCRIPT = "SCRIPT", + ENTITY = "ENTITY", + SEGMENT = "SEGMENT", + HISTORY = "HISTORY" +} + export type ScrollData = { scrollHeight: number scrollLeft: number @@ -10,6 +18,8 @@ export type ScrollData = { } export type EditorState = { + view: EditorView + monaco?: Monaco textModel?: MonacoEditor.editor.ITextModel @@ -37,6 +47,7 @@ export type EditorState = { } & ScrollData export type EditorControls = { + setView: (editorView: EditorView) => void setMonaco: (monaco?: Monaco) => void setTextModel: (textModel?: MonacoEditor.editor.ITextModel) => void setStandaloneCodeEditor: (standaloneCodeEditor?: MonacoEditor.editor.IStandaloneCodeEditor) => void diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 850e7156..3fcf7da8 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -1,6 +1,4 @@ export { - ChatEvent, - ChatHistory, AssistantStore, AssistantState, AssistantControls, @@ -14,6 +12,22 @@ export { CurrentlyPlayingAudioSource } from "./audio" +export { + ChatEvent, + ChatHistory, + SettingsCategory, + ComputeProvider, + ComfyIcuAccelerator, + ResolveRequestPrompts, + AssistantResponse, + ComfyParameter, + ComfyNode, + FalAiImageSize, + StabilityAiImageSize, + StabilityAiGenerationMode, + ImageSegment, +} from "./base-types" + export { BroadcastState, BroadcastControls, @@ -30,13 +44,15 @@ export { RendererService, ResolverService, TimelineService, - + UIService, PrivateServices, PublicServices, Services, } from "./services" export { + EditorView, + ScrollData, EditorState, EditorControls, EditorStore @@ -100,4 +116,17 @@ export { TasksState, TasksControls, TasksStore, -} from "./tasks" \ No newline at end of file +} from "./tasks" + +export { + ResolveRequest, + AssistantRequest, +} from "./types" + +export { + UIThemeName, + UITheme, + UIStore, + UIState, + UIControls +} from "./ui" \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index c057a1f3..d774174b 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -10,6 +10,7 @@ import { ResolverStore } from "./resolver" import { PluginsStore } from "./plugins" import { AudioStore } from "./audio" import { TasksStore } from "./tasks" +import { UIStore } from "./ui" export type AssistantService = UseBoundStore> export type AudioService = UseBoundStore> @@ -21,6 +22,7 @@ export type ResolverService = UseBoundStore> export type TasksService = UseBoundStore> export type TimelineService = UseBoundStore> export type PluginsService = UseBoundStore> +export type UIService = UseBoundStore> export type PrivateServices = { plugins: PluginsService @@ -38,6 +40,7 @@ export type PublicServices = { renderer: RendererService resolver: ResolverService broadcast: BroadcastService + ui: UIService } export type Services = PrivateServices & PublicServices \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts new file mode 100644 index 00000000..738a212a --- /dev/null +++ b/packages/aitube-clapper-services/src/settings.ts @@ -0,0 +1,195 @@ +import { RenderingStrategy } from "@aitube/timeline" + +import { ComfyIcuAccelerator, ComputeProvider } from "./base-types" + +export type SettingsState = { + customComfyUiApiKey: string + replicateApiKey: string + comfyIcuApiKey: string + comfyIcuAccelerator: ComfyIcuAccelerator + falAiApiKey: string + modelsLabApiKey: string + huggingFaceApiKey: string + openaiApiKey: string + googleApiKey: string + groqApiKey: string + anthropicApiKey: string + elevenLabsApiKey: string + kitsAiApiKey: string + cohereApiKey: string + mistralAiApiKey: string + stabilityAiApiKey: string + fireworksAiApiKey: string + + broadcastObsServerHost: string + broadcastObsServerPort: number + broadcastObsServerPass: string + + // ------------- CATEGORY PROVIDERS --------------- + assistantProvider: ComputeProvider + imageProvider: ComputeProvider + imageDepthProvider: ComputeProvider + imageSegmentationProvider: ComputeProvider + imageUpscalingProvider: ComputeProvider + videoProvider: ComputeProvider + videoDepthProvider: ComputeProvider + videoSegmentationProvider: ComputeProvider + videoUpscalingProvider: ComputeProvider + voiceProvider: ComputeProvider + soundProvider: ComputeProvider + musicProvider: ComputeProvider + + // -------------- SAFETY CHECKER ------------------ + + censorNotForAllAudiencesContent: boolean + + // -------------- MISC SETTINGS ------------------- + + imagePromptPrefix: string + imagePromptSuffix: string + imageNegativePrompt: string + videoPromptPrefix: string + videoPromptSuffix: string + videoNegativePrompt: string + + + assistantModel: string + assistantTurboModel: string + imageGenerationModel: string + imageGenerationTurboModel: string + imageUpscalingModel: string + imageDepthModel: string + imageSegmentationModel: string + videoGenerationModel: string + videoUpscalingModel: string + videoDepthModel: string + videoSegmentationModel: string + soundGenerationModel: string + voiceGenerationModel: string + musicGenerationModel: string + + imageRenderingStrategy: RenderingStrategy + imageUpscalingRenderingStrategy: RenderingStrategy + imageDepthRenderingStrategy: RenderingStrategy + imageSegmentationRenderingStrategy: RenderingStrategy + videoRenderingStrategy: RenderingStrategy + videoUpscalingRenderingStrategy: RenderingStrategy + videoDepthRenderingStrategy: RenderingStrategy + videoSegmentationRenderingStrategy: RenderingStrategy + voiceRenderingStrategy: RenderingStrategy + soundRenderingStrategy: RenderingStrategy + musicRenderingStrategy: RenderingStrategy + + maxImagesToGenerateInParallel: number + maxVideosToGenerateInParallel: number + + // ------------ COMFY UI WORKFLOWS ----------------- + comfyWorkflowForImage: string + comfyWorkflowForVideo: string + comfyWorkflowForVoice: string + comfyWorkflowForSound: string + comfyWorkflowForMusic: string + + // ---------- MODELS FOR EACH PROVIDER -------------- + + + gradioApiUrlForAssistant: string + gradioApiUrlForImage: string + gradioApiUrlForVideo: string + gradioApiUrlForVoice: string + gradioApiUrlForSound: string + gradioApiUrlForMusic: string + +} + +export type SettingsControls = { + setCustomComfyUiApiKey: (customComfyUiApiKey?: string) => void + setReplicateApiKey: (replicateApiKey?: string) => void + setComfyIcuApiKey: (comfyIcuApiKey?: string) => void + setComfyIcuAccelerator: (comfyIcuAccelerator?: ComfyIcuAccelerator) => void + setHuggingFaceApiKey: (huggingFaceApiKey?: string) => void + setModelsLabApiKey: (modelsLabApiKey?: string) => void + setFalAiApiKey: (falAiApiKey?: string) => void + setOpenaiApiKey: (openaiApiKey?: string) => void + setGoogleApiKey: (googleApiKey?: string) => void + setGroqApiKey: (groqApiKey?: string) => void + setFireworksAiApiKey: (fireworksAiApiKey?: string) => void + setAnthropicApiKey: (anthropicApiKey?: string) => void + setElevenLabsApiKey: (elevenLabsApiKey?: string) => void + setCohereApiKey: (cohereApiKey?: string) => void + setMistralAiApiKey: (mistralAiApiKey?: string) => void + setKitsAiApiKey: (kitsAiApiKey?: string) => void + setStabilityAiApiKey: (stabilityAiApiKey?: string) => void + + setAssistantProvider: (assistantProvider?: ComputeProvider) => void + setImageProvider: (imageProvider?: ComputeProvider) => void + setImageDepthProvider: (imageDepthProvider?: ComputeProvider) => void + setImageSegmentationProvider: (imageSegmentationProvider?: ComputeProvider) => void + setImageUpscalingProvider: (imageUpscalingProvider?: ComputeProvider) => void + setVideoProvider: (videoProvider?: ComputeProvider) => void + setVideoDepthProvider: (videoDepthProvider?: ComputeProvider) => void + setVideoSegmentationProvider: (videoSegmentationProvider?: ComputeProvider) => void + setVideoUpscalingProvider: (videoUpscalingProvider?: ComputeProvider) => void + setVoiceProvider: (voiceProvider?: ComputeProvider) => void + setSoundProvider: (soundProvider?: ComputeProvider) => void + setMusicProvider: (musicProvider?: ComputeProvider) => void + + + setCensorNotForAllAudiencesContent: (censorNotForAllAudiencesContent?: boolean) => void + setImagePromptPrefix: (imagePromptPrefix?: string) => void + setImagePromptSuffix: (imagePromptSuffix?: string) => void + setImageNegativePrompt: (imageNegativePrompt?: string) => void + setVideoPromptPrefix: (videoPromptPrefix?: string) => void + setVideoPromptSuffix: (videoPromptSuffix?: string) => void + setVideoNegativePrompt: (videoNegativePrompt?: string) => void + + setAssistantModel: (assistantModel?: string) => void + setAssistantTurboModel: (assistantTurboModel?: string) => void + setImageGenerationModel: (imageGenerationModel?: string) => void + setImageGenerationTurboModel: (imageGenerationTurboModel?: string) => void + setImageUpscalingModel: (imageUpscalingModel?: string) => void + setImageDepthModel: (imageDepthModel?: string) => void + setImageSegmentationModel: (imageSegmentationModel?: string) => void + setVideoGenerationModel: (videoGenerationModel?: string) => void + setVideoDepthModel: (videoDepthModel?: string) => void + setVideoSegmentationModel: (videoSegmentationModel?: string) => void + setVideoUpscalingModel: (videoUpscalingModel?: string) => void + setSoundGenerationModel: (soundGenerationModel?: string) => void + setVoiceGenerationModel: (voiceGenerationModel?: string) => void + setMusicGenerationModel: (musicGenerationModel?: string) => void + + setImageRenderingStrategy: (imageRenderingStrategy?: RenderingStrategy) => void + setImageUpscalingRenderingStrategy: (imageUpscalingRenderingStrategy?: RenderingStrategy) => void + setImageDepthRenderingStrategy: (imageDepthRenderingStrategy?: RenderingStrategy) => void + setImageSegmentationRenderingStrategy: (imageSegmentationRenderingStrategy?: RenderingStrategy) => void + setVideoRenderingStrategy: (videoRenderingStrategy?: RenderingStrategy) => void + setVideoDepthRenderingStrategy: (videoDepthRenderingStrategy?: RenderingStrategy) => void + setVideoSegmentationRenderingStrategy: (videoSegmentationRenderingStrategy?: RenderingStrategy) => void + setVideoUpscalingRenderingStrategy: (videoUpscalingRenderingStrategy?: RenderingStrategy) => void + setVoiceRenderingStrategy: (voiceRenderingStrategy?: RenderingStrategy) => void + setSoundRenderingStrategy: (soundRenderingStrategy?: RenderingStrategy) => void + setMusicRenderingStrategy: (musicRenderingStrategy?: RenderingStrategy) => void + + + setMaxImagesToGenerateInParallel: (maxImagesToGenerateInParallel?: number) => void + setMaxVideosToGenerateInParallel: (maxVideosToGenerateInParallel?: number) => void + + setComfyWorkflowForImage: (comfyWorkflowForImage?: string) => void + setComfyWorkflowForVideo: (comfyWorkflowForVideo?: string) => void + setComfyWorkflowForVoice: (comfyWorkflowForVoice?: string) => void + setComfyWorkflowForSound: (comfyWorkflowForSound?: string) => void + setComfyWorkflowForMusic: (comfyWorkflowForMusic?: string) => void + + setGradioApiUrlForAssistant: (gradioApiUrlForAssistant?: string) => void + setGradioApiUrlForImage: (gradioApiUrlForImage?: string) => void + setGradioApiUrlForVideo: (gradioApiUrlForVideo?: string) => void + setGradioApiUrlForVoice: (gradioApiUrlForVoice?: string) => void + setGradioApiUrlForSound: (gradioApiUrlForSound?: string) => void + setGradioApiUrlForMusic: (gradioApiUrlForMusic?: string) => void + + getSettings: () => SettingsState +} + +export type SettingsStore = + SettingsState & + SettingsControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts new file mode 100644 index 00000000..fa5b69cd --- /dev/null +++ b/packages/aitube-clapper-services/src/types.ts @@ -0,0 +1,48 @@ +import { ClapEntity, ClapMeta, ClapSegment } from "@aitube/clap" + +import { SettingsState } from "./settings" +import { ChatEvent, ResolveRequestPrompts } from "./base-types" + +export type ResolveRequest = { + settings: SettingsState + + // the reference segment to render (eg. storyboard or video) + segment: ClapSegment + + // the slice to use for rendering + segments: ClapSegment[] + + entities: Record + + speakingCharactersIds: string[] + generalCharactersIds: string[] + mainCharacterId?: string + mainCharacterEntity?: ClapEntity + + meta: ClapMeta + + prompts: ResolveRequestPrompts +} + +export type AssistantRequest = { + settings: SettingsState + + prompt: string + + // the slice to edit + segments: ClapSegment[] + + // the full text of the current scene + fullScene: string + + // the full text of the current action line + actionLine: string + + // used to provide more context + entities: Record + + // used to provide more context + projectInfo: string + + history: ChatEvent[] +} diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts new file mode 100644 index 00000000..1d49eeee --- /dev/null +++ b/packages/aitube-clapper-services/src/ui.ts @@ -0,0 +1,83 @@ +import { SettingsCategory } from "./base-types" + +export type UIThemeName = "lavender" | "backstage" | "midnight" | "mythril" | "flix" | "lore" | "mocha" | string + +/** + * TODO: + * + * - more colors for Monaco editor + * + * - change shadcn/ui colors + * + * - timeline CSS filter is a quick hack to get a hue, + * instead (or in addition to it) we could pass color parameters + * + * - handle light and dark themes + * + */ +export type UITheme = { + id: UIThemeName + label: string + author: string + description: string + defaultBgColor?: string + defaultTextColor?: string + defaultPrimaryColor?: string + logoColor?: string + editorBgColor?: string + editorCursorColor?: string + editorTextColor?: string + + // background color of the video preview monitor + monitorBgColor?: string + + // text of the elapsed/total duration counter in the video preview monitor + monitorSecondaryTextColor?: string + monitorPrimaryTextColor?: string + + assistantBgColor?: string + assistantUserBgColor?: string + assistantRobotBgColor?: string + assistantUserTextColor?: string + assistantRobotTextColor?: string + + // TODO replace by a proper theme system for the timeline + timelineFilter: string +} + +export type UIState = { + hasBetaAccess: boolean + themeName: UIThemeName + showApiKeys: boolean + showSettings: SettingsCategory + showImporter: boolean + showTimeline: boolean + showExplorer: boolean + showVideoPlayer: boolean + showAssistant: boolean + showFPS: boolean + followCursor: boolean + editorFontSize: number +} + +export type UIControls = { + setHasBetaAccess: (hasBetaAccess: boolean) => void + setThemeName: (themeName: UIThemeName) => void + applyThemeToComponents: () => void + getTheme: () => UITheme + setShowApiKeys: (showApiKeys: boolean) => void + setShowSettings: (showSettings: SettingsCategory) => void + setShowImporter: (showImporter: boolean) => void + setShowTimeline: (showTimeline: boolean) => void + setShowExplorer: (showExplorer: boolean) => void + setShowVideoPlayer: (showVideoPlayer: boolean) => void + setShowAssistant: (showAssistant: boolean) => void + setShowFPS: (showFPS: boolean) => void + setFollowCursor: (followCursor: boolean) => void + setEditorFontSize: (editorFontSize: number) => void + +} + +export type UIStore = + UIState & + UIControls \ No newline at end of file From a96333d81fb5fbf79e189431cf4851dd800a1fba Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 26 Jun 2024 19:27:28 +0200 Subject: [PATCH 189/346] 0.0.5 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 7 +++++++ packages/aitube-clapper-services/src/services.ts | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index e6b40f21..bea06c01 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.4", + "version": "0.0.5", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 3fcf7da8..0a8b78f8 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -43,6 +43,7 @@ export { MonitorService, RendererService, ResolverService, + SettingsService, TimelineService, UIService, PrivateServices, @@ -118,6 +119,12 @@ export { TasksStore, } from "./tasks" +export { + SettingsState, + SettingsControls, + SettingsStore +} from "./settings" + export { ResolveRequest, AssistantRequest, diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index d774174b..ef93f547 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -9,6 +9,7 @@ import { RendererStore } from "./renderer" import { ResolverStore } from "./resolver" import { PluginsStore } from "./plugins" import { AudioStore } from "./audio" +import { SettingsStore } from "./settings" import { TasksStore } from "./tasks" import { UIStore } from "./ui" @@ -19,6 +20,7 @@ export type EditorService = UseBoundStore> export type MonitorService = UseBoundStore> export type RendererService = UseBoundStore> export type ResolverService = UseBoundStore> +export type SettingsService = UseBoundStore> export type TasksService = UseBoundStore> export type TimelineService = UseBoundStore> export type PluginsService = UseBoundStore> @@ -26,6 +28,7 @@ export type UIService = UseBoundStore> export type PrivateServices = { plugins: PluginsService + settings: SettingsService } // the controllers publicly available From 893b1fb3fd726b62a600846ee709e249b8c106d7 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 27 Jun 2024 13:15:16 +0200 Subject: [PATCH 190/346] 0.0.6 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/editors.ts | 17 +++++++ .../src/entity-editor.ts | 13 +++++ packages/aitube-clapper-services/src/index.ts | 49 ++++++++++++++++--- .../src/project-editor.ts | 14 ++++++ .../src/{editor.ts => script-editor.ts} | 22 +++------ .../src/segment-editor.ts | 12 +++++ .../aitube-clapper-services/src/services.ts | 18 +++++-- .../src/version-control.ts | 11 +++++ 9 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 packages/aitube-clapper-services/src/editors.ts create mode 100644 packages/aitube-clapper-services/src/entity-editor.ts create mode 100644 packages/aitube-clapper-services/src/project-editor.ts rename packages/aitube-clapper-services/src/{editor.ts => script-editor.ts} (82%) create mode 100644 packages/aitube-clapper-services/src/segment-editor.ts create mode 100644 packages/aitube-clapper-services/src/version-control.ts diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index bea06c01..2e74c438 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.5", + "version": "0.0.6", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/editors.ts b/packages/aitube-clapper-services/src/editors.ts new file mode 100644 index 00000000..91f89536 --- /dev/null +++ b/packages/aitube-clapper-services/src/editors.ts @@ -0,0 +1,17 @@ +export enum EditorView { + PROJECT = "PROJECT", + SCRIPT = "SCRIPT", + ENTITY = "ENTITY", + SEGMENT = "SEGMENT", + HISTORY = "HISTORY" +} + +export type EditorsState = { + view: EditorView +} + +export type EditorsControls = { + setView: (editorView: EditorView) => void +} + +export type EditorsStore = EditorsState & EditorsControls diff --git a/packages/aitube-clapper-services/src/entity-editor.ts b/packages/aitube-clapper-services/src/entity-editor.ts new file mode 100644 index 00000000..c84c8915 --- /dev/null +++ b/packages/aitube-clapper-services/src/entity-editor.ts @@ -0,0 +1,13 @@ +import { ClapEntity } from "@aitube/clap" + +import { VersionControls, VersionedState } from "./version-control" + +export type EntityEditorState = { + +} & VersionedState + +export type EntityEditorControls = { + +} & VersionControls + +export type EntityEditorStore = EntityEditorState & EntityEditorControls diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 0a8b78f8..fcf009a4 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -39,7 +39,11 @@ export { AssistantService, TasksService, BroadcastService, - EditorService, + ProjectEditorService, + SegmentEditorService, + EntityEditorService, + ScriptEditorService, + EditorsService, MonitorService, RendererService, ResolverService, @@ -52,12 +56,38 @@ export { } from "./services" export { - EditorView, ScrollData, - EditorState, - EditorControls, - EditorStore -} from "./editor" + ScriptEditorState, + ScriptEditorControls, + ScriptEditorStore +} from "./script-editor" + + +export { + ProjectEditorState, + ProjectEditorControls, + ProjectEditorStore +} from "./project-editor" + + +export { + EntityEditorState, + EntityEditorControls, + EntityEditorStore +} from "./entity-editor" + +export { + SegmentEditorState, + SegmentEditorControls, + SegmentEditorStore +} from "./segment-editor" + +export { + EditorView, + EditorsState, + EditorsControls, + EditorsStore +} from "./editors" export { MonitoringMode, @@ -136,4 +166,9 @@ export { UIStore, UIState, UIControls -} from "./ui" \ No newline at end of file +} from "./ui" + +export { + VersionedState, + VersionControls +} from "./version-control" \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/project-editor.ts b/packages/aitube-clapper-services/src/project-editor.ts new file mode 100644 index 00000000..1f9e8e15 --- /dev/null +++ b/packages/aitube-clapper-services/src/project-editor.ts @@ -0,0 +1,14 @@ +import { ClapMeta } from "@aitube/clap" + +import { VersionControls, VersionedState } from "./version-control" + +export type ProjectEditorState = { + +} & VersionedState + + +export type ProjectEditorControls = { + +} & VersionControls + +export type ProjectEditorStore = ProjectEditorState & ProjectEditorControls diff --git a/packages/aitube-clapper-services/src/editor.ts b/packages/aitube-clapper-services/src/script-editor.ts similarity index 82% rename from packages/aitube-clapper-services/src/editor.ts rename to packages/aitube-clapper-services/src/script-editor.ts index 4adf0217..cd84428a 100644 --- a/packages/aitube-clapper-services/src/editor.ts +++ b/packages/aitube-clapper-services/src/script-editor.ts @@ -1,14 +1,7 @@ import { ClapProject, ClapSegment } from "@aitube/clap" import { Monaco } from "@monaco-editor/react" import MonacoEditor from "monaco-editor" - -export enum EditorView { - PROJECT = "PROJECT", - SCRIPT = "SCRIPT", - ENTITY = "ENTITY", - SEGMENT = "SEGMENT", - HISTORY = "HISTORY" -} +import { VersionControls, VersionedState } from "./version-control" export type ScrollData = { scrollHeight: number @@ -17,9 +10,7 @@ export type ScrollData = { scrollWidth: number } -export type EditorState = { - view: EditorView - +export type ScriptEditorState = { monaco?: Monaco textModel?: MonacoEditor.editor.ITextModel @@ -44,10 +35,9 @@ export type EditorState = { * (the topmost visible timeline step in the current timeline) */ scrollTopInMs: number -} & ScrollData +} & ScrollData & VersionedState -export type EditorControls = { - setView: (editorView: EditorView) => void +export type ScriptEditorControls = { setMonaco: (monaco?: Monaco) => void setTextModel: (textModel?: MonacoEditor.editor.ITextModel) => void setStandaloneCodeEditor: (standaloneCodeEditor?: MonacoEditor.editor.IStandaloneCodeEditor) => void @@ -59,6 +49,6 @@ export type EditorControls = { jumpCursorOnLineClick: (line?: number) => void highlightElements: () => void applyClassNameToKeywords: (className?: string, keywords?: string[], caseSensitive?: boolean) => void -} +} & VersionControls -export type EditorStore = EditorState & EditorControls +export type ScriptEditorStore = ScriptEditorState & ScriptEditorControls diff --git a/packages/aitube-clapper-services/src/segment-editor.ts b/packages/aitube-clapper-services/src/segment-editor.ts new file mode 100644 index 00000000..9e23d535 --- /dev/null +++ b/packages/aitube-clapper-services/src/segment-editor.ts @@ -0,0 +1,12 @@ +import { ClapSegment } from "@aitube/clap" +import { VersionControls, VersionedState } from "./version-control" + +export type SegmentEditorState = { + +} & VersionedState + +export type SegmentEditorControls = { + +} & VersionControls + +export type SegmentEditorStore = SegmentEditorState & SegmentEditorControls diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index ef93f547..d890f8ad 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -3,7 +3,11 @@ import { TimelineStore } from "@aitube/timeline" import { AssistantStore } from "./assistant" import { BroadcastStore } from "./broadcast" -import { EditorStore } from "./editor" +import { SegmentEditorStore } from "./segment-editor" +import { EntityEditorStore } from "./entity-editor" +import { ProjectEditorStore } from "./project-editor" +import { ScriptEditorStore } from "./script-editor" +import { EditorsStore } from "./editors" import { MonitorStore } from "./monitor" import { RendererStore } from "./renderer" import { ResolverStore } from "./resolver" @@ -16,7 +20,11 @@ import { UIStore } from "./ui" export type AssistantService = UseBoundStore> export type AudioService = UseBoundStore> export type BroadcastService = UseBoundStore> -export type EditorService = UseBoundStore> +export type SegmentEditorService = UseBoundStore> +export type EntityEditorService = UseBoundStore> +export type ProjectEditorService = UseBoundStore> +export type ScriptEditorService = UseBoundStore> +export type EditorsService = UseBoundStore> export type MonitorService = UseBoundStore> export type RendererService = UseBoundStore> export type ResolverService = UseBoundStore> @@ -37,7 +45,11 @@ export type PublicServices = { assistant: AssistantService audio: AudioService tasks: TasksService - editor: EditorService + segmentEditor: SegmentEditorService + entityEditor: EntityEditorService + projectEditor: ProjectEditorService + scriptEditor: ScriptEditorService + editors: EditorsService monitor: MonitorService timeline: TimelineService renderer: RendererService diff --git a/packages/aitube-clapper-services/src/version-control.ts b/packages/aitube-clapper-services/src/version-control.ts new file mode 100644 index 00000000..698b29a5 --- /dev/null +++ b/packages/aitube-clapper-services/src/version-control.ts @@ -0,0 +1,11 @@ +export type VersionedState = { + current?: T + version: number + history: T[] +} + +export type VersionControls = { + setCurrent: (current?: T) => void + undo: () => void + redo: () => void +} From 68cea81bba9148b8a07c134b609957f0202b3be1 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 27 Jun 2024 13:55:14 +0200 Subject: [PATCH 191/346] 0.0.7 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/ui.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 2e74c438..a036f6d2 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.6", + "version": "0.0.7", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 1d49eeee..6d26cc32 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -1,3 +1,4 @@ +import { ClapTimelineTheme } from "@aitube/timeline" import { SettingsCategory } from "./base-types" export type UIThemeName = "lavender" | "backstage" | "midnight" | "mythril" | "flix" | "lore" | "mocha" | string @@ -41,8 +42,7 @@ export type UITheme = { assistantUserTextColor?: string assistantRobotTextColor?: string - // TODO replace by a proper theme system for the timeline - timelineFilter: string + timeline: ClapTimelineTheme } export type UIState = { From 0304f7d1af9be5869636e2440fa28e9c7747398f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 27 Jun 2024 14:30:29 +0200 Subject: [PATCH 192/346] 0.0.8 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/ui.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index a036f6d2..1a3a5df0 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.7", + "version": "0.0.8", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 6d26cc32..74001bbe 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -24,10 +24,13 @@ export type UITheme = { defaultBgColor?: string defaultTextColor?: string defaultPrimaryColor?: string + defaultBorderColor?: string logoColor?: string editorBgColor?: string editorCursorColor?: string editorTextColor?: string + editorMenuBgColor?: string + editorBorderColor?: string // background color of the video preview monitor monitorBgColor?: string From f2668d737de00d357728fbef1b8a18c1d12a0106 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 29 Jun 2024 18:55:50 +0200 Subject: [PATCH 193/346] 0.0.9 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 7 +++++++ packages/aitube-clapper-services/src/renderer.ts | 1 - packages/aitube-clapper-services/src/services.ts | 3 +++ packages/aitube-clapper-services/src/simulator.ts | 12 ++++++++++++ 5 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 packages/aitube-clapper-services/src/simulator.ts diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 1a3a5df0..1d6d6c49 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.8", + "version": "0.0.9", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index fcf009a4..3d323ba7 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -48,6 +48,7 @@ export { RendererService, ResolverService, SettingsService, + SimulatorService, TimelineService, UIService, PrivateServices, @@ -155,6 +156,12 @@ export { SettingsStore } from "./settings" +export { + SimulatorState, + SimulatorControls, + SimulatorStore +} from "./simulator" + export { ResolveRequest, AssistantRequest, diff --git a/packages/aitube-clapper-services/src/renderer.ts b/packages/aitube-clapper-services/src/renderer.ts index c0595abf..8d3da1f2 100644 --- a/packages/aitube-clapper-services/src/renderer.ts +++ b/packages/aitube-clapper-services/src/renderer.ts @@ -13,7 +13,6 @@ export type UpcomingSegments = { upcomingSegments: ClapSegment[] upcomingVideoSegment?: ClapSegment upcomingStoryboardSegment?: ClapSegment - upcomingAudioSegments: ClapSegment[] } export type BufferedSegments = ActiveSegments & UpcomingSegments diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index d890f8ad..71e494b7 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -14,6 +14,7 @@ import { ResolverStore } from "./resolver" import { PluginsStore } from "./plugins" import { AudioStore } from "./audio" import { SettingsStore } from "./settings" +import { SimulatorStore } from "./simulator" import { TasksStore } from "./tasks" import { UIStore } from "./ui" @@ -29,6 +30,7 @@ export type MonitorService = UseBoundStore> export type RendererService = UseBoundStore> export type ResolverService = UseBoundStore> export type SettingsService = UseBoundStore> +export type SimulatorService = UseBoundStore> export type TasksService = UseBoundStore> export type TimelineService = UseBoundStore> export type PluginsService = UseBoundStore> @@ -55,6 +57,7 @@ export type PublicServices = { renderer: RendererService resolver: ResolverService broadcast: BroadcastService + simulator: SimulatorService ui: UIService } diff --git a/packages/aitube-clapper-services/src/simulator.ts b/packages/aitube-clapper-services/src/simulator.ts new file mode 100644 index 00000000..e31d21af --- /dev/null +++ b/packages/aitube-clapper-services/src/simulator.ts @@ -0,0 +1,12 @@ +export type SimulatorState = { + isRunning: boolean +} + +export type SimulatorControls = { + startLoop: () => void + runLoop: () => Promise + + togglePause: (isPaused?: boolean) => boolean +} + +export type SimulatorStore = SimulatorState & SimulatorControls \ No newline at end of file From 1256106381d88406f9f2918fe52e83fb982be1ae Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 29 Jun 2024 18:58:35 +0200 Subject: [PATCH 194/346] 0.0.35 --- packages/aitube-timeline/README.md | 2 +- packages/aitube-timeline/package.json | 2 +- .../components/timeline/LeftBarTrackScale.tsx | 20 +++++--------- .../components/timeline/TopBarTimeScale.tsx | 14 ++++------ .../aitube-timeline/src/constants/defaults.ts | 13 +-------- .../aitube-timeline/src/constants/index.ts | 11 +++++++- .../aitube-timeline/src/constants/themes.ts | 14 +++++++--- .../aitube-timeline/src/hooks/useTimeline.ts | 27 +++++++++++-------- packages/aitube-timeline/src/index.tsx | 8 +++++- packages/aitube-timeline/src/types/theme.ts | 12 ++++++++- .../aitube-timeline/src/types/timeline.ts | 1 + 11 files changed, 69 insertions(+), 55 deletions(-) diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md index 1b24491a..fdac681e 100644 --- a/packages/aitube-timeline/README.md +++ b/packages/aitube-timeline/README.md @@ -44,7 +44,7 @@ to build with the jsxDEV enabled. You will also want to use a path like this to test the module directly dependency: ```json - "@aitube/timeline": "file:/path/to/aitube-timeline", + "@aitube/timeline": "file:/Users/jbilcke/Projects/Typescript_Libraries/aitube-timeline", ``` diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 741df920..41074dad 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.34", + "version": "0.0.35", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx index d11a66fc..8022ecf7 100644 --- a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx @@ -16,7 +16,7 @@ export function LeftBarTrackScale() { const contentHeight = useTimeline((s) => s.contentHeight) const getCellHeight = useTimeline((s) => s.getCellHeight) - + const theme = useTimeline(s => s.theme) const getVerticalCellPosition = useTimeline((s) => s.getVerticalCellPosition) @@ -45,9 +45,7 @@ export function LeftBarTrackScale() { key={idx}> @@ -68,7 +66,7 @@ export function LeftBarTrackScale() { e.stopPropagation() }} > - + s.jumpAt) const togglePlayback = useTimeline(s => s.togglePlayback) + const theme = useTimeline(s => s.theme) const wasPlayingRef = useRef(undefined) @@ -171,7 +172,7 @@ export function TopBarTimeScale() { @@ -187,11 +188,8 @@ export function TopBarTimeScale() { key={idx}> @@ -215,9 +213,7 @@ export function TopBarTimeScale() { ]} lineHeight={1.0} - color={ - "#ffffff" - } + color={theme.topBarTimeScale.textColor} // fillOpacity={0.7} anchorX="center" // default anchorY="middle" // default diff --git a/packages/aitube-timeline/src/constants/defaults.ts b/packages/aitube-timeline/src/constants/defaults.ts index 2e218659..917c6f48 100644 --- a/packages/aitube-timeline/src/constants/defaults.ts +++ b/packages/aitube-timeline/src/constants/defaults.ts @@ -1,6 +1,6 @@ import { ClapTimelineTheme } from "@/types" import { ClapSegmentCategory } from "@aitube/clap" -import { baseClapSegmentCategoryHues } from "./themes" +import { baseClapSegmentCategoryHues, pastel } from "./themes" export const DEFAULT_MIN_ZOOM = 0.2 @@ -10,17 +10,6 @@ export const DEFAULT_ZOOM_DAMPING_FACTOR = 0.3 // low : delay, high : faster/sna export const DEFAULT_SHOW_FPS = false export const DEFAULT_FRAMELOOP = "demand" -export const pastel: ClapTimelineTheme = { - grid: { - backgroundColor: "#27272A", - }, - cell: { - saturation: 28.4, - lightness: 78.6, - hues: baseClapSegmentCategoryHues, - } -} - export const DEFAULT_THEMES: Record = { pastel, } \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/index.ts b/packages/aitube-timeline/src/constants/index.ts index 16b952ad..d0a9159d 100644 --- a/packages/aitube-timeline/src/constants/index.ts +++ b/packages/aitube-timeline/src/constants/index.ts @@ -1,3 +1,13 @@ +export { + DEFAULT_MIN_ZOOM, + DEFAULT_MAX_ZOOM, + DEFAULT_ZOOM_SPEED, + DEFAULT_ZOOM_DAMPING_FACTOR, + DEFAULT_SHOW_FPS, + DEFAULT_FRAMELOOP, + DEFAULT_THEMES, +} from "./defaults" + export { DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS, @@ -14,6 +24,5 @@ export { export { baseClapSegmentCategoryHues, pastel, - DEFAULT_THEMES, leftBarTrackScaleWidth } from "./themes" diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/aitube-timeline/src/constants/themes.ts index 30d263ed..7e5b74fd 100644 --- a/packages/aitube-timeline/src/constants/themes.ts +++ b/packages/aitube-timeline/src/constants/themes.ts @@ -32,6 +32,16 @@ export const baseClapSegmentCategoryHues: ClapSegmentCategoryHues = { } export const pastel: ClapTimelineTheme = { + topBarTimeScale: { + backgroundColor: "#7d7c78", + textColor: "#ffffff", + lineColor: "#E6E6E6" + }, + leftBarTrackScale: { + backgroundColor: "#7d7c78", + textColor: "#ffffff", + lineColor: "#B3B3B3" + }, grid: { backgroundColor: "#27272A", }, @@ -41,7 +51,3 @@ export const pastel: ClapTimelineTheme = { hues: baseClapSegmentCategoryHues } } - -export const DEFAULT_THEMES: Record = { - pastel, -} \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index ddcb64fc..e40938db 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -7,7 +7,7 @@ import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { removeFinalVideos } from "@/utils/removeFinalVideos" import { hslToHex } from "@/utils/hslToHex" -import { ClapSegmentCategoryHues, ClapSegmentColorScheme, SegmentResolver } from "@/types" +import { ClapSegmentCategoryHues, ClapSegmentColorScheme, ClapTimelineTheme, SegmentResolver } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { getFinalVideo } from "@/utils/getFinalVideo" @@ -345,6 +345,9 @@ export const useTimeline = create((set, get) => ({ }) }) }, + setTimelineTheme: (theme: ClapTimelineTheme) => { + set({ theme }) + }, setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => { set({ timelineCamera }) }, @@ -622,13 +625,25 @@ export const useTimeline = create((set, get) => ({ return findFreeTrack({ segments, startTimeInMs, endTimeInMs }) }, + // resize and move the end of a segmrnt, as well as the segment after it fitSegmentToAssetDuration: async (segment: ClapSegment, requestedDurationInMs?: number): Promise => { + const { + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + segments, + segmentsChanged, + totalDurationInMs: previousTotalDurationInMs + } = get() + const durationInMs: number = typeof requestedDurationInMs === "number" && isFinite(requestedDurationInMs) && !isNaN(requestedDurationInMs) ? requestedDurationInMs : segment.assetDurationInMs + // trivial case: nothing to do! const segmentDurationInMs = segment.endTimeInMs - segment.startTimeInMs if ( @@ -639,7 +654,6 @@ export const useTimeline = create((set, get) => ({ return } - // let's set some limits eg. at least 1 sec, I think this is reasonable const minimumLengthInSteps = 2 const minimumLengthInMs = minimumLengthInSteps * DEFAULT_DURATION_IN_MS_PER_STEP @@ -657,15 +671,6 @@ export const useTimeline = create((set, get) => ({ // ok, well, there is nothing to change actually if (segmentDurationInMs === newSegmentDurationInMs) { return } - const { - clap, - tracks, - cellWidth, - defaultSegmentDurationInSteps, - segments, - segmentsChanged, - totalDurationInMs: previousTotalDurationInMs - } = get() // positive if new duration is longer, // negative if shorter diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 4c33be42..80b463c2 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -15,6 +15,13 @@ export { } from "./components" export { + DEFAULT_MIN_ZOOM, + DEFAULT_MAX_ZOOM, + DEFAULT_ZOOM_SPEED, + DEFAULT_ZOOM_DAMPING_FACTOR, + DEFAULT_SHOW_FPS, + DEFAULT_FRAMELOOP, + DEFAULT_THEMES, DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS, DEFAULT_COLUMNS_PER_SLICE, @@ -23,7 +30,6 @@ export { NB_MAX_SHOTS, baseClapSegmentCategoryHues, pastel, - DEFAULT_THEMES, segmentVisibilityPriority, leftBarTrackScaleWidth } from "./constants" diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/aitube-timeline/src/types/theme.ts index 4a1aae88..bbbdb4f4 100644 --- a/packages/aitube-timeline/src/types/theme.ts +++ b/packages/aitube-timeline/src/types/theme.ts @@ -3,9 +3,19 @@ import { ClapSegmentCategory } from "@aitube/clap" export type ClapSegmentCategoryHues = Record export type ClapTimelineTheme = { + topBarTimeScale: { + backgroundColor: string + textColor: string + lineColor: string + } + leftBarTrackScale: { + backgroundColor: string + textColor: string + lineColor: string + } grid: { backgroundColor: string - }, + } cell: { saturation: number lightness: number diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 5b765190..27cc9bbc 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -191,6 +191,7 @@ export type TimelineStoreModifiers = { // that way we don't need to re-draw the whole thing trackSilentChangeInSegment: (segmentId: string) => void + setTimelineTheme: (theme: ClapTimelineTheme) => void setTimelineCamera: (timelineCamera?: TimelineCameraImpl) => void setTimelineControls: (timelineControls?: TimelineControlsImpl) => void setTopBarTimeScale: (topBarTimeScale?: THREE.Group) => void From 2d545da0cb11736b4998a47b43e051594b9c418f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 29 Jun 2024 19:01:36 +0200 Subject: [PATCH 195/346] 0.0.10 --- packages/aitube-clapper-services/bun.lockb | Bin 86831 -> 86831 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 72e5bad4319dceef50c7784297bd786b4933baf9..2d1d24fe706fb91ab3e7e83659b4fc0480d6f223 100755 GIT binary patch delta 415 zcmV;Q0bu^GrUkF21&}Tv)vGDxRXLlENo@IrL;PNSG}s4aks)15zC3;1;5PqTu}-EB zlXMd_vnUYI43qRKD3hQL2(u_15ETIvlQ9q{vtTlq0h4qSD6=3m#UVfm33c?J;P`gq zZvGhFVNEr0L@)kr{Gg!l^Mbibo#L|!jA6cyT$>ReH-{B@^D_Q)QZ+p}E!<;8NOW!a z-zpKaC03vjKz(j34Un95wP{`bVel6(WTcG3Qs&K@K)vjJruW$fAE~gp__a*$6l^G_ zl`nY>^8fRQK{{5$H)tGAZ5ay9hqDD}_#8mu96*U(|WQZ;H{{?(&4+7fwD> z2^d8)N3*4e6kq{0v%2T;DFHK<5&;GME9AG!!VaAT-4xK=vAUR-M0u zR1}De3ZuoscvWYv4-b=c*fjDH?$SUEsJUVH1@7@0E4Hr`bmdDe z^U-Jhfq-8m>Qf`YEk8O7CR_0QKU0{6zbx|8n*%XejT*!oH-<9OF0(y_C;~vVgT}xa z=V}4P#ekfyN-`c|E}6S70(1qTgdxSASwc z79XJHYiCchrH2$?0W`C^=kX~4GM8}?0U@`|5dq;20W`O-AORH_0XUaYJ^>)N M0Rb_$W;+4N7eB+UDF6Tf diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 1d6d6c49..10ef438f 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.9", + "version": "0.0.10", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.0.30", - "@aitube/timeline": "0.0.34", + "@aitube/timeline": "0.0.35", "@monaco-editor/react": "^4.6.0", "monaco-editor": "^0.50.0", "react": "*", From 667d3d2ef2223205e43d9265fd4283476ded48db Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 29 Jun 2024 19:16:50 +0200 Subject: [PATCH 196/346] 0.0.11 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/ui.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 10ef438f..2f545124 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.10", + "version": "0.0.11", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 74001bbe..a5ad37fc 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -30,6 +30,7 @@ export type UITheme = { editorCursorColor?: string editorTextColor?: string editorMenuBgColor?: string + editorMenuTextColor?: string editorBorderColor?: string // background color of the video preview monitor From 5f09cdd0e01501327d03e70f74b3457fb6c4f87b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 5 Jul 2024 17:41:03 +0200 Subject: [PATCH 197/346] add waveform display --- .../src/components/cells/AudioCell.tsx | 71 +++++++ .../src/components/cells/Cell.tsx | 5 +- .../src/components/cells/Waveform.tsx | 145 ++++++++++++++ .../aitube-timeline/src/constants/themes.ts | 19 +- .../aitube-timeline/src/hooks/useTimeline.ts | 182 ++++++++++++++---- packages/aitube-timeline/src/types/theme.ts | 11 ++ .../aitube-timeline/src/types/timeline.ts | 15 +- 7 files changed, 412 insertions(+), 36 deletions(-) create mode 100644 packages/aitube-timeline/src/components/cells/AudioCell.tsx create mode 100644 packages/aitube-timeline/src/components/cells/Waveform.tsx diff --git a/packages/aitube-timeline/src/components/cells/AudioCell.tsx b/packages/aitube-timeline/src/components/cells/AudioCell.tsx new file mode 100644 index 00000000..d5fce2af --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/AudioCell.tsx @@ -0,0 +1,71 @@ +import { RoundedBox } from "@react-three/drei" +import { SpecializedCellProps } from "./types" +import { Waveform } from "./Waveform" + +export function AudioCell({ + segment: s, + cellWidth, + cellHeight, + isHovered, + setHoveredSegment, + durationInSteps, + startTimeInSteps, + colorScheme, + widthInPx, + widthInPxAfterZoom, + isResizing, + track +}: SpecializedCellProps) { + + const padding = 1.2 + + const fontSize = 13 + const lineHeight = 1.2 + + return ( + + + + + + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index ba3ee207..a6465ab2 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -12,6 +12,7 @@ import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/theme import { RedrawButton } from "./RedrawButton" import { Suspense } from "react" import { useSegmentChanges } from "@/hooks/useSegmentChanges" +import { AudioCell } from "./AudioCell" export function Cell({ segment: s @@ -65,8 +66,10 @@ export function Cell({ const SpecializedCell = s.assetUrl.startsWith("data:image/") ? ImageCell - : s.assetUrl.startsWith("data:video/") + : s.assetUrl.startsWith("data:video/") ? VideoCell + : s.assetUrl.startsWith("data:audio/") + ? AudioCell : TextCell const setHoveredSegment = useTimeline(s => s.setHoveredSegment) diff --git a/packages/aitube-timeline/src/components/cells/Waveform.tsx b/packages/aitube-timeline/src/components/cells/Waveform.tsx new file mode 100644 index 00000000..0b3e6983 --- /dev/null +++ b/packages/aitube-timeline/src/components/cells/Waveform.tsx @@ -0,0 +1,145 @@ +import React, { useRef, useEffect, useMemo } from 'react'; +import { useThree } from '@react-three/fiber'; +import * as THREE from 'three'; +import { ClapTrack } from '@aitube/clap'; + +import { RuntimeSegment } from '@/types'; + +type WaveformVariant = 'stereo' | 'mono' | 'compact'; + +type WaveformProps = { + segment: RuntimeSegment; + track: ClapTrack; + cellWidth: number; + cellHeight: number; + durationInSteps: number; + opacity?: number; + color?: string; + variant?: WaveformVariant; + lineSpacing?: number; + thickness?: number; + topOrBottomFillOpacity?: number; + middleFillOpacity?: number; +}; + +export const Waveform: React.FC = ({ + segment, + track, + cellWidth, + cellHeight, + durationInSteps, + opacity = 1, + color = '#ffffff', + variant = 'mono', + lineSpacing = 0, + thickness = 1, + topOrBottomFillOpacity = 0.2, + middleFillOpacity = 0.8 +}) => { + const meshRef = useRef(null); + const { gl } = useThree(); + + const width = durationInSteps * cellWidth; + const height = cellHeight; + + const getWaveformTexture = useMemo(() => { + return (audioBuffer: AudioBuffer, width: number, height: number): THREE.Texture => { + if (!segment.textures) { + segment.textures = {}; + } + + const cacheKey = `waveform_${width}_${height}_${color}_${variant}_${lineSpacing}_${thickness}_${topOrBottomFillOpacity}_${middleFillOpacity}`; + + if (segment.textures[cacheKey]) { + return segment.textures[cacheKey]; + } + + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext('2d')!; + + const drawChannel = (channelData: Float32Array, yOffset: number, channelHeight: number) => { + const step = Math.ceil(channelData.length / width); + + for (let i = 0; i < width; i++) { + if (i % (lineSpacing + 1) !== 0) continue; + + let max = -1.0; + for (let j = 0; j < step; j++) { + const datum = channelData[(i * step) + j]; + if (datum > max) max = datum; + } + + const x = i; + // Only draw the positive part (top half) of the waveform + const y = yOffset + channelHeight; + const h = Math.max(1, max * channelHeight); + + // Create gradient from bottom to top + const gradient = ctx.createLinearGradient(x, y - h, x, y); + gradient.addColorStop(0, `${color}${Math.round(middleFillOpacity * 255).toString(16).padStart(2, '0')}`); + gradient.addColorStop(1, `${color}${Math.round(topOrBottomFillOpacity * 255).toString(16).padStart(2, '0')}`); + + // Fill + ctx.fillStyle = gradient; + ctx.fillRect(x, y - h, 1, h); + + // Stroke + if (thickness > 0) { + ctx.strokeStyle = color; + ctx.lineWidth = thickness; + ctx.strokeRect(x, y - h, 1, h); + } + } + }; + + switch (variant) { + case 'stereo': + drawChannel(audioBuffer.getChannelData(0), 0, height / 2); + if (audioBuffer.numberOfChannels > 1) { + drawChannel(audioBuffer.getChannelData(1), height / 2, height / 2); + } + break; + case 'mono': + case 'compact': + drawChannel(audioBuffer.getChannelData(0), 0, height); + break; + } + + const texture = new THREE.Texture(canvas); + texture.needsUpdate = true; + + segment.textures[cacheKey] = texture; + return texture; + }; + }, [color, variant, lineSpacing, thickness, topOrBottomFillOpacity, middleFillOpacity]); + + useEffect(() => { + if (meshRef.current && segment.assetUrl) { + fetch(segment.assetUrl) + .then(response => response.arrayBuffer()) + .then(arrayBuffer => { + const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)(); + return audioContext.decodeAudioData(arrayBuffer); + }) + .then(audioBuffer => { + const texture = getWaveformTexture(audioBuffer, width, height); + if (meshRef.current) { + (meshRef.current.material as THREE.MeshBasicMaterial).map = texture; + (meshRef.current.material as THREE.MeshBasicMaterial).needsUpdate = true; + } + }) + .catch(error => console.error('Error loading audio:', error)); + } + }, [segment.assetUrl, width, height, getWaveformTexture, gl]); + + return ( + + + + + ); +}; \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/aitube-timeline/src/constants/themes.ts index 7e5b74fd..b56010f0 100644 --- a/packages/aitube-timeline/src/constants/themes.ts +++ b/packages/aitube-timeline/src/constants/themes.ts @@ -48,6 +48,23 @@ export const pastel: ClapTimelineTheme = { cell: { saturation: 30, lightness: 78.6, - hues: baseClapSegmentCategoryHues + hues: baseClapSegmentCategoryHues, + + waveform: { + // "original" style + lineSpacing: 2, + gradientStart: 1.0, + gradientEnd: 0.6, + + // "drapes" style + // lineSpacing: 0, + // gradientStart: 0.7, + // gradientEnd: 0.1, + + // that is an "aggressive" style + // lineSpacing: 1, + // gradientStart: 0.6, + // gradientEnd: 1.0, + } } } diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index e40938db..d49cf473 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -15,6 +15,7 @@ import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/compone import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" import { findFreeTrack } from "@/utils/findFreeTrack" import { getAudioBuffer } from "@/utils" +import { assign } from "three/examples/jsm/nodes/Nodes.js" export const useTimeline = create((set, get) => ({ ...getDefaultState(), @@ -296,6 +297,10 @@ export const useTimeline = create((set, get) => ({ borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), textColorHover: hslToHex(baseHue, baseSaturation + 55, baseLightness - 50), + + waveformLineSpacing: theme.cell.waveform.lineSpacing, + waveformGradientStart: theme.cell.waveform.gradientStart, + waveformGradientEnd: theme.cell.waveform.gradientEnd, } if (!segment) { return colorScheme } @@ -319,6 +324,10 @@ export const useTimeline = create((set, get) => ({ borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), textColorHover: hslToHex(baseHue, baseSaturation + 55, baseLightness - 50), + + waveformLineSpacing: theme.cell.waveform.lineSpacing, + waveformGradientStart: theme.cell.waveform.gradientStart, + waveformGradientEnd: theme.cell.waveform.gradientEnd, } return colorScheme @@ -533,42 +542,34 @@ export const useTimeline = create((set, get) => ({ }))) } }, - addSegment: async ({ + assignTrack: async ({ segment, - startTimeInMs, - track: requestedTrack + track, + triggerChange, }: { segment: ClapSegment - startTimeInMs?: number - track?: number + track: number + triggerChange?: boolean }): Promise => { - // adding a segment is a bit complicated, lot of stuff might have to be updated const { clap, - findFreeTrack, cellWidth, - tracks, - segments: previousSegments, - segmentsChanged: previousSegmentsChanged, - totalDurationInMs: previousTotalDurationInMs, defaultSegmentDurationInSteps, + totalDurationInMs, + tracks, defaultPreviewHeight, defaultCellHeight, + segmentsChanged: previousSegmentsChanged, } = get() - // note: the requestedTrack might not be empty - - // for now let's do something simple: to always search for an available track - const availableTrack = findFreeTrack({ startTimeInMs }) - - segment.track = availableTrack - + segment.track = track + // add the track if it is missing if (!tracks[segment.track]) { const isPreview = segment.category === ClapSegmentCategory.STORYBOARD || segment.category === ClapSegmentCategory.VIDEO - + tracks[segment.track] = { id: segment.track, // name: `Track ${s.track}`, @@ -584,6 +585,57 @@ export const useTimeline = create((set, get) => ({ } } + if (triggerChange) { + set({ + segmentsChanged: previousSegmentsChanged + 1, + ...computeContentSizeMetrics({ + clap, + tracks, + cellWidth, + defaultSegmentDurationInSteps, + totalDurationInMs, + }), + }) + } + }, + addSegment: async ({ + segment, + startTimeInMs, + track: requestedTrack + }: { + segment: ClapSegment + startTimeInMs?: number + track?: number + }): Promise => { + // adding a segment is a bit complicated, lot of stuff might have to be updated + const { + clap, + findFreeTrack, + cellWidth, + tracks, + segments: previousSegments, + segmentsChanged: previousSegmentsChanged, + totalDurationInMs: previousTotalDurationInMs, + defaultSegmentDurationInSteps, + defaultPreviewHeight, + defaultCellHeight, + assignTrack, + } = get() + + // note: the requestedTrack might not be empty + + // for now let's do something simple: to always search for an available track + const availableTrack = findFreeTrack({ startTimeInMs }) + + assignTrack({ + segment, + track: availableTrack, + + // we don't want to trigger a state change just yet + triggerChange: false, + }) + + // we assume that the provided segment is valid, with a unique UUID // then we need to update everything @@ -635,7 +687,9 @@ export const useTimeline = create((set, get) => ({ defaultSegmentDurationInSteps, segments, segmentsChanged, - totalDurationInMs: previousTotalDurationInMs + totalDurationInMs: previousTotalDurationInMs, + findFreeTrack, + assignTrack } = get() const durationInMs: number = @@ -676,25 +730,86 @@ export const useTimeline = create((set, get) => ({ // negative if shorter const newTimeDifferenceInMs = newSegmentDurationInMs - segmentDurationInMs + const startTimeInMs = segment.startTimeInMs const endTimeInMs = segment.endTimeInMs // const newEndTimeInMs = endTimeInMs + newTimeDifferenceInMs let totalDurationInMs = previousTotalDurationInMs - // we shift everything that's impacted - // overlapping segments will be stretched - // (those should be marked as "TO_GENERATE") + const referenceSegmentIsMusicOrSound = + segment.category === ClapSegmentCategory.MUSIC + || segment.category === ClapSegmentCategory.SOUND + + let segmentsToDelete: string[] = [] + for (const s of segments) { - if (endTimeInMs <= s.startTimeInMs) { - s.startTimeInMs += newTimeDifferenceInMs - } - if (endTimeInMs <= s.endTimeInMs) { - s.endTimeInMs += newTimeDifferenceInMs - } + // our strategy will be different depending on the type of segment + // basically, if it's a sound or a music, we don't need to cut the segment, + // and we don't have to extend the current shot. + // instead, we can let it go outerbound, although this creates 2 problems: + // 1. overlapping with another music/sound (on the same track or not) + // -> fix is easy, we can resize or delete completely the other one + // 2. collision with an item on the same track (eg. of a different type) + // -> fix is annoying, for now the a quick solution is to put the segment + // onto its own free track + const currentSegmentIsMusicOrSound = + s.category === ClapSegmentCategory.MUSIC + || s.category === ClapSegmentCategory.SOUND - // also need to update the total duration - if (s.endTimeInMs > totalDurationInMs) { - totalDurationInMs = s.endTimeInMs + const isSameCategoryAsReferenceSegment = s.category === segment.category + + const isSamePromptAsReferenceSegment = s.prompt === segment.prompt + + + if (referenceSegmentIsMusicOrSound) { + + if (isSameCategoryAsReferenceSegment && isSamePromptAsReferenceSegment) { + if (s.endTimeInMs <= endTimeInMs) { + // we delete + console.log("TODO JULIAN: DELETE SEGMENT", s) + // segmentsToDelete.push(s.id) + // note: + } else if (s.startTimeInMs < endTimeInMs) { + // we resize + s.startTimeInMs = endTimeInMs + } + } + // independently, we run our collision detector + // it is important at this stage to take into account any change, + // eg. if we've already deleted segment `s` there is no need to + // assign a new free track + const isSameTrackAsReferenceSegment = s.track === segment.track + + if (isSameTrackAsReferenceSegment) { + // if we have a collision, there is currently no way around it we need to create a new track + if (!(s.endTimeInMs <= startTimeInMs || s.startTimeInMs >= endTimeInMs)) { + const newTrack = findFreeTrack({ startTimeInMs, endTimeInMs }) + // console.log(`NEW TRACK (${newTrack}) FOR SEGMENT`, s) + + assignTrack({ + segment, + track: newTrack, + + // we don't want to trigger a state change + triggerChange: false, + }) + + } + + } + } else { + // this is a dialogue or a video, we can apply our regular strategy + if (endTimeInMs <= s.startTimeInMs) { + s.startTimeInMs += newTimeDifferenceInMs + } + if (endTimeInMs <= s.endTimeInMs) { + s.endTimeInMs += newTimeDifferenceInMs + } + + // also need to update the total duration + if (s.endTimeInMs > totalDurationInMs) { + totalDurationInMs = s.endTimeInMs + } } } console.log(`TODO Julian: stretched segments (overlapping segments) should be re-generated`) @@ -711,4 +826,5 @@ export const useTimeline = create((set, get) => ({ }) }) } -})) +} +)) diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/aitube-timeline/src/types/theme.ts index bbbdb4f4..91b8ba5c 100644 --- a/packages/aitube-timeline/src/types/theme.ts +++ b/packages/aitube-timeline/src/types/theme.ts @@ -1,4 +1,5 @@ import { ClapSegmentCategory } from "@aitube/clap" +import { string } from "three/examples/jsm/nodes/Nodes.js" export type ClapSegmentCategoryHues = Record @@ -20,6 +21,12 @@ export type ClapTimelineTheme = { saturation: number lightness: number hues: ClapSegmentCategoryHues + + waveform: { + lineSpacing: number + gradientStart: number + gradientEnd: number + } } } @@ -35,4 +42,8 @@ export type ClapSegmentColorScheme = { borderColor: string textColor: string textColorHover: string + + waveformLineSpacing: number + waveformGradientStart: number + waveformGradientEnd: number } \ No newline at end of file diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 27cc9bbc..9c560d75 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -33,13 +33,17 @@ export type BrowserOnlySegmentData = { // used to give more context to the LLM, so it can have the full text of the scene scene?: ClapScene - // use for convenience, for easily match the script editor with segments + // used for convenience, to easily match the script editor with segments startAtLine?: number endAtLine?: number audioBuffer?: AudioBuffer visibility?: SegmentVisibility + + + // Cache for waveform textures + textures?: Record } export type RuntimeSegment = ClapSegment & BrowserOnlySegmentData @@ -232,6 +236,15 @@ export type TimelineStoreModifiers = { startTimeInMs?: number track?: number }) => Promise + assignTrack: ({ + segment, + track, + triggerChange, + }: { + segment: ClapSegment + track: number + triggerChange?: boolean + }) => Promise addSegment: ({ segment, startTimeInMs, From b1e854aee1ef731fcb2e75cd686b1a787540060e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 5 Jul 2024 17:45:18 +0200 Subject: [PATCH 198/346] minor fix --- .../src/components/controls/TimelineControls.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index 2a7819a8..cad134a8 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -93,7 +93,7 @@ export function TimelineControls({ // if you want to change those, fine, // but make sure the timeline still works properly when you change its height, // horizontal zoom, and number of tracks - -topBottomSize + PROMPT_STEP_HEIGHT_IN_PX, // to take to top time scroll bar into account + -topBottomSize, // to take to top time scroll bar into account // the +38px as here to represent the top scroll bar, // but I'm not so sure we need it anymore? From 03e552da479c385aea28488adb3ec8c4ec971d7f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 7 Jul 2024 15:09:34 +0200 Subject: [PATCH 199/346] 0.0.36 --- packages/aitube-timeline/bun.lockb | Bin 160192 -> 160564 bytes packages/aitube-timeline/package.json | 4 +- .../src/components/cells/Cell.tsx | 15 +- .../src/components/cells/RedrawButton.tsx | 4 +- .../src/components/cells/Waveform.tsx | 18 +- .../src/components/cells/types.ts | 9 +- .../src/hooks/useSegmentChanges.ts | 6 +- .../src/hooks/useSegmentLoader.ts | 7 +- .../aitube-timeline/src/hooks/useTimeline.ts | 177 ++++++++++++++---- packages/aitube-timeline/src/index.tsx | 6 +- packages/aitube-timeline/src/types/index.ts | 3 +- .../aitube-timeline/src/types/rendering.ts | 5 +- .../aitube-timeline/src/types/timeline.ts | 90 ++++++--- .../src/utils/clapSegmentToTimelineSegment.ts | 36 ++++ .../src/utils/getDefaultState.ts | 4 + .../src/utils/getFinalVideo.ts | 11 +- packages/aitube-timeline/src/utils/index.ts | 3 +- .../src/utils/removeFinalVideos.ts | 31 --- ...FinalVideosAndConvertToTimelineSegments.ts | 50 +++++ .../src/utils/sliceSegments.ts | 7 +- 20 files changed, 355 insertions(+), 131 deletions(-) create mode 100644 packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts delete mode 100644 packages/aitube-timeline/src/utils/removeFinalVideos.ts create mode 100644 packages/aitube-timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 60ce448b427791e53978dde8ce4a741b2e2a6e59..45d628636016be006b38d893a7754f227118034f 100755 GIT binary patch delta 7841 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 = ({ @@ -34,9 +35,11 @@ export const Waveform: React.FC = ({ lineSpacing = 0, thickness = 1, topOrBottomFillOpacity = 0.2, - middleFillOpacity = 0.8 + middleFillOpacity = 0.8, + isHovered = false, }) => { const meshRef = useRef(null); + const isLoadedRef = useRef(false); const { gl } = useThree(); const width = durationInSteps * cellWidth; @@ -51,9 +54,9 @@ export const Waveform: React.FC = ({ const cacheKey = `waveform_${width}_${height}_${color}_${variant}_${lineSpacing}_${thickness}_${topOrBottomFillOpacity}_${middleFillOpacity}`; if (segment.textures[cacheKey]) { + isLoadedRef.current = true; return segment.textures[cacheKey]; } - const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; @@ -109,8 +112,10 @@ export const Waveform: React.FC = ({ const texture = new THREE.Texture(canvas); texture.needsUpdate = true; - segment.textures[cacheKey] = texture; + + isLoadedRef.current = true; + return texture; }; }, [color, variant, lineSpacing, thickness, topOrBottomFillOpacity, middleFillOpacity]); @@ -128,6 +133,7 @@ export const Waveform: React.FC = ({ if (meshRef.current) { (meshRef.current.material as THREE.MeshBasicMaterial).map = texture; (meshRef.current.material as THREE.MeshBasicMaterial).needsUpdate = true; + isLoadedRef.current = true; } }) .catch(error => console.error('Error loading audio:', error)); @@ -139,7 +145,7 @@ export const Waveform: React.FC = ({ ref={meshRef} position={[0, 0, 1]}> - + ); }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts index 392a4514..76929c73 100644 --- a/packages/aitube-timeline/src/components/cells/types.ts +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -1,12 +1,13 @@ -import { ClapSegmentColorScheme } from "@/types" -import { ClapSegment, ClapTrack } from "@aitube/clap" +import { ClapTrack } from "@aitube/clap" + +import { ClapSegmentColorScheme, TimelineSegment } from "@/types" export type SpecializedCellProps = { - segment: ClapSegment + segment: TimelineSegment cellWidth: number cellHeight: number isHovered: boolean - setHoveredSegment: (hoveredSegment?: ClapSegment) => void + setHoveredSegment: (hoveredSegment?: TimelineSegment) => void durationInSteps: number startTimeInSteps: number colorScheme: ClapSegmentColorScheme diff --git a/packages/aitube-timeline/src/hooks/useSegmentChanges.ts b/packages/aitube-timeline/src/hooks/useSegmentChanges.ts index e46ba135..bdf0a548 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentChanges.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentChanges.ts @@ -1,9 +1,9 @@ import { useEffect, useRef, useState } from "react" import { useTimeline } from "./useTimeline" -import { ClapSegment } from "@aitube/clap" +import { TimelineSegment } from "@/types" -function getKey(segment: ClapSegment) { +function getKey(segment: TimelineSegment) { const keyItems = [ segment.id, segment.label, @@ -25,7 +25,7 @@ function getKey(segment: ClapSegment) { * @param segment * @returns */ -export function useSegmentChanges(segment: ClapSegment): number { +export function useSegmentChanges(segment: TimelineSegment): number { const [changes, setChanges] = useState(0) const silentChangesInSegments = useTimeline(s => s.silentChangesInSegments) diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 10fbd259..64e21a3a 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -1,13 +1,12 @@ import { useEffect, useRef } from "react" import * as THREE from "three" import { useThree } from "@react-three/fiber" -import { ClapSegment } from "@aitube/clap" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { similar, sliceSegments } from "@/utils" import { useTimeline } from "./useTimeline" -import { TimelineStore } from "@/types" +import { TimelineSegment, TimelineStore } from "@/types" import { leftBarTrackScaleWidth } from "@/constants/themes" export const useSegmentLoader = ({ @@ -16,8 +15,8 @@ export const useSegmentLoader = ({ refreshRateInMs: number }): { - visibleSegments: ClapSegment[] - loadedSegments: ClapSegment[] + visibleSegments: TimelineSegment[] + loadedSegments: TimelineSegment[] }=> { // to make it react to screen width change // however, this doesn't seem to work well diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index d49cf473..15ee24fc 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -2,20 +2,15 @@ import { create } from "zustand" import * as THREE from "three" import { ClapOutputType, ClapProject, ClapSceneEvent, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, isValidNumber, newClap, serializeClap, ClapTrack, ClapTracks } from "@aitube/clap" -import { RuntimeSegment, TimelineStore } from "@/types/timeline" +import { TimelineSegment, SegmentEditionStatus, SegmentVisibility, TimelineStore } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" -import { removeFinalVideos } from "@/utils/removeFinalVideos" -import { hslToHex } from "@/utils/hslToHex" +import { hslToHex, findFreeTrack, getAudioBuffer, getFinalVideo, removeFinalVideosAndConvertToTimelineSegments, clapSegmentToTimelineSegment } from "@/utils" import { ClapSegmentCategoryHues, ClapSegmentColorScheme, ClapTimelineTheme, SegmentResolver } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" -import { getFinalVideo } from "@/utils/getFinalVideo" import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" -import { findFreeTrack } from "@/utils/findFreeTrack" -import { getAudioBuffer } from "@/utils" -import { assign } from "three/examples/jsm/nodes/Nodes.js" export const useTimeline = create((set, get) => ({ ...getDefaultState(), @@ -42,8 +37,13 @@ export const useTimeline = create((set, get) => ({ set({ isLoading: true }) + // actually you know what.. let's drop the concept of final video for the moment + // in Clapper and the timeline + // const finalVideo = await getFinalVideo(clap) + const finalVideo = undefined + // we remove the big/long video - const segments = removeFinalVideos(clap) as RuntimeSegment[] + const segments = await removeFinalVideosAndConvertToTimelineSegments(clap) const { defaultCellHeight, @@ -87,7 +87,7 @@ export const useTimeline = create((set, get) => ({ defaultSegmentLengthInPixels / defaultMediaRatio ) - const lineNumberToMentionedSegments: Record = {} + const lineNumberToMentionedSegments: Record = {} for (const segment of segments) { @@ -98,12 +98,13 @@ export const useTimeline = create((set, get) => ({ continue } + // -------- const isSegmentDirectlyMentionedInTheScript = segment.category === ClapSegmentCategory.DIALOGUE || segment.category === ClapSegmentCategory.ACTION if (isSegmentDirectlyMentionedInTheScript) { for (let i = segment.startTimeInLines; i <= segment.endTimeInLines; i++) { // we only add the segment if it is not already in the map - let existingArray: ClapSegment[] = lineNumberToMentionedSegments[i] || [] + let existingArray: TimelineSegment[] = lineNumberToMentionedSegments[i] || [] if (!existingArray.find(s => s.id === segment.id)) { existingArray.push(segment) } @@ -150,16 +151,6 @@ export const useTimeline = create((set, get) => ({ } - if (segment.outputType === ClapOutputType.AUDIO) { - const rs = segment as RuntimeSegment - if (rs.outputType === ClapOutputType.AUDIO) { - try { - rs.audioBuffer = await getAudioBuffer(rs.assetUrl) - } catch (err) { - console.error(`failed to load the audio file: ${err}`) - } - } - } } @@ -178,17 +169,15 @@ export const useTimeline = create((set, get) => ({ } } - const finalVideo = getFinalVideo(clap) - let totalDurationInMs = clap.meta.durationInMs let totalNumberOfLines = clap.meta.screenplay.split('\n').length - console.log("totalNumberOfLines = " + totalNumberOfLines) + // console.log("totalNumberOfLines = " + totalNumberOfLines) const isEmpty = segments.length === 0 // ---------- REPAIR THE LINE-2-SEGMENT DICTIONARY --------------- - let previousValue: ClapSegment[] = [] + let previousValue: TimelineSegment[] = [] // we aren't finished yet: the lineNumberToMentionedSegments will be missing some entries for (let i = 1; i <= totalNumberOfLines; i++) { if (!Array.isArray(lineNumberToMentionedSegments[i])) { @@ -255,11 +244,11 @@ export const useTimeline = create((set, get) => ({ }) }, - setSegments: (segments: ClapSegment[] = []) => { + setSegments: (segments: TimelineSegment[] = []) => { set({ segments, loadedSegments: [] }) }, - setLoadedSegments: (loadedSegments: ClapSegment[] = []) => { set({ loadedSegments }) }, - setVisibleSegments: (visibleSegments: ClapSegment[] = []) => { set({ visibleSegments }) }, + setLoadedSegments: (loadedSegments: TimelineSegment[] = []) => { set({ loadedSegments }) }, + setVisibleSegments: (visibleSegments: TimelineSegment[] = []) => { set({ visibleSegments }) }, getCellHeight: (trackNumber?: number): number => { const { defaultCellHeight, tracks } = get() @@ -277,7 +266,7 @@ export const useTimeline = create((set, get) => ({ return height }, - getSegmentColorScheme: (segment?: ClapSegment): ClapSegmentColorScheme => { + getSegmentColorScheme: (segment?: TimelineSegment): ClapSegmentColorScheme => { const { theme } = get() @@ -332,18 +321,115 @@ export const useTimeline = create((set, get) => ({ return colorScheme }, - setHoveredSegment: (hoveredSegment?: ClapSegment) => { + setHoveredSegment: (hoveredSegment?: TimelineSegment) => { + const { + hoveredSegment: previousHoveredSegment, + segmentsChanged: previousSegmentsChanged + } = get() + // note: we do all of this in order to avoid useless state updates if (hoveredSegment) { - if (get().hoveredSegment?.id !== hoveredSegment?.id) { - set({ hoveredSegment }) + if (previousHoveredSegment) { + if (previousHoveredSegment.id === hoveredSegment.id) { + // nothing to do + return + } else { + previousHoveredSegment.isHovered = false + } + } else { + hoveredSegment.isHovered = true + set({ + hoveredSegment, + segmentsChanged: 1 + previousSegmentsChanged + }) } } else { - if (get().hoveredSegment) { - set({ hoveredSegment: undefined }) + if (previousHoveredSegment) { + previousHoveredSegment.isHovered = false + set({ + hoveredSegment: undefined, + segmentsChanged: 1 + previousSegmentsChanged + }) + } else { + // nothing to do } } + }, + setEditedSegment: (editedSegment?: TimelineSegment) => { + const { + editedSegment: previousEditedSegment, + segmentsChanged: previousSegmentsChanged + } = get() + // note: we do all of this in order to avoid useless state updates + if (editedSegment) { + if (previousEditedSegment) { + if (previousEditedSegment.id === editedSegment.id) { + // nothing to do + return + } else { + previousEditedSegment.editionStatus = SegmentEditionStatus.EDITABLE + } + } else { + editedSegment.editionStatus = SegmentEditionStatus.EDITING + set({ + editedSegment, + segmentsChanged: 1 + previousSegmentsChanged + }) + } + } else { + if (previousEditedSegment) { + previousEditedSegment.editionStatus = SegmentEditionStatus.EDITABLE + set({ + editedSegment: undefined, + segmentsChanged: 1 + previousSegmentsChanged + }) + } else { + // nothing to do + } + } + }, + setSelectedSegment: (segment?: TimelineSegment, isSelected?: boolean) => { + const { + segments, + selectedSegments: previousSelectedSegments, + segmentsChanged: previousSegmentsChanged + } = get() + + let newValue = typeof isSelected !== "boolean" + ? (typeof segment?.isSelected === "boolean" ? (!segment.isSelected) : false) + : isSelected + + // note: we do all of this in order to avoid useless state updates + if (segment) { + + if (segment.isSelected === newValue) { + // nothing to do + return + } + + segment.isSelected = newValue + + if (segment.isSelected) { + set({ + selectedSegments: previousSelectedSegments.concat(segment), + segmentsChanged: 1 + previousSegmentsChanged + }) + } else { + set({ + selectedSegments: previousSelectedSegments.filter(s => s.id !== segment.id), + segmentsChanged: 1 + previousSegmentsChanged + }) + } + } else { + segments.forEach(s => { + s.isSelected = newValue + }) + set({ + selectedSegments: isSelected ? segments : [], + segmentsChanged: 1 + previousSegmentsChanged + }) + } }, trackSilentChangeInSegment: (segmentId: string) => { const { silentChangesInSegments, silentChangesInSegment } = get() @@ -497,7 +583,7 @@ export const useTimeline = create((set, get) => ({ setSegmentResolver: (segmentResolver: SegmentResolver) => { set({ segmentResolver }) }, - resolveSegment: async (segment: ClapSegment): Promise => { + resolveSegment: async (segment: TimelineSegment): Promise => { const { segmentResolver, fitSegmentToAssetDuration } = get() if (!segmentResolver) { return segment } @@ -529,7 +615,7 @@ export const useTimeline = create((set, get) => ({ startTimeInMs, track }: { - segments?: ClapSegment[] + segments?: TimelineSegment[] startTimeInMs?: number track?: number }): Promise => { @@ -603,7 +689,7 @@ export const useTimeline = create((set, get) => ({ startTimeInMs, track: requestedTrack }: { - segment: ClapSegment + segment: TimelineSegment startTimeInMs?: number track?: number }): Promise => { @@ -627,6 +713,13 @@ export const useTimeline = create((set, get) => ({ // for now let's do something simple: to always search for an available track const availableTrack = findFreeTrack({ startTimeInMs }) + // we just make sure to sanitize it before adding it + segment = await clapSegmentToTimelineSegment(segment) + + // also, we assume that we are adding a segment in a place where it's visible + // (if we are wrong don't worry, our visibility detector will fix it anyway) + segment.visibility = SegmentVisibility.VISIBLE + assignTrack({ segment, track: availableTrack, @@ -640,6 +733,11 @@ export const useTimeline = create((set, get) => ({ // then we need to update everything + // ok so, I'm not a big fan of doing this, + // officially the order doesn't matter in the previousSegments array + // this means we don't have FOR LOOPs with a BREAK etc + // still, I think we can improve our performance one day by storing them + // on a temporally sorted tree const segments = previousSegments.concat(segment) const segmentsChanged = previousSegmentsChanged + 1 @@ -678,7 +776,7 @@ export const useTimeline = create((set, get) => ({ }, // resize and move the end of a segmrnt, as well as the segment after it - fitSegmentToAssetDuration: async (segment: ClapSegment, requestedDurationInMs?: number): Promise => { + fitSegmentToAssetDuration: async (segment: TimelineSegment, requestedDurationInMs?: number): Promise => { const { clap, @@ -771,7 +869,8 @@ export const useTimeline = create((set, get) => ({ // note: } else if (s.startTimeInMs < endTimeInMs) { // we resize - s.startTimeInMs = endTimeInMs + console.log("TODO JULIAN: resize segment") + // s.startTimeInMs = endTimeInMs } } // independently, we run our collision detector @@ -784,7 +883,7 @@ export const useTimeline = create((set, get) => ({ // if we have a collision, there is currently no way around it we need to create a new track if (!(s.endTimeInMs <= startTimeInMs || s.startTimeInMs >= endTimeInMs)) { const newTrack = findFreeTrack({ startTimeInMs, endTimeInMs }) - // console.log(`NEW TRACK (${newTrack}) FOR SEGMENT`, s) + console.log(`ASSIGN NEW TRACK (${newTrack}) TO SEGMENT`, s) assignTrack({ segment, diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 80b463c2..0bd682bc 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -45,6 +45,7 @@ export { export { clamp, + clapSegmentToTimelineSegment, cn, debounceAsync, debounceSync, @@ -60,7 +61,7 @@ export { hslToHex, parseRenderingStrategy, readFileAsArrayBuffer, - removeFinalVideos, + removeFinalVideosAndConvertToTimelineSegments, similar, sleep, sliceSegments, @@ -69,8 +70,9 @@ export { export { SegmentVisibility, + SegmentEditionStatus, BrowserOnlySegmentData, - RuntimeSegment, + TimelineSegment, ContentSizeMetrics, RenderedCell, TimelineStore, diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/aitube-timeline/src/types/index.ts index ea59a274..59b8ba9d 100644 --- a/packages/aitube-timeline/src/types/index.ts +++ b/packages/aitube-timeline/src/types/index.ts @@ -5,8 +5,9 @@ export { export { SegmentVisibility, + SegmentEditionStatus, BrowserOnlySegmentData, - RuntimeSegment, + TimelineSegment, ContentSizeMetrics, TimelineStore, TimelineStoreState, diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/aitube-timeline/src/types/rendering.ts index 0ce9e113..58ec167b 100644 --- a/packages/aitube-timeline/src/types/rendering.ts +++ b/packages/aitube-timeline/src/types/rendering.ts @@ -1,4 +1,5 @@ -import { ClapEntity, ClapMeta, ClapSegment, ClapSegmentCategory } from "@aitube/clap" +import { ClapSegmentCategory } from "@aitube/clap" +import { TimelineSegment } from "./timeline" export enum RenderingStrategy { @@ -24,7 +25,7 @@ export enum RenderingStrategy { ON_SCREEN_THEN_ALL = "ON_SCREEN_THEN_ALL", } -export type SegmentResolver = (segment: ClapSegment) => Promise +export type SegmentResolver = (segment: TimelineSegment) => Promise export type RenderableSegmentCategory = | ClapSegmentCategory.VIDEO diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 9c560d75..196451c2 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -24,6 +24,25 @@ export enum SegmentVisibility { HIDDEN = "HIDDEN" } + +export enum SegmentEditionStatus { + // the segment is frozen and read-only and cannot be edited + // this is useful if you want a track to be read-only + LOCKED = "LOCKED", + + // the segment is editable and cannot be edited + EDITABLE = "EDITABLE", + + // the segment is being resized + RESIZING = "RESIZING", + + // the segment is being dragged around + DRAGGING = "DRAGGING", + + // the segment's is being edited (eg. in the edit pop-over) + EDITING = "EDITING", +} + // some data can only exist inside a browser session (eg. AudioBuffer) // or at least data that only make sense on client side // we could put things like a mouse hover or selected state in here @@ -39,14 +58,38 @@ export type BrowserOnlySegmentData = { audioBuffer?: AudioBuffer - visibility?: SegmentVisibility + visibility: SegmentVisibility + + // Cache for textures + textures: Record + /** + * the following fields have been added to this type only very recently + * and their implementation is not finished, + * so they may not contain the value you wish for. + * + * please don't rely on them just yet. + * + * Moreover they will be undefined by default, so you need + * const isSelected = rs.isSelected || false + * const editionStatus = rs.editionStatus || SegmentEditionStatus.EDITABLE + */ + // of the segment is currently selected by the user + isSelected: boolean - // Cache for waveform textures - textures?: Record + // if the segment is hovered by the mouse + isHovered: boolean + + // if the segment is currently crossed by the timeline cursor + isActive: boolean + + // if the segment is currently being played + isPlaying: boolean + + editionStatus: SegmentEditionStatus } -export type RuntimeSegment = ClapSegment & BrowserOnlySegmentData +export type TimelineSegment = ClapSegment & BrowserOnlySegmentData export type ContentSizeMetrics = { nbMaxShots: number @@ -68,13 +111,13 @@ export type ContentSizeMetrics = { export type TimelineStoreProjectState = { clap: ClapProject - segments: ClapSegment[] + segments: TimelineSegment[] segmentsChanged: number totalDurationInMs: number - loadedSegments: ClapSegment[] - visibleSegments: ClapSegment[] + loadedSegments: TimelineSegment[] + visibleSegments: TimelineSegment[] nbIdentifiedTracks: number - lineNumberToMentionedSegments: Record + lineNumberToMentionedSegments: Record isEmpty: boolean isLoading: boolean @@ -110,7 +153,11 @@ export type TimelineStoreProjectState = { // it might change rapidly (many times per seconds), so use with care! currentZoomLevel: number - hoveredSegment?: ClapSegment + // for developer convenience, the information about hovered, edited, selected.. + // is both present inside each segment and also aliased here, for fast access + hoveredSegment?: TimelineSegment + editedSegment?: TimelineSegment + selectedSegments: TimelineSegment[] // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing @@ -130,7 +177,7 @@ export type TimelineStoreProjectState = { isResizing: boolean // the final video, if available - finalVideo?: ClapSegment + finalVideo?: TimelineSegment // position of the current timestamp cursorTimestampAtInMs: number @@ -183,14 +230,15 @@ export type TimelineStoreModifiers = { clear: () => void setClap: (clap?: ClapProject) => Promise setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void - setSegments: (segments?: ClapSegment[]) => void - setLoadedSegments: (loadedSegments?: ClapSegment[]) => void - setVisibleSegments: (visibleSegments?: ClapSegment[]) => void + setSegments: (segments?: TimelineSegment[]) => void + setLoadedSegments: (loadedSegments?: TimelineSegment[]) => void + setVisibleSegments: (visibleSegments?: TimelineSegment[]) => void getCellHeight: (trackNumber?: number) => number getVerticalCellPosition: (start: number, end: number) => number - getSegmentColorScheme: (segment?: ClapSegment) => ClapSegmentColorScheme - setHoveredSegment: (hoveredSegment?: ClapSegment) => void - + getSegmentColorScheme: (segment?: TimelineSegment) => ClapSegmentColorScheme + setHoveredSegment: (hoveredSegment?: TimelineSegment) => void + setEditedSegment: (editedSegment?: TimelineSegment) => void + setSelectedSegment: (segment?: TimelineSegment, isSelected?: boolean) => void // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing trackSilentChangeInSegment: (segmentId: string) => void @@ -226,13 +274,13 @@ export type TimelineStoreModifiers = { extraLabel?: string }) => Promise setSegmentResolver: (segmentResolver: SegmentResolver) => void - resolveSegment: (segment: ClapSegment) => Promise + resolveSegment: (segment: TimelineSegment) => Promise addSegments: ({ segments, startTimeInMs, track, }: { - segments?: ClapSegment[] + segments?: TimelineSegment[] startTimeInMs?: number track?: number }) => Promise @@ -241,7 +289,7 @@ export type TimelineStoreModifiers = { track, triggerChange, }: { - segment: ClapSegment + segment: TimelineSegment track: number triggerChange?: boolean }) => Promise @@ -250,13 +298,13 @@ export type TimelineStoreModifiers = { startTimeInMs, track, }: { - segment: ClapSegment + segment: TimelineSegment startTimeInMs?: number track?: number }) => Promise findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number - fitSegmentToAssetDuration: (segment: ClapSegment, durationInMs?: number) => Promise + fitSegmentToAssetDuration: (segment: TimelineSegment, durationInMs?: number) => Promise } export type TimelineStore = TimelineStoreState & TimelineStoreModifiers diff --git a/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts b/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts new file mode 100644 index 00000000..2be8567a --- /dev/null +++ b/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts @@ -0,0 +1,36 @@ +import { ClapOutputType, ClapSegment } from "@aitube/clap" + +import { SegmentEditionStatus, SegmentVisibility, TimelineSegment } from "@/types" +import { getAudioBuffer } from "./getAudioBuffer" + +export async function clapSegmentToTimelineSegment(clapSegment: ClapSegment): Promise { + + const segment = clapSegment as TimelineSegment + + if (!segment.visibility) { segment.visibility = SegmentVisibility.HIDDEN } + + if (!segment.textures) { segment.textures = {} } + + if (typeof segment.isSelected !== "boolean") { segment.isSelected = false } + + if (typeof segment.isHovered !== "boolean") { segment.isHovered = false } + + if (typeof segment.isActive !== "boolean") { segment.isActive = false } + + if (typeof segment.isPlaying !== "boolean") { segment.isPlaying = false } + + if (!segment.editionStatus) { segment.editionStatus = SegmentEditionStatus.EDITABLE } + + + if (!segment.audioBuffer) { + if (segment.outputType === ClapOutputType.AUDIO) { + try { + segment.audioBuffer = await getAudioBuffer(segment.assetUrl) + } catch (err) { + console.error(`failed to load the audio file: ${err}`) + } + } + } + + return segment +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 14c0bb33..02f702a9 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -47,7 +47,11 @@ export function getDefaultProjectState(): TimelineStoreProjectState { // @deprecated, we now use a static WebGL camera zoom level set at 1.0 currentZoomLevel: 1.0, + // for developer convenience, the information about hovered, edited, selected.. + // is both present inside each segment and also aliased here, for fast access hoveredSegment: undefined, + editedSegment: undefined, + selectedSegments: [], // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing diff --git a/packages/aitube-timeline/src/utils/getFinalVideo.ts b/packages/aitube-timeline/src/utils/getFinalVideo.ts index 424ea4cb..4c06a5c4 100644 --- a/packages/aitube-timeline/src/utils/getFinalVideo.ts +++ b/packages/aitube-timeline/src/utils/getFinalVideo.ts @@ -1,12 +1,17 @@ import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" -export function getFinalVideo(clap: ClapProject): ClapSegment | undefined { - const alreadyAnEmbeddedFinalVideo = clap.segments.filter(s => +import { TimelineSegment } from "@/types" +import { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" + +export async function getFinalVideo(clap: ClapProject): Promise { + const alreadyAnEmbeddedFinalVideo: ClapSegment | undefined = clap.segments.filter(s => s.category === ClapSegmentCategory.VIDEO && s.status === "completed" && s.startTimeInMs === 0 && s.endTimeInMs === clap.meta.durationInMs && s.assetUrl).at(0) + + if (!alreadyAnEmbeddedFinalVideo) { return undefined } - return alreadyAnEmbeddedFinalVideo + return clapSegmentToTimelineSegment(alreadyAnEmbeddedFinalVideo) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts index 0821aecd..8c230609 100644 --- a/packages/aitube-timeline/src/utils/index.ts +++ b/packages/aitube-timeline/src/utils/index.ts @@ -1,4 +1,5 @@ export { clamp } from "./clamp" +export { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" export { cn } from "./cn" export { debounceAsync } from "./debounceAsync" export { debounceSync } from "./debounceSync" @@ -16,7 +17,7 @@ export { export { hslToHex } from "./hslToHex" export { parseRenderingStrategy } from "./parseRenderingStrategy" export { readFileAsArrayBuffer } from "./readFileAsArrayBuffer" -export { removeFinalVideos } from "./removeFinalVideos" +export { removeFinalVideosAndConvertToTimelineSegments } from "./removeFinalVideosAndConvertToTimelineSegments" export { similar } from "./similar" export { sleep } from "./sleep" export { sliceSegments } from "./sliceSegments" diff --git a/packages/aitube-timeline/src/utils/removeFinalVideos.ts b/packages/aitube-timeline/src/utils/removeFinalVideos.ts deleted file mode 100644 index f3d502d0..00000000 --- a/packages/aitube-timeline/src/utils/removeFinalVideos.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" -import { getFinalVideo } from "./getFinalVideo" - -export function removeFinalVideos(clap: ClapProject): ClapSegment[] { - const alreadyAnEmbeddedFinalVideo = getFinalVideo(clap) - let ignoreThisVideoSegmentId = "" - - if (alreadyAnEmbeddedFinalVideo) { - ignoreThisVideoSegmentId = alreadyAnEmbeddedFinalVideo?.id || "" - - /* - you know what.. let's just ignore it, and re-generate fresh content - because most probably the user made an honest mistake - - const outputFilePath = await writeBase64ToFile( - alreadyAnEmbeddedFinalVideo.assetUrl, - join(outputDir, `existing_final_video`) - ) - - return { - tmpWorkDir: outputDir, - outputFilePath - } - */ - } - - // we remove the final video from the full list of segments - const allCategoriesOfSegments = clap.segments.filter(s => s.id !== ignoreThisVideoSegmentId) - - return allCategoriesOfSegments -} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts b/packages/aitube-timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts new file mode 100644 index 00000000..ea0c6e7a --- /dev/null +++ b/packages/aitube-timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts @@ -0,0 +1,50 @@ +import { ClapProject } from "@aitube/clap" + +import { SegmentVisibility, TimelineSegment } from "@/types" + +import { getFinalVideo } from "./getFinalVideo" +import { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" + +export async function removeFinalVideosAndConvertToTimelineSegments(clap: ClapProject): Promise { + const alreadyAnEmbeddedFinalVideo = await getFinalVideo(clap) + let ignoreThisVideoSegmentId = "" + + if (alreadyAnEmbeddedFinalVideo) { + ignoreThisVideoSegmentId = alreadyAnEmbeddedFinalVideo?.id || "" + + /* + you know what.. let's just ignore it, and re-generate fresh content + because most probably the user made an honest mistake + + const outputFilePath = await writeBase64ToFile( + alreadyAnEmbeddedFinalVideo.assetUrl, + join(outputDir, `existing_final_video`) + ) + + return { + tmpWorkDir: outputDir, + outputFilePath + } + */ + } + + const segments: TimelineSegment[] = [] + + let nbSegments = 0 + + for (const clapSegment of (clap.segments as TimelineSegment[])) { + if (clapSegment.id === ignoreThisVideoSegmentId) { continue } + + const segment = await clapSegmentToTimelineSegment(clapSegment) + + // ok so this is more or less a "hack": when we load the segments, we don't want all of them to be hidden + // but we also don't have the time to compute the visibility yet, + // so what we do is that we apply some basic rule (since the window and scroll is reset too) + // to only show the first Nth segments (in this case, 200) + segment.visibility = nbSegments++ > 200 ? SegmentVisibility.HIDDEN : SegmentVisibility.VISIBLE + + segments.push(segment) + } + + return segments +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/sliceSegments.ts b/packages/aitube-timeline/src/utils/sliceSegments.ts index 54757a5a..d5d1c96e 100644 --- a/packages/aitube-timeline/src/utils/sliceSegments.ts +++ b/packages/aitube-timeline/src/utils/sliceSegments.ts @@ -1,5 +1,6 @@ -import { ClapSegment, ClapSegmentFilteringMode, filterSegmentsWithinRange } from "@aitube/clap" +import { ClapSegmentFilteringMode, filterSegmentsWithinRange } from "@aitube/clap" +import { TimelineSegment } from "@/types" // TODO put this in a web workers for smoother operations? export function sliceSegments({ @@ -7,10 +8,10 @@ export function sliceSegments({ afterTimeInMs, beforeTimeInMs, }: { - segments: ClapSegment[] + segments: TimelineSegment[] afterTimeInMs: number beforeTimeInMs: number -}): ClapSegment[] { +}): TimelineSegment[] { const result = filterSegmentsWithinRange( ClapSegmentFilteringMode.ANY, afterTimeInMs, From 1b5388965aa21beaf0318f0ebe61a77aa1036bcf Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 7 Jul 2024 15:47:37 +0200 Subject: [PATCH 200/346] 0.0.12 --- packages/aitube-clapper-services/bun.lockb | Bin 86831 -> 86831 bytes packages/aitube-clapper-services/package.json | 6 +++--- packages/aitube-clapper-services/src/audio.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 2d1d24fe706fb91ab3e7e83659b4fc0480d6f223..2a2e0053ad5f5eec849d12e47aae816f782d2c0f 100755 GIT binary patch delta 1414 zcmYLJdo@#*1F0 zl8onj+`SG{wpTZgB>CTYVR>F-axmO^@8M{MyMC?520%EaiNWY%Fv;)n7>qVN3dYq* z0gr?SX7;Trl_3Xx2kjc2pueV69bF=F(3`rN=(H{gXrcm=`6tF9lD=kS#B4Ny&W9Wl z37{f#K9rH0ap*AvJJ5=94IE&ZK{giX{r440srhQa^h*`UVPykg{*_J}>KK4y=pu0| zG`8`_qBdj>yeaets15Ve43H!0#-eW>RIS8#8nR9wYIQ4?vH0^PHt@thuALcVp#QEe$tpX=4u5jHn6BjvhtA>RDXyz4yGH9?;a97 z@6jo2yV~5*YVH*fT17<8O^0Wr{m@L3 z01)q}zmbKhg3H$>-?D8LJZYO~(B~-s&dfJiIdL}{U`y^|q(IzPT5d7TEswsxLa^;l z&aKRV{Dt`0lIYCSR&dY{!J~13Zm2AffU*MJU}In+4!NFFy5|meci)M`5Lx84m=*VVUYRD)rqZ;FfAXQa;bjU-H}siZ77&DNP)FYkxt;<@Um<$|3EfNp5IV znxttixJcIeau(uc94yka*8I+MGvi)>{QD2=PRMD94>$6QPG31oZohw~^Xy1Iw%4S( z?bY!-;ic{5m}j*3qH^B!6~EzEYoV^9GsbKf74epdj0dqZQX~E$U#pBZ)mp=bg=a6F zn8?_J^^lIYcm%PE^PB81U$Pi(DQMAcAq2QnyThs}y>@B&N?IAVPAYr}Z>95bh<-g` z(UtyNT}A&yfOil^zk!m|oe~*=Z(JoR24VOV@990(N~2$nIH~`cr%zy%-PM?+r~QK5 z({b#I@%K+8&>*uLAXOY?5!u3}e|gRFuMJg?w(;t1#3w#j4(+dKG+UUjEuS^%@DAve zxm@(1h27R<#i#q2O0J}oNb8!)*)LviS%79&MsUbo#(+*BF|}%aIgUOi8ctTT`%v6o zpdkt3I@d?KcckQHo%eu7iH5$~;#5N?mjUsqy4!?=388=cau>Q~vIjcnd~^e*(0MQh zr^Qq4x1|bO&_73x05jBNl%l$AM;~huRjR%UdZ^YILyM}4m?|*fwz122AcXg)SO8d~ z>u>4s&9prhot)JNLeye*Cz>>SL&fOSPd22oqc7fr1wpnvE1nffRWjvzYJdXIDGN1# z02(e~nZR0ZLIRFJBwySLjO1w~KnB)|JQAP)`C$uStaw5O`vDLrSo)w>P0phNNBKMj z*vpxl09}zu1@%}UQn)Zcm})phjWOWifURPP4K7erdWaY_j26CLC8B9_M`nS iV?Ix?T_6v304&9O1Z=|Th(0G&y0y(`eWw#x*8LX^k4!-T delta 1413 zcmYLJc~H`M6z2Y4b(?OEF?@?~2{!bm8V!PqA{yWjVSbR2SeEu_)9^6zWKh4hp4*>;|v2 z3FC=TVM@=t0g?Az1n)M_k0TK}aoW(8%7$Zl1lUYtL#93fa!E{BrKbav^`-Ctk&Q43 z1OS_uCOfx9}HqeQ%=I@IvZ7a!q*m)2!rZ{2?gXLCKfL zRAf}Twf*#LvZZyZwsX2Fe{x~k-%*g{+dJ|gsm*UNXfo-HN7ycOz!oUn6Ng|*9$8I~ zJlFN{E}N@79-0GCD1cJyt2G{j`rounF^sJ-Wzq#6HKb{~3A&nC-!n5n&lcIQeskH+ zW!hrELv79--DAQEX?GH31iZUT*1L+>_)+WU59P)xmIp$Z6Ra9f_Xw2H!fas>OcvsynJ@^sD->h+NoA6nore2Anbh4%yD_Ee z;T$`#mgQV_FjatAV|{3Fl!(2!F{rU%tT`p&qXN}N_UNssgPTTwJ<@)7<+JnYc8EBB zqc&f>cP(CeF1sm3_-FhS*)j2QX}e&g`z-(VxVYwXpSH!-n=Nxq!IMU5%$ie-Lr)ypbfmN0m0{ zPI|hJ*q3s}Zol$kw>K)P=ZAtS3;A_HU%9S9VDb6ai0Ion8vn@#zoo9XRw^xZ9&a&I zQp?JlkU!ix5zD_OXe8>aKZ)&fvB?_F@U`rZiG7;emVW$k|A(2vL2{_K07nU2w*k3Q z!p87#9AEOj#3=o}f6o4JInL{`WM;m^xN5QK7PDCOz3a)gbR%hGjw@BR-PE?A zEazSU06&^CM>73oQZbyxOEi`3}l;xTM%JLrlE zUN6Y(Tyfn_To>Iq;Cq3q>Zjo&37uiMOZ}Ugw(5U_Fis9(_}%!1{fZFRqV1(xt;Jrq z@|hnA;Wn!?5aY(;usA3bjC)6w z8EOGCl0SZa1z;oQDl`pnWOM@Xm-)E@OIaZS7yypqGy#x-3>X4SMYjRi0svcKMg&i^ zWP>DNA`77aYuO|j1juN{fT}n_0l%ODPqD!iBx!b3)LQ};2DmC-Sb-w4hEMbW9T>1q vVe12G0p6LFm2}YC%aYA void mute: () => void unmute: () => void - syncAudioToCurrentCursorPosition: (activeAudioSegments: RuntimeSegment[]) => void + syncAudioToCurrentCursorPosition: (activeAudioSegments: TimelineSegment[]) => void } export type AudioStore = AudioState & AudioControls From 0ad410a5aa2e7a88a9f977cc5fa9f09d327857f0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 7 Jul 2024 16:09:34 +0200 Subject: [PATCH 201/346] 0.0.13 --- packages/aitube-clapper-services/bun.lockb | Bin 86831 -> 86831 bytes packages/aitube-clapper-services/package.json | 6 +++--- .../aitube-clapper-services/src/resolver.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 2a2e0053ad5f5eec849d12e47aae816f782d2c0f..f1e2b12bce3de7245faee5171e600047c431b8e2 100755 GIT binary patch delta 53 zcmZ3#jCK7o)(z*L%bDnz=@~FEFn9nlF9Sov!hLHlINnd4B*18(XKFCn;jh@_t`AC^ JRbFss0|4%=6B7Uc delta 55 zcmV-70LcHZrUkF21+dQNA6_&rHZCv#07w7;01W^DfT6yu&_Um2k`Mu2FfKJPmp=mm N6_bkaBC{mu3u_dI64?L% diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 3c31deb3..c002d876 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.12", + "version": "0.0.13", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -23,8 +23,8 @@ "peerDependencies": { "@aitube/clap": "0.0.30", "@aitube/timeline": "0.0.36", - "@monaco-editor/react": "^4.6.0", - "monaco-editor": "^0.50.0", + "@monaco-editor/react": "4.6.0", + "monaco-editor": "0.50.0", "react": "*", "react-dom": "*", "zustand": "4.5.2" diff --git a/packages/aitube-clapper-services/src/resolver.ts b/packages/aitube-clapper-services/src/resolver.ts index bdcd585c..978cce6e 100644 --- a/packages/aitube-clapper-services/src/resolver.ts +++ b/packages/aitube-clapper-services/src/resolver.ts @@ -1,4 +1,4 @@ -import { ClapSegment } from "@aitube/clap" +import { TimelineSegment } from "@aitube/timeline" export type ResolverState = { // this indicate the status of the loop @@ -52,7 +52,7 @@ export type ResolverControls = { * @param segment * @returns */ - resolveSegment: (segment: ClapSegment) => Promise + resolveSegment: (segment: TimelineSegment) => Promise } export type ResolverStore = ResolverState & ResolverControls \ No newline at end of file From 9e35f76a290cf6d055ad1a023a856ad590a0fbba Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 7 Jul 2024 16:41:44 +0200 Subject: [PATCH 202/346] 0.0.37 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/Cell.tsx | 37 +++++++++++++------ .../aitube-timeline/src/hooks/useTimeline.ts | 19 +++++++++- .../aitube-timeline/src/types/timeline.ts | 27 +++++++++++++- .../src/utils/clapSegmentToTimelineSegment.ts | 12 ++++++ 5 files changed, 80 insertions(+), 17 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 25ecf9ff..f0fa0782 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.36", + "version": "0.0.37", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index 4a5d8994..ff1dc70e 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -75,6 +75,8 @@ export function Cell({ const setHoveredSegment = useTimeline(s => s.setHoveredSegment) + const setSelectedSegment = useTimeline(s => s.setSelectedSegment) + // cells are rendered often (eg. whenever we mouse the mouse from one cell to another) // because we need to handle their color change on hover / transition // console.log(`re-rendering a `) @@ -101,20 +103,13 @@ export function Cell({ } else { setHoveredSegment(s) } + // TODO: compute where exactly we are hovering, + // so that we can display a small hover effect on the left or right handles + // console.log("onPointerMove: e = ", e) e.stopPropagation() return false }} - /* - onPointerEnter={(e) => { - // crude code to ignore the event when we are over the left column or the top row - if (e.offsetX < leftBarTrackScaleWidth || e.offsetY < topBarTimeScaleHeight) { - setHoveredSegment(undefined) - } else { - setHoveredSegment(s) - } - }} - */ onPointerLeave={(e) => { // console.log('leave') setHoveredSegment(undefined) @@ -123,14 +118,32 @@ export function Cell({ return false }} - onClick={(e) => { // console.log('click on cell ' + s.id) + // crude code to ignore the event when we are over the left column or the top row + if (e.offsetX < leftBarTrackScaleWidth || e.offsetY < topBarTimeScaleHeight) { + // we just ignore clicks outside + } else { + setSelectedSegment({ + segment: s, + + // we leave it unspecified to create a toggle + // isSelected: true, + + onlyOneSelectedAtOnce: false, + }) + } + // TODO: compute where exactly we are hovering, + // so that we can display a small hover effect on the left or right handles + console.log("cells.Cell:onClick() e = ", e) e.stopPropagation() return false }} onContextMenu={(e) => console.log('context menu')} - onDoubleClick={(e) => console.log('double click')} + onDoubleClick={(e) => { + console.log('double click') + // TODO: do something eg. switch to an edit mode + }} // onWheel={(e) => console.log('wheel spins')} // onPointerUp={(e) => console.log('up')} // onPointerDown={(e) => console.log('down')} diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 15ee24fc..1b10ae00 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -389,7 +389,16 @@ export const useTimeline = create((set, get) => ({ } } }, - setSelectedSegment: (segment?: TimelineSegment, isSelected?: boolean) => { + setSelectedSegment: ({ + segment, + isSelected, + onlyOneSelectedAtOnce, + }: { + segment?: TimelineSegment + isSelected?: boolean + onlyOneSelectedAtOnce?: boolean + } = { + }) => { const { segments, selectedSegments: previousSelectedSegments, @@ -408,9 +417,15 @@ export const useTimeline = create((set, get) => ({ return } + // if needed we clear any other selected item + if (onlyOneSelectedAtOnce) { + segments.forEach(s => { s.isSelected = false }) + set({ selectedSegments: [] }) + } + segment.isSelected = newValue - if (segment.isSelected) { + if (newValue) { set({ selectedSegments: previousSelectedSegments.concat(segment), segmentsChanged: 1 + previousSegmentsChanged diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 196451c2..1772cda4 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -77,9 +77,28 @@ export type BrowserOnlySegmentData = { // of the segment is currently selected by the user isSelected: boolean - // if the segment is hovered by the mouse + // if the segment is hovered by the mouse (anywhere) + // note: if the mouse is pressed, this will also trigger this to TRUE isHovered: boolean + // if the segment's body is hovered by the mouse + isHoveredOnBody: boolean + + // if the segment's left handle is hovered by the mouse + isHoveredOnLeftHandle: boolean + + // if the segment's right handle is hovered by the mouse + isHoveredOnRightHandle: boolean + + // if the segment's body is being grabbed by the mouse + isGrabbedOnBody: boolean + + // if the segment's left handle is being grabbed by the mouse + isGrabbedOnLeftHandle: boolean + + // if the segment's right handle is being grabbed by the mouse + isGrabbedOnRightHandle: boolean + // if the segment is currently crossed by the timeline cursor isActive: boolean @@ -238,7 +257,11 @@ export type TimelineStoreModifiers = { getSegmentColorScheme: (segment?: TimelineSegment) => ClapSegmentColorScheme setHoveredSegment: (hoveredSegment?: TimelineSegment) => void setEditedSegment: (editedSegment?: TimelineSegment) => void - setSelectedSegment: (segment?: TimelineSegment, isSelected?: boolean) => void + setSelectedSegment: (params?: { + segment?: TimelineSegment + isSelected?: boolean + onlyOneSelectedAtOnce?: boolean + }) => void // used to track silent in-line changes in the segments // that way we don't need to re-draw the whole thing trackSilentChangeInSegment: (segmentId: string) => void diff --git a/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts b/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts index 2be8567a..20e9e29b 100644 --- a/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts +++ b/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts @@ -19,6 +19,18 @@ export async function clapSegmentToTimelineSegment(clapSegment: ClapSegment): Pr if (typeof segment.isPlaying !== "boolean") { segment.isPlaying = false } + if (typeof segment.isHoveredOnBody !== "boolean") { segment.isHoveredOnBody = false } + + if (typeof segment.isHoveredOnLeftHandle !== "boolean") { segment.isHoveredOnLeftHandle = false } + + if (typeof segment.isHoveredOnRightHandle !== "boolean") { segment.isHoveredOnRightHandle = false } + + if (typeof segment.isGrabbedOnBody !== "boolean") { segment.isGrabbedOnBody = false } + + if (typeof segment.isGrabbedOnLeftHandle !== "boolean") { segment.isGrabbedOnLeftHandle = false } + + if (typeof segment.isGrabbedOnRightHandle !== "boolean") { segment.isGrabbedOnRightHandle = false } + if (!segment.editionStatus) { segment.editionStatus = SegmentEditionStatus.EDITABLE } From 570c98e176cb460a8f0ed4ab89817317c16a2b9f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 7 Jul 2024 16:42:46 +0200 Subject: [PATCH 203/346] 0.0.14 --- packages/aitube-clapper-services/bun.lockb | Bin 86831 -> 87338 bytes packages/aitube-clapper-services/package.json | 4 +-- .../aitube-clapper-services/src/renderer.ts | 28 +++++++++--------- .../src/script-editor.ts | 6 ++-- .../src/segment-editor.ts | 7 +++-- packages/aitube-clapper-services/src/types.ts | 9 +++--- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index f1e2b12bce3de7245faee5171e600047c431b8e2..66d94dd1fc7ec928ef817169e8221cb3b2cc75a2 100755 GIT binary patch delta 3705 zcmd^Bdr(x@9X@B}0=u$+JQM^3LP7*&WhG%{S70^b2pfn7n?oQyJNKM>@7dG5O=)UU-Z3T3IQr40Z+pT6#ER6&oPQZ-P54LERC{uJ%Khxw$2*#i zMXaAB1s|8How2%W-MbbyD)DlJ5CK9|md;sdnzc}fCBuX;K>u3f7Bc(BP6@FHF#zsb zoI=6dHExF=##fINA_RO8nz;!)5Nt*jZhtjXh$!%!vX|X=kYyD@53N|K$#+PFx6GrL zSD+g%Q=cV71b7BG9=sA94Yq<4!4q?Yhy%w%M}lMRo^CrwdGh=<{~PE*Xx|GS4BigL za6&5U5Cp?OC+^u;?3(P?toZ8#mfqiOTE5NYZ@d#EpCWVc)6^K~?;0B8GemDgKGMZD z*ePu54bKYk3|vX&sTL(0Y7~`k9YprvXl|EFX@@OGe-!>Wch;^!79}r32rJDUXp_IE zvQaroJG7l{2icTin8R$27k!Ip9DDjvm~rl< zAC(7Nl=q>gQ|eHgJ_s{!^7x?^{WvK6I4i}XuSAH6sMJw;xJB6q^*r6S+I0RlO15X~ z#=A+W!oYC{cAIh%5$*tyKQ2SRcALHsQ9f!&GKX9A*D&#g9u;QMo3n+O(Wk1RUg}f5 zP_z0}IUeZrKGg;_0ZNCNw&>IC-uW}5<`Sp}Rob996TPD?b~HxNr)ERF*r)bGjqOu% z3`XKrGKX%C&C#!f$8&>PR*T$AWw|*r-?byRL#a@N5HS*`N0_Z4n$OH(tj2L*9rP1y zYU~G2(lm2F=wX^>=6=kY{|uO~&yb?R9gKv5pUC9Xe_`&(t`!&q_JJM;<_`0~LEvId zPX%*F(=;y8{9kJNSF+f1XJuN$9IauV#`85^0QN_rrC>fDX71p3n$OI7g>-$9`|kh! z>^lEPv+HUt3J9|of7ZQx((=Od39)%%MD><=mXk&ME=6zOyrc9-yUMa7KQweVNBpELdpjk6HtNqb<%ODWq|C=a47ptvV--TxX=)P^Tz!os(`r)vt5N({vN6ZoQET);nYyty}M;@f(cv z6VzGC+u)?{pmuI>$PW4*YWqebP21>@owQ>k##fK=)jQ2*d#FT>-c@FGjHddshLz z7Jts-Nq}oy2RIL#1Ktg|^S{(QY(B&jn%C?0Q02@;L^$SOrTi<2^kGk$!fVkoy3$kh zEH8igfCG3QC;$q97k~-CMBqiB2;imG3fQRZ;@6Rj5b@%;52bl^jstkrkD>BQu6V4| z!UCiMBao5KS-@cEC?J}0FFWK&s=n+@=Kq8Q;7Q;qfTxqEoF8T*Py@UIL`X7R$uKnX ztl+4-!Q+u#uJS838P0>`_ky3nY2XBK+;!;ca9#W{gogpX(~p5xU=Q$TU^nn58gRX( z!iC5N>;zT=9|9i$O+X6}2XOmdAPqPK90dLX><6j<_BrPOz@9gcwKtEwhvOsAxTZoJ zMetXE-`G!qQ@}~!IPh?B)?9>hyzQ(Xj`{86Dde}g6W}+Uzkm+lEYJp=0X_qU0V#s4 zy#{>QvNuY$;~Xl_ks0Ss#0f@k3BKIz59YUe9Kap(b3J|oCmc0FG`%;G4u3tE-t8SE zEv}Dyv!m5*I$7CoglJK}?TDJFCD;uc|Nj$`nI=re}Ar zSk>2j<%lTnKK$;gnLejV(pu3;x+%?s9jd!xq&%p8}%Zwj1qwkm(`ngAY+C)T92DpsZM38R~PAJiQKKO zMvwa4S)LuRCr1r7$YE$IH^_92`Z6Y}I}I{da}D0>V(n^Le>wfpa_;eXlOI#iGv?^W zk69a;?lFBVR%aV!t}gmH^_~7QA~gCr&qyu@VZFd{Iaty+U7_k7qco{;f%1$s054h? z_OQB?*Gp>O54aTvjpem6=tA9_Kh&PuKOA~6w77Nd`pLGewBP}rN^2&yBnQdY21rXw dbDUh2pvKyzpIR|mhRBTC5ES z=G)&s`|R_$=bn4EZ#V9I+4$S6^y}qOFTZfQbXIv)Lf-2ioL{xzt-dM02pJx%cFm~z zv1L|F=UgecoZa9VZx|kU^SLcXN)1kwE2toNd|h9@5Ya-^Z^T~=xJzf%Dnu-F<}@M3 zg4aMZF9XMeb27C0=>MhfIFzN z3y}zZ0GtLc1CIm$yGV$M;CP1+so-JgB=99@9&j5p$Mx#|U0@zSJvbR$1Llb?1V@Q* zQIAeU1RQqn;~_hZ-bCe}W;uaMq8_9-B165?QiAR?PDQn(hD@t*Or8)$bbMho{U}zc0aRjKp#l(#m+7oIyQB4xU8_;J)^tH}iu zldLyTL!8yv05yy56xs~Eg|ysREETGCI*hYzz5zIG#^1og0ATgPLbpzvDF*FlB88-q zIIF1(kKkLHinW?Phguv^6~#hS1k|fgKMbgRJeoxT)dV#M%78Vtnr=a9%U6P&#m>=L znxHrmy`%0D)U1HYE)imGK>Zx*k$^e?g#l>oWDpg&9Hz2TZE29J&?@Vx$K{Y_?`_vf zW1T=rl>DzTn@PH6W;0o53)ldi!cLt-z!P-MJO=tfT{9b@Gj#tHFt^XqIai80Uk6j+ z;PO?>9oh7Tc5o1M379*41Z)P+({%-yJ6fRgW4eE#t}DSju8sD=DmN3$hZfJb=cK<9 ze&Fiq^({B%%#>T#M9;jM=9vFxqw}I#oPTA<+3;1v=}T%>SM2-y{hotOs%aRYH3yI4%AWlW}Am*v?=sjn_KqMZKzvN3)|iD7;S6!P*=M` z$|kowPT$$&p#_^1+6#4(Oq)Fvx*7A^?3N!>57cg`ln%G-qv{UKuLJXg>Zhbm%&!yk z>vYQjIt+CPDszil4ti_1v`5k#+k(6qJAauOHt7uSeIZs1(zP>1lrcCb?p@6zPJ#Iy z;J0Z%Z5WKH)4qg4oYrgjys^LU#VvSE}sDG!*^4}vw_kNu!(Ode+GT!Q~dM0 z9uDA}>#G|C^J|AMm`KrlPl$6cxUm9^*PP-!m>Wj|697(f5#TsJIMM))zXY%^3b-F& z-(`S(UECXrbBJC)TVdp*;HP9dH*YMTJ}#gPm=4U4^w_y%6CY-IKt63a_m8BfVev8a zM`Yl0kk3*+UlXbIyf=+c#D{@N%!tSZ@ZA*(bR=M=njyE$rJf;=!l&)W z(S@mDPY)p+<a z-Uhr>GTdFa4HiC#Vi%CA+kXIO1MdO65B35)t#ttVIsQ)o`}}dN{c-FYZT}gX+w2G4 z2R;Cf0!M_X5{F?N1V$%k%}F@OU(b59&0C1K7H>J;q`VzJ22KDU0UrX#fL_WOiIE?Y z9I@bClCV$uJg3-0i$_8!dnCxjt+}PIE_nb}8Nhw=Q(AWge<&vu`rXJx-e)AQTj;__ zg3R}RF;YBEu2ARpF+DmkAeBwJcOV zZ1G=IZ>(PubhI+N2R-FxWoO|w=Sv$KY|X+JT%*1gDwDK)vFbpmd`at7ulDsBtM0)4 z%pb$HMY~*zdP~&2TdUvNy3QbTvU0L`v1-)WVVI}?HhSd+%lBmE#JIZwZE6Do@`Mwn&d*r8Hw*r|L-pro4B4zny(&zj|l z!sB?Hv3Tf)$!jW`Ux~PS85)OOy}7?-?Z29j?!5t>3@xsnx_soAJ$sH>OQO#0{#%q> U9WC>_m)$Sdf1^9EOx}$A4^djm1^@s6 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index c002d876..e44aaa57 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.13", + "version": "0.0.14", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.0.30", - "@aitube/timeline": "0.0.36", + "@aitube/timeline": "0.0.37", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", diff --git a/packages/aitube-clapper-services/src/renderer.ts b/packages/aitube-clapper-services/src/renderer.ts index 8d3da1f2..3ffe797b 100644 --- a/packages/aitube-clapper-services/src/renderer.ts +++ b/packages/aitube-clapper-services/src/renderer.ts @@ -1,18 +1,18 @@ -import { ClapSegment } from "@aitube/clap" +import { TimelineSegment } from "@aitube/timeline" export type ActiveSegments = { activeSegmentsCacheKey: string - activeSegments: ClapSegment[] - activeVideoSegment?: ClapSegment - activeStoryboardSegment?: ClapSegment - activeAudioSegments: ClapSegment[] + activeSegments: TimelineSegment[] + activeVideoSegment?: TimelineSegment + activeStoryboardSegment?: TimelineSegment + activeAudioSegments: TimelineSegment[] } export type UpcomingSegments = { upcomingSegmentsCacheKey: string - upcomingSegments: ClapSegment[] - upcomingVideoSegment?: ClapSegment - upcomingStoryboardSegment?: ClapSegment + upcomingSegments: TimelineSegment[] + upcomingVideoSegment?: TimelineSegment + upcomingStoryboardSegment?: TimelineSegment } export type BufferedSegments = ActiveSegments & UpcomingSegments @@ -22,11 +22,11 @@ export type RendererState = { // various helpers to manage buffering, // cache, cache invalidation.. - dataUriBuffer1?: ClapSegment - dataUriBuffer2?: ClapSegment + dataUriBuffer1?: TimelineSegment + dataUriBuffer2?: TimelineSegment activeBufferNumber: number - currentSegment?: ClapSegment - preloadSegment?: ClapSegment + currentSegment?: TimelineSegment + preloadSegment?: TimelineSegment currentSegmentKey: string preloadSegmentKey: string dataUriBuffer1Key: string @@ -57,8 +57,8 @@ export type RendererControls = { */ computeBufferedSegments: () => BufferedSegments - setDataUriBuffer1: (dataUriBuffer1?: ClapSegment) => void - setDataUriBuffer2: (dataUriBuffer2?: ClapSegment) => void + setDataUriBuffer1: (dataUriBuffer1?: TimelineSegment) => void + setDataUriBuffer2: (dataUriBuffer2?: TimelineSegment) => void setActiveBufferNumber: (activeBufferNumber: number) => void syncVideoToCurrentCursorPosition: () => void diff --git a/packages/aitube-clapper-services/src/script-editor.ts b/packages/aitube-clapper-services/src/script-editor.ts index cd84428a..4a068760 100644 --- a/packages/aitube-clapper-services/src/script-editor.ts +++ b/packages/aitube-clapper-services/src/script-editor.ts @@ -1,6 +1,8 @@ -import { ClapProject, ClapSegment } from "@aitube/clap" +import { ClapProject } from "@aitube/clap" +import { TimelineSegment } from "@aitube/timeline" import { Monaco } from "@monaco-editor/react" import MonacoEditor from "monaco-editor" + import { VersionControls, VersionedState } from "./version-control" export type ScrollData = { @@ -26,7 +28,7 @@ export type ScriptEditorState = { // map screenplay lines to dialogue segments // (note: some lines point to nothing, eg. when we have empty spaces) - lineNumberToMentionedSegments: Record + lineNumberToMentionedSegments: Record /** diff --git a/packages/aitube-clapper-services/src/segment-editor.ts b/packages/aitube-clapper-services/src/segment-editor.ts index 9e23d535..2a03a7d4 100644 --- a/packages/aitube-clapper-services/src/segment-editor.ts +++ b/packages/aitube-clapper-services/src/segment-editor.ts @@ -1,12 +1,13 @@ -import { ClapSegment } from "@aitube/clap" +import { TimelineSegment } from "@aitube/timeline" + import { VersionControls, VersionedState } from "./version-control" export type SegmentEditorState = { -} & VersionedState +} & VersionedState export type SegmentEditorControls = { -} & VersionControls +} & VersionControls export type SegmentEditorStore = SegmentEditorState & SegmentEditorControls diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index fa5b69cd..88ee8feb 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -1,4 +1,5 @@ -import { ClapEntity, ClapMeta, ClapSegment } from "@aitube/clap" +import { ClapEntity, ClapMeta } from "@aitube/clap" +import { TimelineSegment } from "@aitube/timeline" import { SettingsState } from "./settings" import { ChatEvent, ResolveRequestPrompts } from "./base-types" @@ -7,10 +8,10 @@ export type ResolveRequest = { settings: SettingsState // the reference segment to render (eg. storyboard or video) - segment: ClapSegment + segment: TimelineSegment // the slice to use for rendering - segments: ClapSegment[] + segments: TimelineSegment[] entities: Record @@ -30,7 +31,7 @@ export type AssistantRequest = { prompt: string // the slice to edit - segments: ClapSegment[] + segments: TimelineSegment[] // the full text of the current scene fullScene: string From 150606218012d9f5c379c38443ecc5845a26868d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 8 Jul 2024 13:14:37 +0200 Subject: [PATCH 204/346] 0.0.39 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/AudioCell.tsx | 2 +- .../src/components/cells/Cell.tsx | 125 ++++++++++++++---- .../src/components/cells/TextCell.tsx | 5 +- .../src/components/cells/types.ts | 6 +- .../src/hooks/useSegmentChanges.ts | 24 +++- .../aitube-timeline/src/hooks/useTimeline.ts | 58 ++++++-- .../aitube-timeline/src/types/timeline.ts | 13 +- 8 files changed, 190 insertions(+), 45 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index f0fa0782..0872042c 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.37", + "version": "0.0.39", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/AudioCell.tsx b/packages/aitube-timeline/src/components/cells/AudioCell.tsx index d5fce2af..31267568 100644 --- a/packages/aitube-timeline/src/components/cells/AudioCell.tsx +++ b/packages/aitube-timeline/src/components/cells/AudioCell.tsx @@ -35,7 +35,7 @@ export function AudioCell({ cellHeight - padding, // tiny padding 1 ]} // Width, height, depth. Default is [1, 1, 1] - radius={2.5} // Radius of the rounded corners. Default is 0.05 + radius={6} // Radius of the rounded corners. Default is 0.05 smoothness={2} // The number of curve segments. Default is 4 bevelSegments={1} // The number of bevel segments. Default is 4, setting it to 0 removes the bevel, as a result the texture is applied to the whole geometry. creaseAngle={0.4} // Smooth normals everywhere except faces that meet at an angle greater than the crease angle diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index ff1dc70e..e995a0ef 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -14,13 +14,15 @@ import { VideoCell } from "./VideoCell" import { TextCell } from "./TextCell" import { RedrawButton } from "./RedrawButton" import { AudioCell } from "./AudioCell" +import { useThree } from "@react-three/fiber" +import { SegmentArea } from "@/types/timeline" export function Cell({ segment: s }: { segment: TimelineSegment }) { - + const { size } = useThree() // TODO JULIAN: we should optimize this component because it causes // some performance issues due to the numerous re-renders @@ -81,61 +83,130 @@ export function Cell({ // because we need to handle their color change on hover / transition // console.log(`re-rendering a `) + const posX = + (startTimeInSteps * cellWidth) + + // the position of a RoundedBox is defined from its center + // so we have to shift its container (the a.mesh) + // to the right, exactly one half of the RoundedBox's width + + ((durationInSteps * cellWidth) / 2) + + const posY = + -verticalCellPosition + + (cellHeight / 2) + + const segmentWidth = widthInPx + const segmentHeight = cellHeight + + const computeBoundaries = ({ + pointX, + offsetX, + offsetY + }: { + pointX: number + offsetX: number + offsetY: number + }) => { + const isOutOfRange = offsetX < leftBarTrackScaleWidth ||offsetY < topBarTimeScaleHeight + + const cursorX = pointX + (size.width / 2) + const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP + + //console.log("cells.Cell:onClick() e:", e) + + const wMin = cursorTimestampAtInMs - s.startTimeInMs + const wMax = s.endTimeInMs - s.startTimeInMs + const cursorLeftPosInRatio = wMin / wMax + + const cursorLeftPosInPx = cursorLeftPosInRatio * segmentWidth + const cursorRightPosInPx = segmentWidth - cursorLeftPosInPx + + // note: this should be "responsive", with a max width + const sideGrabHandleWidth = 8 + // let isInLeftArea = cursorLeftPosInRatio < 0.5 + // let isInRightArea = cursorLeftPosInRatio > 0.5 + + const area = + (cursorRightPosInPx < 8) ? SegmentArea.LEFT + : (cursorRightPosInPx < 8) ? SegmentArea.RIGHT + : SegmentArea.MIDDLE + + return { + isOutOfRange, + cursorLeftPosInPx, + cursorRightPosInPx, + area + } + } + return ( { - // crude code to ignore the event when we are over the left column or the top row - if (e.offsetX < leftBarTrackScaleWidth || e.offsetY < topBarTimeScaleHeight) { - setHoveredSegment(undefined) + const { + isOutOfRange, + cursorLeftPosInPx, + cursorRightPosInPx, + area + } = computeBoundaries({ + pointX: e.point.x, + offsetX: e.offsetX, + offsetY: e.offsetY + }) + if (isOutOfRange) { + setHoveredSegment({ + hoveredSegment: undefined, + area, + }) } else { - setHoveredSegment(s) + setHoveredSegment({ + hoveredSegment: s, + area + }) } - // TODO: compute where exactly we are hovering, - // so that we can display a small hover effect on the left or right handles - // console.log("onPointerMove: e = ", e) + e.stopPropagation() return false }} onPointerLeave={(e) => { // console.log('leave') - setHoveredSegment(undefined) + setHoveredSegment({ + hoveredSegment: undefined, + // area, + }) e.stopPropagation() return false }} onClick={(e) => { - // console.log('click on cell ' + s.id) - // crude code to ignore the event when we are over the left column or the top row - if (e.offsetX < leftBarTrackScaleWidth || e.offsetY < topBarTimeScaleHeight) { - // we just ignore clicks outside - } else { + const { + isOutOfRange, + cursorLeftPosInPx, + cursorRightPosInPx + } = computeBoundaries({ + pointX: e.point.x, + offsetX: e.offsetX, + offsetY: e.offsetY + }) + + if (!isOutOfRange) { setSelectedSegment({ segment: s, // we leave it unspecified to create a toggle // isSelected: true, - onlyOneSelectedAtOnce: false, + onlyOneSelectedAtOnce: true, }) } - // TODO: compute where exactly we are hovering, - // so that we can display a small hover effect on the left or right handles - console.log("cells.Cell:onClick() e = ", e) + e.stopPropagation() return false }} diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 86450a2c..2842710e 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -54,10 +54,11 @@ export function TextCell({ cellHeight - padding, // tiny padding 1 ]} // Width, height, depth. Default is [1, 1, 1] - radius={2.5} // Radius of the rounded corners. Default is 0.05 + radius={6} // Radius of the rounded corners. Default is 0.05 smoothness={2} // The number of curve segments. Default is 4 bevelSegments={1} // The number of bevel segments. Default is 4, setting it to 0 removes the bevel, as a result the texture is applied to the whole geometry. creaseAngle={0.4} // Smooth normals everywhere except faces that meet at an angle greater than the crease angle + > { // 'click on text in cell ' + s.id) e.stopPropagation() return false }} + */ > {lines.join("\n")} } diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/aitube-timeline/src/components/cells/types.ts index 76929c73..c2e715fe 100644 --- a/packages/aitube-timeline/src/components/cells/types.ts +++ b/packages/aitube-timeline/src/components/cells/types.ts @@ -1,13 +1,17 @@ import { ClapTrack } from "@aitube/clap" import { ClapSegmentColorScheme, TimelineSegment } from "@/types" +import { SegmentArea } from "@/types/timeline" export type SpecializedCellProps = { segment: TimelineSegment cellWidth: number cellHeight: number isHovered: boolean - setHoveredSegment: (hoveredSegment?: TimelineSegment) => void + setHoveredSegment: (params?: { + hoveredSegment?: TimelineSegment + area?: SegmentArea + }) => void durationInSteps: number startTimeInSteps: number colorScheme: ClapSegmentColorScheme diff --git a/packages/aitube-timeline/src/hooks/useSegmentChanges.ts b/packages/aitube-timeline/src/hooks/useSegmentChanges.ts index bdf0a548..ef96944c 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentChanges.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentChanges.ts @@ -6,15 +6,33 @@ import { TimelineSegment } from "@/types" function getKey(segment: TimelineSegment) { const keyItems = [ segment.id, + + // properties of the timeline segment + segment.startAtLine, + segment.endAtLine, + segment.visibility, + segment.isSelected, + segment.isHovered, + segment.isHoveredOnBody, + segment.isHoveredOnLeftHandle, + segment.isHoveredOnRightHandle, + segment.isGrabbedOnBody, + segment.isGrabbedOnLeftHandle, + segment.isGrabbedOnRightHandle, + segment.isActive, + segment.isPlaying, + segment.editionStatus, + + // properties of the segment + segment.status, segment.label, segment.prompt, segment.assetUrl.slice(0, 1024), - segment.status ] - const hash = keyItems.join("::") + const segmentKey = keyItems.join("✇✇") - return hash + return segmentKey } /** diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 1b10ae00..d9b1137f 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -2,7 +2,7 @@ import { create } from "zustand" import * as THREE from "three" import { ClapOutputType, ClapProject, ClapSceneEvent, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, isValidNumber, newClap, serializeClap, ClapTrack, ClapTracks } from "@aitube/clap" -import { TimelineSegment, SegmentEditionStatus, SegmentVisibility, TimelineStore } from "@/types/timeline" +import { TimelineSegment, SegmentEditionStatus, SegmentVisibility, TimelineStore, SegmentArea } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants" import { hslToHex, findFreeTrack, getAudioBuffer, getFinalVideo, removeFinalVideosAndConvertToTimelineSegments, clapSegmentToTimelineSegment } from "@/utils" @@ -266,22 +266,27 @@ export const useTimeline = create((set, get) => ({ return height }, - getSegmentColorScheme: (segment?: TimelineSegment): ClapSegmentColorScheme => { + getSegmentColorScheme: (segment: TimelineSegment): ClapSegmentColorScheme => { const { theme } = get() let baseHue = 0 + let baseSaturation = theme.cell.saturation + let baseLightness = theme.cell.lightness + let backgroundColorSaturation = (segment.isSelected ? 2.2 : 1.4) * baseSaturation + let backgroundColorHoverSaturation = (segment.isSelected ? 2.2 : 1.8) * baseSaturation + let colorScheme: ClapSegmentColorScheme = { baseHue, baseSaturation, baseLightness, - backgroundColor: hslToHex(baseHue, baseSaturation + 10, baseLightness), - backgroundColorHover: hslToHex(baseHue, baseSaturation + 20, baseLightness + 1), - backgroundColorDisabled: hslToHex(baseHue, baseSaturation - 10, baseLightness - 2), + backgroundColor: hslToHex(baseHue, backgroundColorSaturation, baseLightness), + backgroundColorHover: hslToHex(baseHue, backgroundColorHoverSaturation, baseLightness + 1), + backgroundColorDisabled: hslToHex(baseHue, baseSaturation - 15, baseLightness - 2), foregroundColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), @@ -306,9 +311,9 @@ export const useTimeline = create((set, get) => ({ baseSaturation, baseLightness, - backgroundColor: hslToHex(baseHue, baseSaturation + 10, baseLightness), - backgroundColorHover: hslToHex(baseHue, baseSaturation + 20, baseLightness + 1), - backgroundColorDisabled: hslToHex(baseHue, baseSaturation - 10, baseLightness - 2), + backgroundColor: hslToHex(baseHue, backgroundColorSaturation, baseLightness), + backgroundColorHover: hslToHex(baseHue, backgroundColorHoverSaturation, baseLightness + 1), + backgroundColorDisabled: hslToHex(baseHue, baseSaturation - 15, baseLightness - 2), foregroundColor: hslToHex(baseHue, baseSaturation + 40, baseLightness), borderColor: hslToHex(baseHue, baseSaturation + 40, baseLightness + 10), textColor: hslToHex(baseHue, baseSaturation + 55, baseLightness - 60), @@ -321,7 +326,13 @@ export const useTimeline = create((set, get) => ({ return colorScheme }, - setHoveredSegment: (hoveredSegment?: TimelineSegment) => { + setHoveredSegment: ({ + hoveredSegment, + area, + }: { + hoveredSegment?: TimelineSegment + area?: SegmentArea + } = {}) => { const { hoveredSegment: previousHoveredSegment, segmentsChanged: previousSegmentsChanged @@ -335,9 +346,15 @@ export const useTimeline = create((set, get) => ({ return } else { previousHoveredSegment.isHovered = false + hoveredSegment.isHoveredOnLeftHandle = false + hoveredSegment.isHoveredOnRightHandle = false + hoveredSegment.isHoveredOnBody = false } } else { hoveredSegment.isHovered = true + hoveredSegment.isHoveredOnLeftHandle = area === SegmentArea.LEFT + hoveredSegment.isHoveredOnRightHandle = area === SegmentArea.RIGHT + hoveredSegment.isHoveredOnBody = area === SegmentArea.MIDDLE set({ hoveredSegment, segmentsChanged: 1 + previousSegmentsChanged @@ -346,6 +363,9 @@ export const useTimeline = create((set, get) => ({ } else { if (previousHoveredSegment) { previousHoveredSegment.isHovered = false + previousHoveredSegment.isHoveredOnLeftHandle = false + previousHoveredSegment.isHoveredOnRightHandle = false + previousHoveredSegment.isHoveredOnBody = false set({ hoveredSegment: undefined, segmentsChanged: 1 + previousSegmentsChanged @@ -404,25 +424,42 @@ export const useTimeline = create((set, get) => ({ selectedSegments: previousSelectedSegments, segmentsChanged: previousSegmentsChanged } = get() + /* + console.log(`setSelectedSegment() called with:`, { + segment, + isSelected, + onlyOneSelectedAtOnce, + }) + */ let newValue = typeof isSelected !== "boolean" ? (typeof segment?.isSelected === "boolean" ? (!segment.isSelected) : false) : isSelected + // console.log('`setSelectedSegment(): new value:', newValue) + // note: we do all of this in order to avoid useless state updates if (segment) { if (segment.isSelected === newValue) { + + // console.log('`setSelectedSegment(): nothing to do') + // nothing to do return } // if needed we clear any other selected item if (onlyOneSelectedAtOnce) { + + // console.log('`setSelectedSegment(): unselecting all previous segments') + segments.forEach(s => { s.isSelected = false }) set({ selectedSegments: [] }) } + // console.log('`setSelectedSegment(): assigning new value and propagating changes:', newValue) + segment.isSelected = newValue if (newValue) { @@ -437,6 +474,9 @@ export const useTimeline = create((set, get) => ({ }) } } else { + + // console.log('`setSelectedSegment(): mass change requested') + segments.forEach(s => { s.isSelected = newValue }) diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 1772cda4..42ff67cd 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -43,6 +43,12 @@ export enum SegmentEditionStatus { EDITING = "EDITING", } +export enum SegmentArea { + LEFT = 'LEFT', + RIGHT = 'RIGHT', + MIDDLE = 'MIDLE' +} + // some data can only exist inside a browser session (eg. AudioBuffer) // or at least data that only make sense on client side // we could put things like a mouse hover or selected state in here @@ -254,8 +260,11 @@ export type TimelineStoreModifiers = { setVisibleSegments: (visibleSegments?: TimelineSegment[]) => void getCellHeight: (trackNumber?: number) => number getVerticalCellPosition: (start: number, end: number) => number - getSegmentColorScheme: (segment?: TimelineSegment) => ClapSegmentColorScheme - setHoveredSegment: (hoveredSegment?: TimelineSegment) => void + getSegmentColorScheme: (segment: TimelineSegment) => ClapSegmentColorScheme + setHoveredSegment: (params?: { + hoveredSegment?: TimelineSegment + area?: SegmentArea + }) => void setEditedSegment: (editedSegment?: TimelineSegment) => void setSelectedSegment: (params?: { segment?: TimelineSegment From 124f98debf56a016d7091b1656e59e20d9068236 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 8 Jul 2024 13:15:53 +0200 Subject: [PATCH 205/346] upgrade timeline --- packages/aitube-clapper-services/bun.lockb | Bin 87338 -> 87314 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 66d94dd1fc7ec928ef817169e8221cb3b2cc75a2..269111158529226a45f928f7e8995ee395cb443e 100755 GIT binary patch delta 2821 zcmeH}c}!GC9LL{0ca;T!JeteZ72Fy?lqCXSQw2g{jM&t}H*=|Fv#%={s3Hvb2l#9+NKDREBvddsZ5n7A=$M z)3eupB%rk034*;KY&@eD1ZQXq6rqi)Gt%-3bJH^p!Ykpwv=syebPv1@sgEEyK&#-b zp$6!9Xc3g!=?d1)$kgR#nENd*TwAazceRjKn3$|#U%l2j&O;&C)e%dA2s8M!}XKFrIspgF~7DkPGf<46*3Jei|Aw+)CIh1L6Q9vXc z$6Ep-6-nNL5NFOP>fkhRjGuH06@T&O#eosbi?;+uitqdIAN(W41|L4?A7LB_TrrV{ z#VPf8AmJ=vpc9M%=K&Q`@|OVRf0pzzlnN=uuaH4`Sw;A(fb!QQy$+>#H=qL53$Ca< z9ku^dx^WQ5!E-79vQnOUCuO7Ng^q)_koLpypej#7J4 zsyg99d1ol~=SIPQDdQc9&U#8rl3II8tw?F|-jXM!QKn0tlzI)2;xnN%+AK*!q4*Ot zba}PvM+b_OZk!91;f81^4Hyf>r!OQ)J{d{_t&lWDim#Gy` z_gf#>(UscZr%RnM-y(#m(@@|ND1@Lt$I!BKD=cp~owCW9$J0ceAzO}Q5A2I~NAHkLfRZ;rUz#2dP& z8f*KOGI<#?rN-e~+Zo?|N2%HdyB$=43a}M?3d(uw9ku%w)Nr~OohG#mlssuAAHFk* zRdDya>8y-zy4#Ga_TF+AluelczYwJU zQXBUUyD?|;3C?`*dNGCIYQ2m(Sw@5hhWg<(&@hhNG?Ga34|^WOXnIb@lIQtMtWtmX zgv}Q5NYz1O*jee(s9!P;^1iUR3ZPG!at$Lp=o8R1R%S5IaP~snkQr!Hj zk{Lu6T>WSf^K7nkV7)d>+nndczH*X+)qNVa&L%2tRa!>2|C++w0$ol<^D-^#WYzOD MthU*E4ijDe1{UrR7XSbN delta 2873 zcmeH}c~DbF9LL{2h#C$FAg8e?Rue>G63|5CZ0mujIHCnhy$}$PK}NAuEP@;rwH~3{_tf6r!)P(Gw$T`zWe>{nU~G( zZZXTuX4z)Vkoo8KH~-z}vhOfZydN2y$oyyem`- zb%Cm&6wk_E7Lt*bn{Mx?aQU+Q1-WTL>hg??^reDDC0o%);oTiL{=|W68(qwGb>WVm zW%6ogqs8j1bmZm!VHTsJ&V>!*u?iJG*uS5}IB1FoFZT=+eN?;y6@AVaB_QkLOCDoSzEzVLF%|66JLe9jD?EU4gwYE;u14;n@xHTy56 z>3g6ab>t=0C#9@69#rlNrTzv{kT=foDTWHK!BHSU(!o%w9Y{e*Y4SmmC#6wFN}iN@ z)k*O%D77CWsS%2gFqR%KYtQ&E70^I2Qo}c(j_?zpG+-PQ%U(#9d6hON!@6@mxvsnBheSOA+XYiiJ>0y_E*|K#G%+Uu79GHQ4dhl6|#gX-)r6maN~* zkz&k~=Zd*UQ~Yi->#@ApCfzSrT|WPD>zSX<2XuVwU#q;b_mB3tMUA7rF6m<~a#)Zv zKjN_M!Ocg1M%&EURn^h;t+y-{Z&$m=BwubQnprgM#?XK`L0|PnuHi!Bv1a9$yT8h` zx!x~{Y`Jow{nJZFPbuE1d@Ngex^q{<0pBj!%5}k$SLZJdeLSGTlAfvcn{s?Yux5)} zN3#3X>*By_w})erx_p)%S`PVlNmPj;5?X-x2< zeU;KJKv`$t#N|z$GTK2_a(QzipWm$ZON6795)Q@zI$l~pE8pEbanNJr=%hOVegLPy zS#S>2a@JBjbvfG5=0@iu?XH6X?b@`D(;Vnk&=KPRWS|e|3+R}#fiBPunm|3j)KVNm zd$R$A06n6iAPo4!4+Ki!2?hYhSF}bmBR||aF_PX=J2(zb0y-mxg4e+?KqnWSw)DoT z!B$WJ=;U$ck!|C|?N+|OX}G1jEt$zGQL@I;b$b)jRUrEzpavXNfz4n8*aS8Ls`C+8 z2iEdKcT|4sk;CPqXX;c_CwU!zb|-*UaKF0?StT#JTZ8B5dnv5aQgzRnv8{ZkRmH_e z{=CiV!wi-V>qU=H`;E+gDH7RSgGL{w(FyiDn*ExD60JrTrqS}Voe82!&An}UrTqeS zrr@cw*;OATvJsdJr3m%52IkA;yvXJ^#(sYrv$wWl{LZ)b_VlGUXtaX;rnkR4YlOFL z)drO4H98D0WUKi_TZVEq?o&> Date: Tue, 9 Jul 2024 13:27:48 +0200 Subject: [PATCH 206/346] add a timeline slider --- .../scroller/HorizontalScroller.tsx | 136 ++++---- .../components/slider/HorizontalSlider.tsx | 6 +- .../src/components/slider/TimelineSlider.tsx | 298 ++++++++++++++++++ .../components/slider/TimelineSliderBase.tsx | 11 +- .../src/components/timeline/Cursor.tsx | 35 +- .../aitube-timeline/src/constants/themes.ts | 3 + .../src/hooks/useCursorGeometry.ts | 10 +- packages/aitube-timeline/src/types/theme.ts | 4 +- 8 files changed, 411 insertions(+), 92 deletions(-) create mode 100644 packages/aitube-timeline/src/components/slider/TimelineSlider.tsx diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx index 8fa81c3c..edd09e38 100644 --- a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx +++ b/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx @@ -1,19 +1,21 @@ -import { useEffect, useState } from "react" - -import { HorizontalSlider } from "@/components/slider" -import { leftBarTrackScaleWidth } from "@/constants/themes" import { useTimeline } from "@/hooks/useTimeline" -import { cn } from "@/utils" + +import TimelineSlider from "../slider/TimelineSlider" export function HorizontalScroller() { - const width = useTimeline(s => s.width) + const theme = useTimeline(s => s.theme) + + const segments = useTimeline(s => s.segments) const timelineCamera = useTimeline(s => s.timelineCamera) const timelineControls = useTimeline(s => s.timelineControls) - const minHorizontalZoomLevel = useTimeline((s) => s.minHorizontalZoomLevel) - const maxHorizontalZoomLevel = useTimeline((s) => s.maxHorizontalZoomLevel) - const cellWidth = useTimeline((s) => s.cellWidth) + // note: those do two different things: + // move the actual "physical" cursor (with setCursorTimestampAtInMs()) + // and trigger a callback to ask the parent app to do something (eg. jump/seek into the timeline) + const setCursorTimestampAtInMs = useTimeline(s => s.setCursorTimestampAtInMs) + const jumpAt = useTimeline(s => s.jumpAt) + const setHorizontalZoomLevel = useTimeline((s) => s.setHorizontalZoomLevel) // we could display the cursor as an extra line, I guess @@ -21,72 +23,27 @@ export function HorizontalScroller() { const cursorTimestampAtInMs = useTimeline(s => s.cursorTimestampAtInMs) const totalDurationInMs = useTimeline(s => s.totalDurationInMs) - const scrollX = useTimeline(s => s.scrollX) const setScrollX = useTimeline(s => s.setScrollX) const contentWidth = useTimeline(s => s.contentWidth) - - const [rangeStart, setRangeStart] = useState(0) - const [rangeEnd, setRangeEnd] = useState(10) - const [cursor, setCursor] = useState(0) - - useEffect(() => { - const cursorPosX = Math.min(cursorTimestampAtInMs, totalDurationInMs) - const cursorStartRatio = totalDurationInMs > 0 ? (cursorPosX / totalDurationInMs) : 0.0 - - const posX = scrollX + leftBarTrackScaleWidth - const rangeStartRatio = contentWidth > 0 ? (posX / contentWidth) : 0.0 - const rangeEndRatio = (posX + width) > 0 ? ((posX + width) / contentWidth) : 1.0 - - setCursor(Math.round(cursorStartRatio * width)) - setRangeStart(Math.round(rangeStartRatio * width)) - setRangeEnd(Math.round(rangeEndRatio * width)) - }, [ - // don't forget anything in here! all are important! - width, - cellWidth, - cursorTimestampAtInMs, - totalDurationInMs, - leftBarTrackScaleWidth, - contentWidth, - scrollX, - ]) - if (!timelineCamera || !timelineControls) { return null } + const getSegmentColorScheme = useTimeline(s => s.getSegmentColorScheme) - const handleTimelinePositionChange = (newValue: number) => { - setRangeStart(newValue) - const scrollRatio = newValue / width - const newScrollX = scrollRatio * contentWidth - setScrollX(newScrollX) - timelineCamera.position.setX(newScrollX) - timelineControls.target.setX(newScrollX) - } + if (!timelineCamera || !timelineControls) { return null } const handleZoomChange = (newZoom: number) => { setHorizontalZoomLevel(newZoom) } - // not sure if we need this, as it is easy to just move the sliding window - // then click on the timeline to set the cursor - const handleClickOnMiniCursor = (newValue: number) => { - // convert from the screen coordinates back to the camera position - // const newCursorPositionInMs = newValue * cellWidth * DEFAULT_DURATION_IN_MS_PER_STEP - } - return (

+ {/* + PREVIOUS COMPONENT, NOW OBSOLETE: { handleTimelinePositionChange(newRange[0]) }} @@ -94,18 +51,53 @@ export function HorizontalScroller() { // handleZoomChange(cellWidth + e.deltaY) }} /> -
({ + id: s.id, + track: s.track, + startTimeInMs: s.startTimeInMs, + endTimeInMs: s.endTimeInMs, + color: getSegmentColorScheme(s).backgroundColor, + }))} + eventOpacityWhenInsideSlidingWindowRangeThumb={1.0} + eventOpacityWhenOutsideSlidingWindowRangeThumb={0.7} + onSlidingWindowRangeThumbUpdate={({ + slidingWindowRangeThumbStartTimeInMs, + slidingWindowRangeThumbEndTimeInMs + }) => { + // we base ourself on the starting range so slidingWindowRangeThumbStartTimeInMs + // is enough, however we could also use slidingWindowRangeThumbEndTimeInMs + // to change the zoom factor in the timeline (@julian will implement this) + + const scrollRatio = slidingWindowRangeThumbStartTimeInMs / totalDurationInMs + const newScrollX = scrollRatio * contentWidth + setScrollX(newScrollX) + timelineCamera.position.setX(newScrollX) + timelineControls.target.setX(newScrollX) + }} + onPlaybackCursorUpdate={({ playbackCursorPositionInMs }) => { + // note: those do two different things: + // move the actual "physical" cursor (with setCursorTimestampAtInMs()) + // and trigger a callback to ask the parent app to do something (eg. jump/seek into the timeline) + setCursorTimestampAtInMs(playbackCursorPositionInMs) + jumpAt(playbackCursorPositionInMs) }} />
diff --git a/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx b/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx index 3a605d0c..c71d1a60 100644 --- a/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx +++ b/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx @@ -10,9 +10,13 @@ const HorizontalSlider = React.forwardRef< >(({ className, ...props }, ref) => ( void; + onPlaybackCursorUpdate: (update: { + playbackCursorPositionInMs: number; + }) => void; +} + +const TimelineSlider: React.FC = ({ + minTimeInMs, + maxTimeInMs, + currentPlaybackCursorPosition, + playbackCursorPositionColor, + playbackCursorPositionWidthInPx, + allowPlaybackCursorToBeDragged, + slidingWindowRangeThumbStartTimeInMs, + slidingWindowRangeThumbEndTimeInMs, + allowSlidingWindowRangeThumbResizeOnMouseWheel, + mouseWheelSensibility, + minSlidingWindowRangeThumbWidthInPx, + slidingWindowRangeThumbBorderColor, + slidingWindowRangeThumbBorderRadiusInPx, + slidingWindowRangeThumbBackgroundColor, + className, + events = [], + eventOpacityWhenInsideSlidingWindowRangeThumb, + eventOpacityWhenOutsideSlidingWindowRangeThumb, + onSlidingWindowRangeThumbUpdate, + onPlaybackCursorUpdate, +}) => { + const containerRef = useRef(null); + const canvasRef = useRef(null); + const [isDraggingWindow, setIsDraggingWindow] = useState(false); + const [isDraggingCursor, setIsDraggingCursor] = useState(false); + const [dragStartX, setDragStartX] = useState(0); + const [windowStart, setWindowStart] = useState(slidingWindowRangeThumbStartTimeInMs); + const [windowEnd, setWindowEnd] = useState(slidingWindowRangeThumbEndTimeInMs); + const [playbackCursor, setPlaybackCursor] = useState(currentPlaybackCursorPosition); + const [showOverlay, setShowOverlay] = useState(false); + + const drawEvents = useCallback(() => { + const canvas = canvasRef.current; + const ctx = canvas?.getContext('2d'); + if (!canvas || !ctx) return; + + const dpr = window.devicePixelRatio || 1; + const { width, height } = canvas.getBoundingClientRect(); + + ctx.clearRect(0, 0, width * dpr, height * dpr); + + const totalTracks = Math.max(...events.map(e => e.track), 0) + 1; + const trackHeight = height / totalTracks; + + events.forEach(event => { + const startX = ((event.startTimeInMs - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * width; + const endX = ((event.endTimeInMs - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * width; + const y = event.track * trackHeight; + + ctx.fillStyle = event.color; + ctx.globalAlpha = + (event.startTimeInMs >= windowStart && event.endTimeInMs <= windowEnd) + ? eventOpacityWhenInsideSlidingWindowRangeThumb + : eventOpacityWhenOutsideSlidingWindowRangeThumb; + + ctx.fillRect(startX, y, endX - startX, trackHeight); + }); + }, [events, minTimeInMs, maxTimeInMs, windowStart, windowEnd, eventOpacityWhenInsideSlidingWindowRangeThumb, eventOpacityWhenOutsideSlidingWindowRangeThumb]); + + const memoizedEvents = useMemo(() => events, [events]); + + const handleMouseDown = (e: React.MouseEvent) => { + const rect = containerRef.current?.getBoundingClientRect(); + if (!rect) return; + + const x = e.clientX - rect.left; + const windowStartX = ((windowStart - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; + const windowEndX = ((windowEnd - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; + const cursorX = ((playbackCursor - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; + + if (Math.abs(x - cursorX) <= playbackCursorPositionWidthInPx * 2 && allowPlaybackCursorToBeDragged) { + setIsDraggingCursor(true); + setShowOverlay(true); + } else if (x >= windowStartX && x <= windowEndX) { + setIsDraggingWindow(true); + setShowOverlay(true); + } else { + // Clicking on the background track + const clickedTime = minTimeInMs + (x / rect.width) * (maxTimeInMs - minTimeInMs); + const windowWidth = windowEnd - windowStart; + let newStart = clickedTime - windowWidth / 2; + let newEnd = clickedTime + windowWidth / 2; + + if (newStart < minTimeInMs) { + newStart = minTimeInMs; + newEnd = newStart + windowWidth; + } else if (newEnd > maxTimeInMs) { + newEnd = maxTimeInMs; + newStart = newEnd - windowWidth; + } + + setWindowStart(newStart); + setWindowEnd(newEnd); + onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); + } + + setDragStartX(e.clientX); + }; + + const setCanvasSize = useCallback(() => { + const canvas = canvasRef.current; + const container = containerRef.current; + if (!canvas || !container) return; + + const { width, height } = container.getBoundingClientRect(); + const dpr = window.devicePixelRatio || 1; + + canvas.width = width * dpr; + canvas.height = height * dpr; + canvas.style.width = `${width}px`; + canvas.style.height = `${height}px`; + + const ctx = canvas.getContext('2d'); + if (ctx) { + ctx.scale(dpr, dpr); + } + }, []); + + const handleMouseMove = useCallback((e: MouseEvent) => { + if (!isDraggingWindow && !isDraggingCursor) return; + + const containerWidth = containerRef.current?.clientWidth || 1; + const deltaX = e.clientX - dragStartX; + const deltaTime = (deltaX / containerWidth) * (maxTimeInMs - minTimeInMs); + + if (isDraggingWindow) { + let newStart = windowStart + deltaTime; + let newEnd = windowEnd + deltaTime; + + if (newStart < minTimeInMs) { + newStart = minTimeInMs; + newEnd = newStart + (windowEnd - windowStart); + } else if (newEnd > maxTimeInMs) { + newEnd = maxTimeInMs; + newStart = newEnd - (windowEnd - windowStart); + } + + setWindowStart(newStart); + setWindowEnd(newEnd); + onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); + } else if (isDraggingCursor) { + let newCursor = playbackCursor + deltaTime; + newCursor = Math.max(minTimeInMs, Math.min(maxTimeInMs, newCursor)); + setPlaybackCursor(newCursor); + onPlaybackCursorUpdate({ playbackCursorPositionInMs: newCursor }); + } + + setDragStartX(e.clientX); + }, [isDraggingWindow, isDraggingCursor, dragStartX, windowStart, windowEnd, playbackCursor, minTimeInMs, maxTimeInMs, onSlidingWindowRangeThumbUpdate, onPlaybackCursorUpdate]); + + useEffect(() => { + setCanvasSize(); + drawEvents(); + }, [setCanvasSize, drawEvents, memoizedEvents, windowStart, windowEnd, playbackCursor]); + + const handleMouseUp = useCallback(() => { + setIsDraggingWindow(false); + setIsDraggingCursor(false); + setShowOverlay(false); + }, []); + + useEffect(() => { + if (showOverlay) { + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + } else { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + } + + return () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + }; + }, [showOverlay, handleMouseMove, handleMouseUp]); + + + // Update state when props change + useEffect(() => { + setWindowStart(slidingWindowRangeThumbStartTimeInMs); + setWindowEnd(slidingWindowRangeThumbEndTimeInMs); + }, [slidingWindowRangeThumbStartTimeInMs, slidingWindowRangeThumbEndTimeInMs]); + + useEffect(() => { + setPlaybackCursor(currentPlaybackCursorPosition); + }, [currentPlaybackCursorPosition]); + + const handleWheel = (e: React.WheelEvent) => { + if (!allowSlidingWindowRangeThumbResizeOnMouseWheel) return; + + const delta = e.deltaY * mouseWheelSensibility; + const windowWidth = windowEnd - windowStart; + const newWidth = Math.max(1000, Math.min(maxTimeInMs - minTimeInMs, windowWidth + delta)); + + let newStart = windowStart - (newWidth - windowWidth) / 2; + let newEnd = windowEnd + (newWidth - windowWidth) / 2; + + if (newStart < minTimeInMs) { + newStart = minTimeInMs; + newEnd = newStart + newWidth; + } else if (newEnd > maxTimeInMs) { + newEnd = maxTimeInMs; + newStart = newEnd - newWidth; + } + + setWindowStart(newStart); + setWindowEnd(newEnd); + onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); + }; + + return ( +
+ +
+
+
+
+
+ ); +}; + + +export default TimelineSlider; \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx b/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx index f1a16d6f..a40776d2 100644 --- a/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx +++ b/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx @@ -29,7 +29,16 @@ const TimelineSliderBase = React.forwardRef< )} /> diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/aitube-timeline/src/components/timeline/Cursor.tsx index 08e545dc..b270a4d5 100644 --- a/packages/aitube-timeline/src/components/timeline/Cursor.tsx +++ b/packages/aitube-timeline/src/components/timeline/Cursor.tsx @@ -8,11 +8,15 @@ import { useCursorGeometry } from "@/hooks/useCursorGeometry" import { leftBarTrackScaleWidth } from "@/constants/themes" export function Cursor() { + const theme = useTimeline(s => s.theme) const setTimelineCursor = useTimeline(s => s.setTimelineCursor) const contentHeight = useTimeline(s => s.contentHeight) const cursorGeometries = useCursorGeometry() + + const exponent = 3; // Adjust this value to control the steepness of the curve + // console.log(`re-rendering `) return ( @@ -29,18 +33,25 @@ export function Cursor() { } }} > - {cursorGeometries.map((lineGeometry, idx) => ( - - - - ))} + {cursorGeometries.map((lineGeometry, idx) => { + const t = idx / (cursorGeometries.length - 1); // Normalized index (0 to 1) + const opacity = Math.pow(t, exponent); // Apply power function for curved gradient + const isLast = idx >= (cursorGeometries.length - 2) + return ( + + + + ) + })} diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/aitube-timeline/src/constants/themes.ts index b56010f0..e0b8ca3a 100644 --- a/packages/aitube-timeline/src/constants/themes.ts +++ b/packages/aitube-timeline/src/constants/themes.ts @@ -66,5 +66,8 @@ export const pastel: ClapTimelineTheme = { // gradientStart: 0.6, // gradientEnd: 1.0, } + }, + playbackCursor: { + lineColor: "rgba(255, 255, 0, 1.0)" } } diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts index e3da06bd..41439f63 100644 --- a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts +++ b/packages/aitube-timeline/src/hooks/useCursorGeometry.ts @@ -2,8 +2,6 @@ import { useEffect, useState } from "react" import * as THREE from "three" import { useTimeline } from "./useTimeline" -import { useThree } from "@react-three/fiber"; -import { leftBarTrackScaleWidth } from "@/constants/themes"; export const useCursorGeometry = () => { @@ -12,14 +10,16 @@ export const useCursorGeometry = () => { const contentHeight = useTimeline(s => s.contentHeight) + const widthInPx = 18 + useEffect(() => { const thisLines = [] as THREE.BufferGeometry[]; - for (let i = 0; i < 3; i++) { + for (let i = 0; i < widthInPx; i++) { const verticalLinePoints = [ - new THREE.Vector3(i, 60, 1), - new THREE.Vector3(i, -contentHeight, 1) + new THREE.Vector3(i - widthInPx, 60, 1), + new THREE.Vector3(i - widthInPx, -contentHeight, 1) ]; const verticalLineGeometry = new THREE.BufferGeometry().setFromPoints(verticalLinePoints); diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/aitube-timeline/src/types/theme.ts index 91b8ba5c..21a64e46 100644 --- a/packages/aitube-timeline/src/types/theme.ts +++ b/packages/aitube-timeline/src/types/theme.ts @@ -1,5 +1,4 @@ import { ClapSegmentCategory } from "@aitube/clap" -import { string } from "three/examples/jsm/nodes/Nodes.js" export type ClapSegmentCategoryHues = Record @@ -28,6 +27,9 @@ export type ClapTimelineTheme = { gradientEnd: number } } + playbackCursor: { + lineColor: string + } } export type ClapSegmentColorScheme = { From a51b9a0f564124ec1a5e7eba5fc81a2c8fe665d7 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 9 Jul 2024 15:15:25 +0200 Subject: [PATCH 207/346] 0.0.40 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/TextCell.tsx | 22 ++++- .../src/components/slider/TimelineSlider.tsx | 85 +++++++++++----- .../src/components/timeline/Cells.tsx | 2 +- .../src/components/timeline/Cursor.tsx | 97 ++++++++++++------- packages/aitube-timeline/src/hooks/index.ts | 1 + .../src/hooks/useAnimationFrame.ts | 22 +++++ .../src/hooks/useCursorGeometry.ts | 5 +- 8 files changed, 170 insertions(+), 66 deletions(-) create mode 100644 packages/aitube-timeline/src/hooks/useAnimationFrame.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 0872042c..d831e49d 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.39", + "version": "0.0.40", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index 2842710e..1030f547 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -1,3 +1,5 @@ +import React, { useMemo } from 'react'; + import { GradientTexture, RoundedBox, Text } from "@react-three/drei" import { useSpring, a, animated, config } from "@react-spring/three" @@ -5,7 +7,7 @@ import { clampWebGLText } from "@/utils" import { SpecializedCellProps } from "./types" -export function TextCell({ +const MemoizedTextCell = React.memo(function TextCell({ segment: s, cellWidth, cellHeight, @@ -29,15 +31,15 @@ export function TextCell({ // note: an alternative could be to create a small fade or blur effect, // but I think it might be expensive // console.log(" durationInSteps * cellWidth:", durationInSteps * cellWidth) - const lines = clampWebGLText( + const lines = useMemo(() => clampWebGLText( s.label || s.prompt, widthInPx, maxNbLines - ) + ), [s.label, s.prompt, widthInPx, maxNbLines]); + // const label = clampWebGLTextNaive(s.label, durationInSteps * cellWidth) const padding = 1.2 - const fontSize = 13 const lineHeight = 1.2 @@ -159,4 +161,14 @@ export function TextCell({ ) -} \ No newline at end of file +}, (prevProps, nextProps) => { + // Custom comparison function + return prevProps.segment.id === nextProps.segment.id && + prevProps.isHovered === nextProps.isHovered && + prevProps.widthInPx === nextProps.widthInPx && + prevProps.widthInPxAfterZoom === nextProps.widthInPxAfterZoom && + prevProps.isResizing === nextProps.isResizing && + prevProps.track.visible === nextProps.track.visible; +}); + +export { MemoizedTextCell as TextCell }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx b/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx index 021cf0c8..1c713351 100644 --- a/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx +++ b/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx @@ -36,6 +36,15 @@ export interface TimelineSliderProps { }) => void; } +/** + * A timeline slider component made using React and TypeScript. + * The idea is to control a temporal timeline, so the unit is the milliseconds, + * and coordinates are based on timestamps. + * + * The component has a draggable range thumb, and a separate draggable "playback cursor". + * + * We also show a nice little minimap made of a background canvas of events. + */ const TimelineSlider: React.FC = ({ minTimeInMs, maxTimeInMs, @@ -101,25 +110,19 @@ const TimelineSlider: React.FC = ({ const handleMouseDown = (e: React.MouseEvent) => { const rect = containerRef.current?.getBoundingClientRect(); if (!rect) return; - + const x = e.clientX - rect.left; - const windowStartX = ((windowStart - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; - const windowEndX = ((windowEnd - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; const cursorX = ((playbackCursor - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; - + if (Math.abs(x - cursorX) <= playbackCursorPositionWidthInPx * 2 && allowPlaybackCursorToBeDragged) { setIsDraggingCursor(true); - setShowOverlay(true); - } else if (x >= windowStartX && x <= windowEndX) { - setIsDraggingWindow(true); - setShowOverlay(true); } else { - // Clicking on the background track + setIsDraggingWindow(true); const clickedTime = minTimeInMs + (x / rect.width) * (maxTimeInMs - minTimeInMs); const windowWidth = windowEnd - windowStart; let newStart = clickedTime - windowWidth / 2; let newEnd = clickedTime + windowWidth / 2; - + if (newStart < minTimeInMs) { newStart = minTimeInMs; newEnd = newStart + windowWidth; @@ -127,14 +130,16 @@ const TimelineSlider: React.FC = ({ newEnd = maxTimeInMs; newStart = newEnd - windowWidth; } - + setWindowStart(newStart); setWindowEnd(newEnd); onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); } - + setDragStartX(e.clientX); + setShowOverlay(true); }; + const setCanvasSize = useCallback(() => { const canvas = canvasRef.current; @@ -157,36 +162,37 @@ const TimelineSlider: React.FC = ({ const handleMouseMove = useCallback((e: MouseEvent) => { if (!isDraggingWindow && !isDraggingCursor) return; - + const containerWidth = containerRef.current?.clientWidth || 1; const deltaX = e.clientX - dragStartX; - const deltaTime = (deltaX / containerWidth) * (maxTimeInMs - minTimeInMs); - + if (isDraggingWindow) { - let newStart = windowStart + deltaTime; - let newEnd = windowEnd + deltaTime; - + const windowWidth = windowEnd - windowStart; + let newStart = windowStart + (deltaX / containerWidth) * (maxTimeInMs - minTimeInMs); + let newEnd = newStart + windowWidth; + if (newStart < minTimeInMs) { newStart = minTimeInMs; - newEnd = newStart + (windowEnd - windowStart); + newEnd = newStart + windowWidth; } else if (newEnd > maxTimeInMs) { newEnd = maxTimeInMs; - newStart = newEnd - (windowEnd - windowStart); + newStart = newEnd - windowWidth; } - + setWindowStart(newStart); setWindowEnd(newEnd); onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); } else if (isDraggingCursor) { - let newCursor = playbackCursor + deltaTime; + let newCursor = playbackCursor + (deltaX / containerWidth) * (maxTimeInMs - minTimeInMs); newCursor = Math.max(minTimeInMs, Math.min(maxTimeInMs, newCursor)); setPlaybackCursor(newCursor); onPlaybackCursorUpdate({ playbackCursorPositionInMs: newCursor }); } - + setDragStartX(e.clientX); }, [isDraggingWindow, isDraggingCursor, dragStartX, windowStart, windowEnd, playbackCursor, minTimeInMs, maxTimeInMs, onSlidingWindowRangeThumbUpdate, onPlaybackCursorUpdate]); - + + useEffect(() => { setCanvasSize(); drawEvents(); @@ -247,12 +253,43 @@ const TimelineSlider: React.FC = ({ onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); }; + const handleDoubleClick = (e: React.MouseEvent) => { + const rect = containerRef.current?.getBoundingClientRect(); + if (!rect) return; + + const x = e.clientX - rect.left; + const clickedTime = minTimeInMs + (x / rect.width) * (maxTimeInMs - minTimeInMs); + + // Move the range thumb + const windowWidth = windowEnd - windowStart; + let newStart = clickedTime - windowWidth / 2; + let newEnd = clickedTime + windowWidth / 2; + + if (newStart < minTimeInMs) { + newStart = minTimeInMs; + newEnd = newStart + windowWidth; + } else if (newEnd > maxTimeInMs) { + newEnd = maxTimeInMs; + newStart = newEnd - windowWidth; + } + + setWindowStart(newStart); + setWindowEnd(newEnd); + onSlidingWindowRangeThumbUpdate({ slidingWindowRangeThumbStartTimeInMs: newStart, slidingWindowRangeThumbEndTimeInMs: newEnd }); + + // Move the playback cursor + const newCursor = Math.max(minTimeInMs, Math.min(maxTimeInMs, clickedTime)); + setPlaybackCursor(newCursor); + onPlaybackCursorUpdate({ playbackCursorPositionInMs: newCursor }); + }; + return (
+
((set, get) => ({ } + // note that we measure the empty ness here, but right after + // we run some code to fill-in the missing tracks + const isEmpty = tracks.length === 0 - // ---------- REPAIR THE TRACKS --------------- - for (let id = 0; id < tracks.length; id++) { + // ---------- FILL-IN THE TRACKS --------------- + for (let id = 0; id < DEFAULT_NB_TRACKS; id++) { if (!tracks[id]) { tracks[id] = { id, @@ -174,8 +177,6 @@ export const useTimeline = create((set, get) => ({ // console.log("totalNumberOfLines = " + totalNumberOfLines) - const isEmpty = tracks.length === 0 - // ---------- REPAIR THE LINE-2-SEGMENT DICTIONARY --------------- let previousValue: TimelineSegment[] = [] // we aren't finished yet: the lineNumberToMentionedSegments will be missing some entries diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 30f2a1d7..8b4cd428 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -36,7 +36,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { nbMaxShots: NB_MAX_SHOTS, nbMaxTracks: DEFAULT_NB_TRACKS, nbIdentifiedTracks: 0, - contentWidth: 1024, + contentWidth: 4096, contentHeight: 800, cellWidth: PROMPT_STEP_HEIGHT_IN_PX, tracks: [], @@ -79,7 +79,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { export function getDefaultPreferencesState(): TimelineStorePreferencesState { return { isReady: false, - width: 1024, + width: 1800, height: 800, theme: pastel, timelineControls: undefined, From d0d12708640f3da4fbfeda0dea1b9cbc6df8e9c8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 23 Jul 2024 16:14:56 +0200 Subject: [PATCH 232/346] 0.0.35 --- packages/aitube-clapper-services/bun.lockb | Bin 87703 -> 87703 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 8e5541f3bb85c679c288c18b7a4de363cfa6098d..ac21404840e298a4502d50929d0a5de7e97b379d 100755 GIT binary patch delta 327 zcmV-N0l5B`tp%5@1&}Tvf6wAbFUU0|6SlMKi>+f(xAoZ?!%${z-uQq2Un2_XA@o?mhsl-bt@ zhxxNDRag^1=5XiW?(^?uuVv-c12L!gc+rHb)1{X9I0?=&VZx;jTfwWFm8DoWQdRQ{ ztAZbjH}iEN2o!BMwlyR!7tt1xv&Cp&A3(N7R@Pc%8EqqjhTGpLnnD9Tf=XZMy{NKR zkev&;cwHg62w^cp?LKyI>l*s@9 delta 327 zcmV-N0l5B`tp%5@1&}Tvvq`waA&&H&o?n!vN(`WQ8UPYmbrRkrcw4c?%IiJBALUW<3Vr<|oV&s|PM3 z6mhdHRag^1h(go0V$L;Wd(PpDF27tQ8BDm^0bOia&HcwHg61w^cp?LKx@+k&FNU diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 8c941df7..9ec9c6f4 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.34", + "version": "0.0.35", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.0.30", - "@aitube/timeline": "0.0.44", + "@aitube/timeline": "0.0.45", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From 668f8bfdac21f2227e2f3553db2e9f898f65a559 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 11:36:29 +0200 Subject: [PATCH 233/346] 0.0.46 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/TextCell.tsx | 4 +- .../components/timeline/TopBarTimeScale.tsx | 170 ++++++++++-------- .../aitube-timeline/src/constants/grid.ts | 2 +- .../src/hooks/useTimeScaleGraduations.ts | 40 ++++- .../aitube-timeline/src/hooks/useTimeline.ts | 6 +- 6 files changed, 137 insertions(+), 87 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 8c45f613..d23b484f 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.45", + "version": "0.0.46", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/aitube-timeline/src/components/cells/TextCell.tsx index c9bb9eb5..1cad2138 100644 --- a/packages/aitube-timeline/src/components/cells/TextCell.tsx +++ b/packages/aitube-timeline/src/components/cells/TextCell.tsx @@ -39,7 +39,7 @@ const MemoizedTextCell = React.memo(function TextCell({ // const label = clampWebGLTextNaive(s.label, durationInSteps * cellWidth) - const padding = 1.2 + const padding = 1.5 const fontSize = 13 const lineHeight = 1.2 @@ -56,7 +56,7 @@ const MemoizedTextCell = React.memo(function TextCell({ cellHeight - padding, // tiny padding 1 ]} // Width, height, depth. Default is [1, 1, 1] - radius={6} // Radius of the rounded corners. Default is 0.05 + radius={8} // Radius of the rounded corners. Default is 0.05 smoothness={2} // The number of curve segments. Default is 4 bevelSegments={1} // The number of bevel segments. Default is 4, setting it to 0 removes the bevel, as a result the texture is applied to the whole geometry. creaseAngle={0.4} // Smooth normals everywhere except faces that meet at an angle greater than the crease angle diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 4dce0b4a..5af2c707 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from "react" +import React, { useEffect, useMemo, useRef } from "react" import { Plane, Text } from "@react-three/drei" @@ -91,78 +91,22 @@ export function TopBarTimeScale() { } }, []) - return ( - { - if (r) { - setTopBarTimeScale(r) - } - }} - position={[-leftBarTrackScaleWidth, 0, -3]} - onWheel={(e) => { - if (e.offsetY > topBarTimeScaleHeight) { return } - - const disableWheel = true - if (disableWheel) { - console.log(`user tried to change the horizontal scale, but it is disabled due to rescaling bugs (@Julian fix this!)`) - e.stopPropagation() - return false - } - - const wheelFactor = 0.3 - - setHorizontalZoomLevel( - // Math.round( - useTimeline.getState().cellWidth + (wheelFactor * e.deltaY) - // ) - ) - e.stopPropagation() - return false - }} - onPointerDown={(e) => { - const cursorX = e.point.x + (size.width / 2) - const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP - const { wasPlaying } = togglePlayback(false) - wasPlayingRef.current = wasPlaying - setCursorTimestampAtInMs(cursorTimestampAtInMs) - jumpAt(cursorTimestampAtInMs) - setIsDraggingCursor(true) - e.stopPropagation() - return false - }} - onPointerUp={(e) => { - setIsDraggingCursor(false) - if (typeof wasPlayingRef.current === "boolean") { - if (wasPlayingRef.current) { - togglePlayback(true) - } - } - e.stopPropagation() - return false - }} - onPointerMove={e => { - // TODO move this into the whole parent container? - // the problem is.. are we still gonna get events - - // console.log(e) - // handle the "timeline cursor drag" - if (e.pressure > 0) { - const cursorX = e.point.x + (size.width / 2) - const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP - setCursorTimestampAtInMs(cursorTimestampAtInMs) - jumpAt(cursorTimestampAtInMs) - } - e.stopPropagation() - return false - }} - > + // console.log("contentWidth:", contentWidth) + // console.log("NB_MAX_SHOTS * cellWidth:", NB_MAX_SHOTS * cellWidth) + + const maxWidth = contentWidth + + const graduationGroup = useMemo(() => ( + <> @@ -195,8 +139,8 @@ export function TopBarTimeScale() { ))} - - {isResizing ? [] : timeScaleGraduations.map((lineGeometry, idx) => ( + + {timeScaleGraduations.filter((_, idx) => (idx * cellWidth) < maxWidth).map((lineGeometry, idx) => ( ))} + + ), [ + isResizing, + timeScaleGraduations.length, + leftBarTrackScaleWidth, + topBarTimeScaleHeight, + contentWidth, + cellWidth, + unit, + formatTimestamp, + theme.topBarTimeScale.backgroundColor, + theme.topBarTimeScale.lineColor, + theme.topBarTimeScale.textColor, + ]) + + return ( + { + if (r) { + setTopBarTimeScale(r) + } + }} + // just a trick + position={[0, 0, -3]} + onWheel={(e) => { + if (e.offsetY > topBarTimeScaleHeight) { return } + + const disableWheel = true + if (disableWheel) { + console.log(`user tried to change the horizontal scale, but it is disabled due to rescaling bugs (@Julian fix this!)`) + e.stopPropagation() + return false + } + + const wheelFactor = 0.3 + + setHorizontalZoomLevel( + // Math.round( + useTimeline.getState().cellWidth + (wheelFactor * e.deltaY) + // ) + ) + e.stopPropagation() + return false + }} + onPointerDown={(e) => { + const cursorX = e.point.x + (size.width / 2) + const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP + const { wasPlaying } = togglePlayback(false) + wasPlayingRef.current = wasPlaying + setCursorTimestampAtInMs(cursorTimestampAtInMs) + jumpAt(cursorTimestampAtInMs) + setIsDraggingCursor(true) + e.stopPropagation() + return false + }} + onPointerUp={(e) => { + setIsDraggingCursor(false) + if (typeof wasPlayingRef.current === "boolean") { + if (wasPlayingRef.current) { + togglePlayback(true) + } + } + e.stopPropagation() + return false + }} + onPointerMove={e => { + // TODO move this into the whole parent container? + // the problem is.. are we still gonna get events + + // console.log(e) + // handle the "timeline cursor drag" + if (e.pressure > 0) { + const cursorX = e.point.x + (size.width / 2) + const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP + setCursorTimestampAtInMs(cursorTimestampAtInMs) + jumpAt(cursorTimestampAtInMs) + } + e.stopPropagation() + return false + }} + > + {graduationGroup} ) } \ No newline at end of file diff --git a/packages/aitube-timeline/src/constants/grid.ts b/packages/aitube-timeline/src/constants/grid.ts index 8ebfa9b1..e79d00fa 100644 --- a/packages/aitube-timeline/src/constants/grid.ts +++ b/packages/aitube-timeline/src/constants/grid.ts @@ -10,4 +10,4 @@ export const DEFAULT_COLUMNS_PER_SLICE = 4 export const PROMPT_STEP_HEIGHT_IN_PX = 48 export const PREVIEW_STEP_HEIGHT_IN_PX = 3 * PROMPT_STEP_HEIGHT_IN_PX -export const NB_MAX_SHOTS = ((3 * 60 * 60) / 2) // 3 hours converted to seconds, and divided by 2 (a shot is about 2 sec) +export const NB_MAX_SHOTS = ((8 * 60 * 60) / 2) // 6 hours converted to seconds, and divided by 2 (a shot is about 2 sec) diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts index e3c2ad0f..5344fe7f 100644 --- a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts +++ b/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts @@ -1,6 +1,8 @@ import { useEffect, useState } from "react" import * as THREE from "three" +import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/themes" + import { useTimeline } from "./useTimeline" // note: those big for-loop just to render graduations are not efficient @@ -15,22 +17,30 @@ export const useTimeScaleGraduations = ({ }) => { const cellWidth = useTimeline(s => s.cellWidth) const nbMaxShots = useTimeline(s => s.nbMaxShots) + const contentWidth = useTimeline((s) => s.contentWidth) const [timeScaleGraduations, setTimeScaleGraduations] = useState([] as THREE.BufferGeometry[]); const bigTickHeight = 12 const smallTickHeight = 8 + const maxWidth = contentWidth + useEffect(() => { const lines = [] as THREE.BufferGeometry[]; + let x = 0 if (cellWidth > 32) { for (let i = 0; i < nbMaxShots * 2; i++) { + x = i * (cellWidth / 2) + if (x > maxWidth) { + break + } const verticalLinePoints = [ - new THREE.Vector3(i * (cellWidth / 2), 2, 1), + new THREE.Vector3(x, 2, 1), new THREE.Vector3( - i * (cellWidth / 2), + x, i % unit === 0 ? bigTickHeight : smallTickHeight, 1 ) @@ -40,10 +50,14 @@ export const useTimeScaleGraduations = ({ } } else if (cellWidth > 16) { for (let i = 0; i < nbMaxShots; i++) { + x = i * (cellWidth) + if (x > maxWidth) { + break + } const verticalLinePoints = [ - new THREE.Vector3(i * cellWidth, 2, 1), + new THREE.Vector3(x, 2, 1), new THREE.Vector3( - i * (cellWidth), + x, i % unit === 0 ? bigTickHeight : smallTickHeight, 1 ) @@ -54,10 +68,14 @@ export const useTimeScaleGraduations = ({ } else if (cellWidth > 8) { for (let i = 0; i < nbMaxShots; i++) { if (i % 10 !== 0) { continue } + x = i * (cellWidth) + if (x > maxWidth) { + break + } const verticalLinePoints = [ - new THREE.Vector3(i * cellWidth, 2, 1), + new THREE.Vector3(x, 2, 1), new THREE.Vector3( - i * cellWidth, + x, smallTickHeight, 1 ) @@ -69,10 +87,14 @@ export const useTimeScaleGraduations = ({ } else { for (let i = 0; i < nbMaxShots; i++) { if (i % 10 !== 0) { continue } + x = i * (cellWidth) + if (x > maxWidth) { + break + } const verticalLinePoints = [ - new THREE.Vector3(i * cellWidth, 2, 1), + new THREE.Vector3(x, 2, 1), new THREE.Vector3( - i * cellWidth, + x, smallTickHeight, 1 ) @@ -84,7 +106,7 @@ export const useTimeScaleGraduations = ({ } setTimeScaleGraduations(lines); - }, [cellWidth, nbMaxShots]); + }, [cellWidth, nbMaxShots, leftBarTrackScaleWidth, contentWidth]); return timeScaleGraduations; }; \ No newline at end of file diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index e2ba280a..6a7cf545 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -812,6 +812,7 @@ export const useTimeline = create((set, get) => ({ endTimeInMs }) + /* console.log("availableTrack:", { requestedStartTimeInMs, segmentDuration, @@ -820,6 +821,7 @@ export const useTimeline = create((set, get) => ({ startTimeInMs, endTimeInMs }) + */ // we just make sure to sanitize it before adding it segment = await clapSegmentToTimelineSegment(segment) @@ -991,7 +993,7 @@ export const useTimeline = create((set, get) => ({ // if we have a collision, there is currently no way around it we need to create a new track if (!(s.endTimeInMs <= startTimeInMs || s.startTimeInMs >= endTimeInMs)) { const newTrack = findFreeTrack({ startTimeInMs, endTimeInMs }) - console.log(`ASSIGN NEW TRACK (${newTrack}) TO SEGMENT`, s) + //console.log(`ASSIGN NEW TRACK (${newTrack}) TO SEGMENT`, s) assignTrack({ segment, @@ -1019,7 +1021,7 @@ export const useTimeline = create((set, get) => ({ } } } - console.log(`TODO Julian: stretched segments (overlapping segments) should be re-generated`) + //console.log(`TODO Julian: stretched segments (overlapping segments) should be re-generated`) set({ segments, From 8a25b144a3f2ec5cf8629e6ec311b5f2bb64d01d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 14:40:11 +0200 Subject: [PATCH 234/346] various improvements --- packages/aitube-clap/README.md | 21 ++ packages/aitube-clap/package.json | 10 +- packages/aitube-clap/src/factories/index.ts | 1 + packages/aitube-clap/src/factories/newClap.ts | 34 +- .../aitube-clap/src/factories/newEntity.ts | 1 + .../aitube-clap/src/factories/newWorkflow.ts | 21 ++ packages/aitube-clap/src/index.ts | 25 +- packages/aitube-clap/src/io/parseClap.ts | 157 ++------ packages/aitube-clap/src/io/serializeClap.ts | 131 +------ packages/aitube-clap/src/sanitizers/index.ts | 7 + .../src/sanitizers/sanitizeEntities.ts | 6 + .../src/sanitizers/sanitizeEntity.ts | 54 +++ .../src/sanitizers/sanitizeMeta.ts | 40 ++ .../src/sanitizers/sanitizeSegment.ts | 56 +++ .../src/sanitizers/sanitizeSegments.ts | 6 + .../src/sanitizers/sanitizeWorkflow.ts | 28 ++ .../src/sanitizers/sanitizeWorkflows.ts | 6 + packages/aitube-clap/src/types.ts | 350 +++++++++++++++--- packages/aitube-clap/src/utils/index.ts | 1 + .../src/utils/parseMediaOrientation.ts | 14 +- .../aitube-clap/src/utils/parseOutputType.ts | 54 ++- .../src/utils/parseSegmentCategory.ts | 3 + .../src/utils/parseWorkflowEngine.ts | 37 ++ 23 files changed, 728 insertions(+), 335 deletions(-) create mode 100644 packages/aitube-clap/src/factories/newWorkflow.ts create mode 100644 packages/aitube-clap/src/sanitizers/index.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeEntities.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeEntity.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeMeta.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeSegment.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeSegments.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts create mode 100644 packages/aitube-clap/src/sanitizers/sanitizeWorkflows.ts create mode 100644 packages/aitube-clap/src/utils/parseWorkflowEngine.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index 766afad9..a6dbc01b 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -42,6 +42,16 @@ import { ClapProject, ClapMediaOrientation, + ClapInputFieldNumber, + ClapInputFieldString, + ClapInputFieldBoolean, + ClapInputFieldAny, + ClapInputFields, + ClapInputValue, + ClapInputValues, + ClapWorkflowEngine, + ClapWorkflow, + // defaults defaultMediaOrientation, @@ -49,6 +59,7 @@ import { newClap, newEntity, newSegment, + newWorkflow, // main input/output handlers parseClap, @@ -65,6 +76,7 @@ import { isValidNumber, parseMediaOrientation, parseOutputType, + parseWorkflowEngine, parseSegmentCategory, parseSegmentStatus, UUID, @@ -81,6 +93,15 @@ import { generateClapFromSimpleStory, getEmptyClap, removeGeneratedAssetUrls, + + // sanitizers + sanitizeEntities, + sanitizeEntity, + sanitizeMeta, + sanitizeSegment, + sanitizeSegments, + sanitizeWorkflow, + sanitizeWorkflows, } from "@aitube/clap" diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 52691cad..0703fbf1 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.30", + "version": "0.1.0", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", @@ -14,12 +14,12 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.2", - "rimraf": "^5.0.7", - "typescript": "^5.5.2" + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typescript": "^5.5.4" }, "peerDependencies": { - "yaml": "^2.4.5" + "yaml": "^2.5.0" }, "dependencies": { "pure-uuid": "^1.8.1" diff --git a/packages/aitube-clap/src/factories/index.ts b/packages/aitube-clap/src/factories/index.ts index 5b0085f8..a51443d7 100644 --- a/packages/aitube-clap/src/factories/index.ts +++ b/packages/aitube-clap/src/factories/index.ts @@ -1,3 +1,4 @@ export { newClap } from './newClap' export { newEntity } from './newEntity' export { newSegment } from './newSegment' +export { newWorkflow } from './newWorkflow' diff --git a/packages/aitube-clap/src/factories/newClap.ts b/packages/aitube-clap/src/factories/newClap.ts index dd2d3856..63367708 100644 --- a/packages/aitube-clap/src/factories/newClap.ts +++ b/packages/aitube-clap/src/factories/newClap.ts @@ -1,38 +1,26 @@ -import { ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment } from "@/types" -import { getValidNumber } from "@/utils/getValidNumber" -import { UUID } from "@/utils/uuid" +import { ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapWorkflow } from "@/types" import { buildEntityIndex } from "@/helpers/buildEntityIndex" -import { parseMediaOrientation } from "@/utils" +import { sanitizeMeta } from "@/sanitizers/sanitizeMeta" +import { sanitizeWorkflows } from "@/sanitizers/sanitizeWorkflows" +import { sanitizeEntities } from "@/sanitizers/sanitizeEntities" +import { sanitizeSegments } from "@/sanitizers/sanitizeSegments" // generate an empty clap file, or copy one from a source export function newClap(clap: { meta?: Partial + workflows?: ClapWorkflow[] entities?: ClapEntity[] scenes?: ClapScene[] segments?: ClapSegment[] } = {}): ClapProject { - const meta: ClapMeta = { - id: clap?.meta?.id === "string" ? clap.meta.id : UUID(), - title: clap?.meta?.title === "string" ? clap.meta.title : "", - description: typeof clap?.meta?.description === "string" ? clap.meta.description : "", - synopsis: typeof clap?.meta?.synopsis === "string" ? clap.meta.synopsis : "", - licence: typeof clap?.meta?.licence === "string" ? clap.meta.licence : "", - orientation: parseMediaOrientation(clap?.meta?.orientation), - durationInMs: getValidNumber(clap?.meta?.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), - width: getValidNumber(clap?.meta?.width, 256, 8192, 1024), - height: getValidNumber(clap?.meta?.height, 256, 8192, 576), - defaultVideoModel: typeof clap?.meta?.defaultVideoModel === "string" ? clap.meta.defaultVideoModel : "SVD", - extraPositivePrompt: Array.isArray(clap?.meta?.extraPositivePrompt) ? clap.meta.extraPositivePrompt : [], - screenplay: typeof clap?.meta?.screenplay === "string" ? clap.meta.screenplay : "", - isLoop: typeof clap?.meta?.isLoop === "boolean" ? clap.meta.isLoop : false, - isInteractive: typeof clap?.meta?.isInteractive === "boolean" ? clap.meta.isInteractive : false, - } + const meta = sanitizeMeta(clap?.meta) - const entities: ClapEntity[] = clap?.entities && Array.isArray(clap.entities) ? clap.entities : [] + const workflows: ClapWorkflow[] = clap?.workflows && Array.isArray(clap.workflows) ? sanitizeWorkflows(clap.workflows) : [] + const entities: ClapEntity[] = clap?.entities && Array.isArray(clap.entities) ? sanitizeEntities(clap.entities) : [] const scenes: ClapScene[] = clap?.scenes && Array.isArray(clap.scenes) ? clap.scenes : [] - const segments: ClapSegment[] = clap?.segments && Array.isArray(clap.segments) ? clap.segments : [] + const segments: ClapSegment[] = clap?.segments && Array.isArray(clap.segments) ? sanitizeSegments(clap.segments) : [] const entityIndex = buildEntityIndex(entities) - return { meta, entities, entityIndex, scenes, segments } + return { meta, workflows, entities, entityIndex, scenes, segments } } diff --git a/packages/aitube-clap/src/factories/newEntity.ts b/packages/aitube-clap/src/factories/newEntity.ts index dcc5f113..b5a68987 100644 --- a/packages/aitube-clap/src/factories/newEntity.ts +++ b/packages/aitube-clap/src/factories/newEntity.ts @@ -12,6 +12,7 @@ export function newEntity(maybeEntity?: Partial) { triggerName: typeof maybeEntity?.triggerName === "string" ? maybeEntity.triggerName : "", label: typeof maybeEntity?.label === "string" ? maybeEntity.label : "", description: typeof maybeEntity?.description === "string" ? maybeEntity.description : "", + tags: Array.isArray(maybeEntity?.tags) ? maybeEntity?.tags : [], author: typeof maybeEntity?.author === "string" ? maybeEntity.author : "", thumbnailUrl: typeof maybeEntity?.thumbnailUrl === "string" ? maybeEntity.thumbnailUrl : "", seed: isValidNumber(maybeEntity?.seed) ? (maybeEntity?.seed || 0) : generateSeed(), diff --git a/packages/aitube-clap/src/factories/newWorkflow.ts b/packages/aitube-clap/src/factories/newWorkflow.ts new file mode 100644 index 00000000..081bbc38 --- /dev/null +++ b/packages/aitube-clap/src/factories/newWorkflow.ts @@ -0,0 +1,21 @@ +import { ClapWorkflow, ClapWorkflowEngine } from "@/types" +import { parseWorkflowEngine } from "@/utils" +import { UUID } from "@/utils/uuid" + +export function newWorkflow(maybeWorkflow?: Partial) { + + const workflow: ClapWorkflow = { + id: typeof maybeWorkflow?.id === "string" ? maybeWorkflow.id : UUID(), + label: typeof maybeWorkflow?.label === "string" ? maybeWorkflow.label : "", + description: typeof maybeWorkflow?.description === "string" ? maybeWorkflow.description : "", + tags: Array.isArray(maybeWorkflow?.tags) ? maybeWorkflow?.tags : [], + author: typeof maybeWorkflow?.author === "string" ? maybeWorkflow.author : "", + thumbnailUrl: typeof maybeWorkflow?.thumbnailUrl === "string" ? maybeWorkflow.thumbnailUrl : "", + engine: parseWorkflowEngine(maybeWorkflow?.engine, ClapWorkflowEngine.DEFAULT), + data: typeof maybeWorkflow?.data === "string" ? maybeWorkflow.data : "", + inputFields: Array.isArray(maybeWorkflow?.inputFields) ? maybeWorkflow.inputFields : [], + inputValues: typeof maybeWorkflow?.inputValues === "object" ? maybeWorkflow.inputValues : {}, + } + + return workflow +} diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 275b5711..cb889a58 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -23,7 +23,17 @@ export { ClapTrack, ClapTracks, ClapVoice, - ClapCompletionMode + ClapCompletionMode, + + ClapInputFieldNumber, + ClapInputFieldString, + ClapInputFieldBoolean, + ClapInputFieldAny, + ClapInputFields, + ClapInputValue, + ClapInputValues, + ClapWorkflowEngine, + ClapWorkflow } from './types' export { defaultMediaOrientation @@ -31,7 +41,8 @@ export { export { newClap, newEntity, - newSegment + newSegment, + newWorkflow } from './factories' export { parseClap, @@ -48,6 +59,7 @@ export { isValidNumber, parseMediaOrientation, parseOutputType, + parseWorkflowEngine, parseSegmentCategory, parseSegmentStatus, UUID @@ -65,3 +77,12 @@ export { getEmptyClap, removeGeneratedAssetUrls, } from './helpers' +export { + sanitizeEntities, + sanitizeEntity, + sanitizeMeta, + sanitizeSegment, + sanitizeSegments, + sanitizeWorkflow, + sanitizeWorkflows, +} from './sanitizers' \ No newline at end of file diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/aitube-clap/src/io/parseClap.ts index 1ade7a9d..dce62f82 100644 --- a/packages/aitube-clap/src/io/parseClap.ts +++ b/packages/aitube-clap/src/io/parseClap.ts @@ -1,11 +1,12 @@ import YAML from "yaml" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat, ParseClapProgressUpdate } from "../types" -import { getValidNumber } from "../utils/getValidNumber" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat, ParseClapProgressUpdate, ClapWorkflow } from "../types" import { dataUriToBlob } from "../converters/dataUriToBlob" -import { UUID } from "@/utils/uuid" import { buildEntityIndex } from "@/helpers/buildEntityIndex" -import { parseMediaOrientation } from "@/utils" +import { sanitizeWorkflows } from "@/sanitizers/sanitizeWorkflows" +import { sanitizeEntities } from "@/sanitizers/sanitizeEntities" +import { sanitizeSegment } from "@/sanitizers/sanitizeSegment" +import { sanitizeMeta } from "@/sanitizers/sanitizeMeta" type StringOrBlob = string | Blob @@ -175,22 +176,7 @@ export async function parseClap( const maybeClapMeta = maybeArray[1] as ClapMeta - const clapMeta: ClapMeta = { - id: typeof maybeClapMeta.title === "string" ? maybeClapMeta.id : UUID(), - title: typeof maybeClapMeta.title === "string" ? maybeClapMeta.title : "", - description: typeof maybeClapMeta.description === "string" ? maybeClapMeta.description : "", - synopsis: typeof maybeClapMeta.synopsis === "string" ? maybeClapMeta.synopsis : "", - licence: typeof maybeClapMeta.licence === "string" ? maybeClapMeta.licence : "", - orientation: parseMediaOrientation(maybeClapMeta.orientation), - durationInMs: getValidNumber(maybeClapMeta.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), - width: getValidNumber(maybeClapMeta.width, 128, 8192, 1024), - height: getValidNumber(maybeClapMeta.height, 128, 8192, 576), - defaultVideoModel: typeof maybeClapMeta.defaultVideoModel === "string" ? maybeClapMeta.defaultVideoModel : "SVD", - extraPositivePrompt: Array.isArray(maybeClapMeta.extraPositivePrompt) ? maybeClapMeta.extraPositivePrompt : [], - screenplay: typeof maybeClapMeta.screenplay === "string" ? maybeClapMeta.screenplay : "", - isLoop: typeof maybeClapMeta.isLoop === "boolean" ? maybeClapMeta.isLoop : false, - isInteractive: typeof maybeClapMeta.isInteractive === "boolean" ? maybeClapMeta.isInteractive : false, - } + const clapMeta = sanitizeMeta(maybeClapMeta) /* in case we want to support streaming (mix of entities and segments etc), we could do it this way: @@ -205,74 +191,42 @@ export async function parseClap( }) */ - + const expectedNumberOfWorkflows = maybeClapHeader.numberOfWorkflows || 0 const expectedNumberOfEntities = maybeClapHeader.numberOfEntities || 0 const expectedNumberOfScenes = maybeClapHeader.numberOfScenes || 0 + + // unused for now, but this can of information can be used by lower-level languages eg. C const expectedNumberOfSegments = maybeClapHeader.numberOfSegments || 0 // note: we assume the order is strictly enforced! // if you implement streaming (mix of entities and segments) you will have to rewrite this! const afterTheHeaders = 2 - const afterTheEntities = afterTheHeaders + expectedNumberOfEntities + + const afterTheWorkflows = afterTheHeaders + expectedNumberOfWorkflows + + const afterTheEntities = afterTheWorkflows + expectedNumberOfEntities const afterTheScenes = afterTheEntities + expectedNumberOfScenes + // note: if there are no expected workflows, maybeWorkflows will be empty + const maybeWorkflows = maybeArray.slice(afterTheHeaders, afterTheWorkflows) as ClapWorkflow[] + // note: if there are no expected entities, maybeEntities will be empty - const maybeEntities = maybeArray.slice(afterTheHeaders, afterTheEntities) as ClapEntity[] + const maybeEntities = maybeArray.slice(afterTheWorkflows, afterTheEntities) as ClapEntity[] // note: if there are no expected scenes, maybeScenes will be empty const maybeScenes = maybeArray.slice(afterTheEntities, afterTheScenes) as ClapScene[] const maybeSegments = maybeArray.slice(afterTheScenes) as ClapSegment[] - await onProgressUpdate({ value: 60, message: "Importing entities from .clap file.." }) + await onProgressUpdate({ value: 60, message: "Importing workflows from .clap file.." }) + const clapWorkflows = sanitizeWorkflows(maybeWorkflows) - const clapEntities: ClapEntity[] = maybeEntities.map(({ - id, - category, - triggerName, - label, - description, - author, - thumbnailUrl, - seed, - imagePrompt, - imageSourceType, - imageEngine, - imageId, - audioPrompt, - audioSourceType, - audioEngine, - audioId, - age, - gender, - region, - appearance, - }) => ({ - // TODO: we should verify each of those, probably - id, - category, - triggerName, - label, - description, - author, - thumbnailUrl, - seed, - imagePrompt, - imageSourceType, - imageEngine, - imageId, - audioPrompt, - audioSourceType, - audioEngine, - audioId, - age, - gender, - region, - appearance, - })) - await onProgressUpdate({ value: 70, message: "Importing scenes from .clap file.." }) + await onProgressUpdate({ value: 70, message: "Importing entities from .clap file.." }) + const clapEntities = sanitizeEntities(maybeEntities) + + await onProgressUpdate({ value: 80, message: "Importing scenes from .clap file.." }) const clapScenes: ClapScene[] = maybeScenes.map(({ id, @@ -297,74 +251,25 @@ export async function parseClap( endAtLine, events: events.map(e => e) })) - await onProgressUpdate({ value: 80, message: "Importing segments from .clap file.." }) + await onProgressUpdate({ value: 90, message: "Importing segments from .clap file.." }) - const clapSegments: ClapSegment[] = maybeSegments.map(({ - id, - track, - startTimeInMs, - endTimeInMs, - category, - entityId, - sceneId, - startTimeInLines, - endTimeInLines, - prompt, - label, - outputType, - renderId, - status, - assetUrl, - assetDurationInMs, - assetSourceType, - assetFileFormat, - revision, - createdAt, - createdBy, - editedBy, - outputGain, - seed, - }) => { - if (endTimeInMs > clapMeta.durationInMs) { - clapMeta.durationInMs = endTimeInMs - } - return { - // TODO: we should verify each of those, probably - id, - track, - startTimeInMs, - endTimeInMs, - category, - entityId, - sceneId, - startTimeInLines, - endTimeInLines, - prompt, - label, - outputType, - renderId, - status, - assetUrl, - assetDurationInMs, - assetSourceType, - assetFileFormat, - revision, - createdAt, - createdBy, - editedBy, - outputGain, - seed, + const clapSegments: ClapSegment[] = maybeSegments.map(maybeSegment => { + const segment = sanitizeSegment(maybeSegment) + if (segment.endTimeInMs > clapMeta.durationInMs) { + clapMeta.durationInMs = segment.endTimeInMs } + return segment }) if (debug) { - console.log(`parseClap: successfully parsed ${clapEntities.length} entities, ${clapScenes.length} scenes and ${clapSegments.length} segments`) + console.log(`parseClap: successfully parsed ${clapWorkflows.length} workflows, ${clapEntities.length} entities, ${clapScenes.length} scenes and ${clapSegments.length} segments`) } await onProgressUpdate({ value: 100, message: "Buiding entity index.." }) return { meta: clapMeta, + workflows: clapWorkflows, entities: clapEntities, entityIndex: buildEntityIndex(clapEntities), scenes: clapScenes, diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index 21b0b6ce..d2898f8c 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -2,62 +2,25 @@ import YAML from "yaml" import { getValidNumber } from "@/utils/getValidNumber" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat } from "@/types" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat, ClapWorkflow, ClapWorkflowEngine } from "@/types" import { UUID } from "@/utils/uuid" import { parseMediaOrientation } from "@/utils/parseMediaOrientation" +import { isValidNumber, parseWorkflowEngine } from "@/utils" +import { sanitizeWorkflows } from "@/sanitizers/sanitizeWorkflows" +import { sanitizeEntities } from "@/sanitizers/sanitizeEntities" +import { sanitizeSegments } from "@/sanitizers/sanitizeSegments" +import { sanitizeMeta } from "@/sanitizers/sanitizeMeta" export async function serializeClap({ meta, // ClapMeta + workflows, // ClapWorkflow[] entities, // ClapEntity[] scenes, // ClapScene[] segments, // ClapSegment[] }: ClapProject): Promise { - // we play it safe, and we verify the structure of the parameters, - // to make sure we generate a valid clap file - const clapEntities: ClapEntity[] = entities.map(({ - id, - category, - triggerName, - label, - description, - author, - thumbnailUrl, - seed, - imagePrompt, - imageSourceType, - imageEngine, - imageId, - audioPrompt, - audioSourceType, - audioEngine, - audioId, - age, - gender, - region, - appearance, - }) => ({ - id, - category, - triggerName, - label, - description, - author, - thumbnailUrl, - seed, - imagePrompt, - imageSourceType, - imageEngine, - imageId, - audioPrompt, - audioSourceType, - audioEngine, - audioId, - age, - gender, - region, - appearance, - })) + const clapWorkflows = sanitizeWorkflows(workflows) + const clapEntities = sanitizeEntities(entities) const clapScenes: ClapScene[] = scenes.map(({ id, @@ -83,81 +46,17 @@ export async function serializeClap({ events: events.map(e => e) })) - const clapSegments: ClapSegment[] = segments.map(({ - id, - track, - startTimeInMs, - endTimeInMs, - category, - entityId, - sceneId, - startTimeInLines, - endTimeInLines, - prompt, - label, - outputType, - renderId, - status, - assetUrl, - assetDurationInMs, - assetSourceType, - assetFileFormat, - revision, - createdAt, - createdBy, - editedBy, - outputGain, - seed, - }) => ({ - id, - track, - startTimeInMs, - endTimeInMs, - category, - entityId, - sceneId, - startTimeInLines, - endTimeInLines, - prompt, - label, - outputType, - renderId, - status, - assetUrl, - assetDurationInMs, - assetSourceType, - assetFileFormat, - revision, - createdAt, - createdBy, - editedBy, - outputGain, - seed, - })) + const clapSegments = sanitizeSegments(segments) const clapHeader: ClapHeader = { format: ClapFormat.CLAP_0, - numberOfEntities: clapEntities.length, - numberOfScenes: clapScenes.length, - numberOfSegments: clapSegments.length, + numberOfWorkflows: isValidNumber(clapWorkflows?.length) ? clapWorkflows.length : 0, + numberOfEntities: isValidNumber(clapEntities.length) ? clapEntities.length : 0, + numberOfScenes: isValidNumber(clapScenes.length) ? clapScenes.length : 0, + numberOfSegments: isValidNumber(clapSegments.length) ? clapSegments.length : 0, } - const clapMeta: ClapMeta = { - id: meta.id || UUID(), - title: typeof meta.title === "string" ? meta.title : "Untitled", - description: typeof meta.description === "string" ? meta.description : "", - synopsis: typeof meta.synopsis === "string" ? meta.synopsis : "", - licence: typeof meta.licence === "string" ? meta.licence : "", - orientation: parseMediaOrientation(meta.orientation), - durationInMs: getValidNumber(meta.durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), - width: getValidNumber(meta.width, 256, 8192, 1024), - height: getValidNumber(meta.height, 256, 8192, 576), - defaultVideoModel: typeof meta.defaultVideoModel === "string" ? meta.defaultVideoModel : "SVD", - extraPositivePrompt: Array.isArray(meta.extraPositivePrompt) ? meta.extraPositivePrompt : [], - screenplay: typeof meta.screenplay === "string" ? meta.screenplay : "", - isLoop: typeof meta.screenplay === "boolean" ? meta.screenplay : false, - isInteractive: typeof meta.isInteractive === "boolean" ? meta.isInteractive : false, - } + const clapMeta = sanitizeMeta(meta) const entries = [ clapHeader, diff --git a/packages/aitube-clap/src/sanitizers/index.ts b/packages/aitube-clap/src/sanitizers/index.ts new file mode 100644 index 00000000..6cf2b0f5 --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/index.ts @@ -0,0 +1,7 @@ +export { sanitizeEntities } from "./sanitizeEntities" +export { sanitizeEntity } from "./sanitizeEntity" +export { sanitizeMeta } from "./sanitizeMeta" +export { sanitizeSegment } from "./sanitizeSegment" +export { sanitizeSegments } from "./sanitizeSegments" +export { sanitizeWorkflow } from "./sanitizeWorkflow" +export { sanitizeWorkflows } from "./sanitizeWorkflows" \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeEntities.ts b/packages/aitube-clap/src/sanitizers/sanitizeEntities.ts new file mode 100644 index 00000000..78774c34 --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeEntities.ts @@ -0,0 +1,6 @@ +import { ClapEntity } from "@/types"; +import { sanitizeEntity } from "./sanitizeEntity"; + +export function sanitizeEntities(maybeEntities: ClapEntity[] = []): ClapEntity[] { + return maybeEntities.map(entity => sanitizeEntity(entity)) +} \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeEntity.ts b/packages/aitube-clap/src/sanitizers/sanitizeEntity.ts new file mode 100644 index 00000000..1b2734e5 --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeEntity.ts @@ -0,0 +1,54 @@ +import { ClapAssetSource, ClapEntity, ClapEntityAppearance, ClapEntityAudioEngine, ClapEntityGender, ClapEntityRegion } from "@/types"; +import { generateSeed, isValidNumber, parseSegmentCategory, UUID } from "@/utils"; + +export function sanitizeEntity({ + id, + category, + triggerName, + label, + description, + tags, + author, + thumbnailUrl, + seed, + imagePrompt, + imageSourceType, + imageEngine, + imageId, + audioPrompt, + audioSourceType, + audioEngine, + audioId, + age, + gender, + region, + appearance, + }: Partial = {}): ClapEntity { + return { + id: typeof id === "string" ? id : UUID(), + category: parseSegmentCategory(category), + triggerName: typeof triggerName === "string" ? triggerName : "", + label: typeof label === "string" ? label : "", + description: typeof description === "string" ? description : "", + tags: Array.isArray(tags) ? tags : [], + author: typeof author === "string" ? author : "", + thumbnailUrl: typeof thumbnailUrl === "string" ? thumbnailUrl : "", + seed: isValidNumber(seed) ? (seed || 0) : generateSeed(), + imagePrompt: typeof imagePrompt === "string" ? imagePrompt : "", + imageSourceType: typeof imageSourceType === "string" ? (imageSourceType as ClapAssetSource) : ClapAssetSource.EMPTY, + imageEngine: typeof imageEngine === "string" ? imageEngine : "", + imageId: typeof imageId === "string" ? imageId : "", + audioPrompt: typeof audioPrompt === "string" ? audioPrompt : "", + audioSourceType: typeof audioSourceType === "string" ? (audioSourceType as ClapAssetSource) : ClapAssetSource.EMPTY, + audioEngine: typeof audioEngine === "string" ? (audioEngine as ClapEntityAudioEngine) : "Parler-TTS", + audioId: typeof audioId === "string" ? audioId : "", + // those are only used by certain types of entities + age: isValidNumber(age) ? (age || 0) : 25, + + // TODO find a way to validate those, using lists + // TODO: we are going to use `variant: ClapEntityVariant` instead, which is gonna be an arbitrary string + gender: typeof gender === "string" ? (gender as ClapEntityGender) : "object", + region: typeof region === "string" ? (region as ClapEntityRegion) : "global", + appearance: typeof appearance === "string" ? (appearance as ClapEntityAppearance) : "neutral", + } +} \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeMeta.ts b/packages/aitube-clap/src/sanitizers/sanitizeMeta.ts new file mode 100644 index 00000000..59bc58d5 --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeMeta.ts @@ -0,0 +1,40 @@ +import { ClapMeta } from "@/types"; +import { getValidNumber, parseMediaOrientation, UUID } from "@/utils"; + +export function sanitizeMeta({ + id, + title, + description, + synopsis, + licence, + tags, + thumbnailUrl, + orientation, + durationInMs, + width, + height, + defaultVideoModel, + extraPositivePrompt, + screenplay, + isLoop, + isInteractive, +}: Partial = {}): ClapMeta { + return { + id: typeof id === "string" ? id : UUID(), + title: typeof title === "string" ? title : "", + description: typeof description === "string" ? description : "", + synopsis: typeof synopsis === "string" ? synopsis : "", + licence: typeof licence === "string" ? licence : "", + tags: Array.isArray(tags) ? tags : [], + thumbnailUrl: typeof thumbnailUrl === "string" ? thumbnailUrl : "", + orientation: parseMediaOrientation(orientation), + durationInMs: getValidNumber(durationInMs, 1000, Number.MAX_SAFE_INTEGER, 4000), + width: getValidNumber(width, 128, 8192, 1024), + height: getValidNumber(height, 128, 8192, 576), + defaultVideoModel: typeof defaultVideoModel === "string" ? defaultVideoModel : "SVD", + extraPositivePrompt: Array.isArray(extraPositivePrompt) ? extraPositivePrompt : [], + screenplay: typeof screenplay === "string" ? screenplay : "", + isLoop: typeof isLoop === "boolean" ? isLoop : false, + isInteractive: typeof isInteractive === "boolean" ? isInteractive : false, + } +} \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts b/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts new file mode 100644 index 00000000..14bb76b6 --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts @@ -0,0 +1,56 @@ +import { ClapAssetSource, ClapOutputType, ClapSegment, ClapSegmentStatus } from "@/types" +import { generateSeed, isValidNumber, parseOutputType, parseSegmentCategory, UUID } from "@/utils" + +export function sanitizeSegment({ + id, + track, + startTimeInMs, + endTimeInMs, + category, + entityId, + sceneId, + startTimeInLines, + endTimeInLines, + prompt, + label, + outputType, + renderId, + status, + assetUrl, + assetDurationInMs, + assetSourceType, + assetFileFormat, + revision, + createdAt, + createdBy, + editedBy, + outputGain, + seed, + }: Partial = {}): ClapSegment { + return { + id: typeof id === "string" ? id : UUID(), + track: isValidNumber(track) ? (track || 0) : 0, + startTimeInMs: isValidNumber(startTimeInMs) ? (startTimeInMs || 0) : 0, + endTimeInMs: isValidNumber(assetDurationInMs) ? (endTimeInMs || 0) : 0, + category: parseSegmentCategory(category), + entityId: typeof entityId === "string" ? entityId : "", + sceneId: typeof sceneId === "string" ? sceneId : "", + startTimeInLines: isValidNumber(startTimeInLines) ? (startTimeInLines || 0) : 0, + endTimeInLines: isValidNumber(endTimeInLines) ? (endTimeInLines || 0) : 0, + prompt: typeof prompt === "string" ? prompt : "", + label: typeof label === "string" ? label : "", + outputType: parseOutputType(outputType, ClapOutputType.TEXT), + renderId: typeof renderId === "string" ? renderId : "", + status: typeof status === "string" ? status : ClapSegmentStatus.TO_GENERATE, + assetUrl: typeof assetUrl === "string" ? assetUrl : "", + assetDurationInMs: isValidNumber(assetDurationInMs) ? (assetDurationInMs || 0) : 0, + assetSourceType: typeof assetSourceType === "string" ? assetSourceType : ClapAssetSource.EMPTY, + assetFileFormat: typeof assetFileFormat === "string" ? assetFileFormat : "", + revision: isValidNumber(revision) ? (revision || 0) : 0, + createdAt: typeof createdAt === "string" ? createdAt : new Date().toISOString(), + createdBy: typeof createdBy === "string" ? createdBy : "ai", + editedBy: typeof editedBy === "string" ? editedBy : "ai", + outputGain: isValidNumber(outputGain) ? (outputGain || 0) : 0, + seed: isValidNumber(seed) ? (seed || 0) : generateSeed() + } +} \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeSegments.ts b/packages/aitube-clap/src/sanitizers/sanitizeSegments.ts new file mode 100644 index 00000000..a84e5b6d --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeSegments.ts @@ -0,0 +1,6 @@ +import { ClapSegment } from "@/types"; +import { sanitizeSegment } from "./sanitizeSegment"; + +export function sanitizeSegments(maybeSegments: ClapSegment[] = []): ClapSegment[] { + return maybeSegments.map(segment => sanitizeSegment(segment)) +} \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts b/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts new file mode 100644 index 00000000..fcf2984c --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts @@ -0,0 +1,28 @@ +import { ClapWorkflow, ClapWorkflowEngine } from "@/types"; +import { parseWorkflowEngine, UUID } from "@/utils"; + +export function sanitizeWorkflow({ + id, + label, + description, + tags, + author, + thumbnailUrl, + engine, + data, + inputFields, + inputValues, + }: Partial = {}): ClapWorkflow { + return { + id: typeof id === "string" ? id : UUID(), + label: typeof label === "string" ? label : "", + description: typeof description === "string" ? description : "", + tags: Array.isArray(tags) ? tags : [], + author: typeof author === "string" ? author : "", + thumbnailUrl: typeof thumbnailUrl === "string" ? thumbnailUrl : "", + engine: parseWorkflowEngine(engine, ClapWorkflowEngine.DEFAULT), + data: typeof data === "string" ? data : "", + inputFields: Array.isArray(inputFields) ? inputFields : [], + inputValues: typeof inputValues === "object" ? inputValues : {}, + } +} \ No newline at end of file diff --git a/packages/aitube-clap/src/sanitizers/sanitizeWorkflows.ts b/packages/aitube-clap/src/sanitizers/sanitizeWorkflows.ts new file mode 100644 index 00000000..03c31064 --- /dev/null +++ b/packages/aitube-clap/src/sanitizers/sanitizeWorkflows.ts @@ -0,0 +1,6 @@ +import { ClapWorkflow } from "@/types"; +import { sanitizeWorkflow } from "./sanitizeWorkflow"; + +export function sanitizeWorkflows(maybeWorkflows: ClapWorkflow[] = []): ClapWorkflow[] { + return maybeWorkflows.map(workflow => sanitizeWorkflow(workflow)) +} \ No newline at end of file diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index c4b2f4ae..58e8111f 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -1,136 +1,150 @@ export enum ClapFormat { - // the current active version - // as long as the Clap format is not "standardized" - // we will stay in clap-0 CLAP_0 = "clap-0", - // reserved for future use - // CLAP_1 = "clap-1" + // current active version, where some enums have uppercased, + // and some extract things added + CLAP_0b = "clap-0b", } export enum ClapSegmentCategory { // a 3D Gaussian Splatting object (eg. a .splatv) - SPLAT = "splat", + SPLAT = "SPLAT", // a 3D mesh object - MESH = "mesh", + MESH = "MESH", // a depth map - DEPTH = "depth", + DEPTH = "DEPTH", + + // a transformative effect and/or filter to apply to an input + // eg. upscaling, face swap.. + EFFECT = "EFFECT", // a event happening in the scene - EVENT = "event", + EVENT = "EVENT", // a user interface element, such as an overlay or caption, or HTML content - INTERFACE = "interface", + INTERFACE = "INTERFACE", // a phenomenom triggering changes in the scene - PHENOMENON = "phenomenon", + PHENOMENON = "PHENOMENON", // a video clip, eg. mp4 or webm // it is strongly recommended to use an open and royalty-free codec such as VP9, // otherwise some web browsers might not be able to display it - VIDEO = "video", + VIDEO = "VIDEO", // a storyboard image, eg. jpg, png, webp, heic (note: most of the apps compatible with .clap prefer to work with jpg and png) - STORYBOARD = "storyboard", + STORYBOARD = "STORYBOARD", // a transition between two shots (eg. a cross-fade) - TRANSITION = "transition", + TRANSITION = "TRANSITION", // a character (person, animal, alien, robot, walking skeleton..) - CHARACTER = "character", + CHARACTER = "CHARACTER", // a location (indoor or outdoor eg. a house, castle, garden..) - LOCATION = "location", + LOCATION = "LOCATION", // the absolute time where the action takes place // // this can be anything that a language model or stable diffusion model can interpret, eg: - // eg. "today at 12am", "2024-01-01", "contemporary times", "14th century", 1960, "AB 31", "20 BC" + // eg. "today at 12am", "2024-01-01", "contemporary times, in the morning", "14th century, in the afternoon", 1960, "AB 31, 11pm", "20 BC" // // ideally you should use a date formatting indicating the hour and timezone (if your LLM can understand those) // that way it will be possible to automatically determine if it's day or night! - TIME = "time", + TIME = "TIME", // @deprecated - we should use TIME instead - ERA = "era", + ERA = "ERA", // how to lit the scene, colors, angles etc - LIGHTING = "lighting", + LIGHTING = "LIGHTING", // weather conditions in the scene (raining, sunny, cloudy, morning mist..) - WEATHER = "weather", + WEATHER = "WEATHER", // direct description of what is happening in the scene ("people talking", "bus passing by", "putting down the glass") - ACTION = "action", + ACTION = "ACTION", // some music // like for all segments you can either give a prompt and/or work with an actual file (in the case mp3 or wav) - MUSIC = "music", + MUSIC = "MUSIC", // some sound // eg. "dog barking", "foot steps", "crowded bar" - SOUND = "sound", + SOUND = "SOUND", // a dialogue line // either the transcript and/or the generated TTS line - DIALOGUE = "dialogue", + DIALOGUE = "DIALOGUE", // a specific style to apply // "cinematic", "1950s comic book", "Panavision 70 mm" - STYLE = "style", + STYLE = "STYLE", // type of shot eg "medium-shot", aperture, ISO.. - CAMERA = "camera", + CAMERA = "CAMERA", // ..anything else, from prompt to arbitrary/custom/obscure file format // // however if you have a special demand, something that could be popular and not too niche, // we can turn it into its own category - GENERIC = "generic" + GENERIC = "GENERIC" } export enum ClapMediaOrientation { - LANDSCAPE = "landscape", - PORTRAIT = "portrait", - SQUARE = "square" + LANDSCAPE = "LANDSCAPE", + PORTRAIT = "PORTRAIT", + SQUARE = "SQUARE" } export enum ClapOutputType { // a plain text - TEXT = "text", + TEXT = "TEXT", - // an animation (not used) - ANIMATION = "animation", + // an animation + ANIMATION = "ANIMATION", // UI element - INTERFACE = "interface", + INTERFACE = "INTERFACE", // event - EVENT = "event", + EVENT = "EVENT", - PHENOMENON = "phenomenon", + PHENOMENON = "PHENOMENON", - TRANSITION = "transition", + TRANSITION = "TRANSITION", // image asset - IMAGE = "image", + IMAGE = "IMAGE", + + // image segmentation layer + IMAGE_SEGMENTATION = "IMAGE_SEGMENTATION", + + // image depthmap layer + IMAGE_DEPTH = "IMAGE_DEPTH", // video asset - VIDEO = "video", + VIDEO = "VIDEO", + + // video segmentation layer + VIDEO_SEGMENTATION = "VIDEO_SEGMENTATION", + + // image depthmap layer + VIDEO_DEPTH = "VIDEO_DEPTH", // audio asset - AUDIO = "audio" + AUDIO = "AUDIO" } export enum ClapSegmentStatus { - TO_GENERATE = "to_generate", - IN_PROGRESS = "in_progress", - TO_INTERPOLATE = "to_interpolate", - TO_UPSCALE = "to_upscale", - COMPLETED = "completed", - ERROR = "error", + TO_GENERATE = "TO_GENERATE", + IN_PROGRESS = "IN_PROGRESS", + TO_INTERPOLATE = "TO_INTERPOLATE", + TO_UPSCALE = "TO_UPSCALE", + COMPLETED = "COMPLETED", + ERROR = "ERROR", } export type ClapAuthor = @@ -229,6 +243,7 @@ export type ClapVoice = { export type ClapHeader = { format: ClapFormat + numberOfWorkflows: number numberOfEntities: number numberOfScenes: number numberOfSegments: number @@ -240,6 +255,20 @@ export type ClapMeta = { description: string synopsis: string licence: string + + /** + * List of keywords used to describe the project. + * + * Examples: action, sci-fi, romance, advert, music video, + */ + tags: string[] + + /** + * A thumbnail representing the project. + * + * Can be hosted on a remote server or in base64 + */ + thumbnailUrl: string orientation: ClapMediaOrientation @@ -313,26 +342,240 @@ export type ClapSegment = { seed: number } -// TODO: this class name is too confusing, -// we should rename it to ClapEntity +export type ClapInputFieldNumber = { + type: 'number' + minValue: number + maxValue: number + defaultValue: number +} + +export type ClapInputFieldString = { + type: 'string' + allowedValues: string[] + defaultValue: string +} + +export type ClapInputFieldBoolean = { + type: 'boolean' + defaultValue: boolean +} + +export type ClapInputFieldAny = { + type: 'any' + defaultValue: any +} + +export type ClapInputField = { + /** + * Machine readable input field name or identifier + */ + id: string + + /** + * Human-readable input field name + */ + label: string + + /** + * Description of what the input field does + */ + description: string +} & ( + | ClapInputFieldNumber + | ClapInputFieldString + | ClapInputFieldBoolean + | ClapInputFieldAny +) + +export type ClapInputFields = ClapInputField[] + +export type ClapInputValue = + number | string | boolean | string[] | number[] | null | undefined + +export type ClapInputValues = + Record + +export enum ClapWorkflowEngine { + // the default pipeline (can be anything, this is left to the app developer) + DEFAULT = "DEFAULT", + + // the JSON format used by ComfyUI + COMFYUI_WORKFLOW = "COMFYUI_WORKFLOW", + + // the proprietary format used by Fal.ai + // Fal.ai also supports ComfyUI workflows, but this is separate + FALAI_WORKFLOW = "FALAI_WORKFLOW", + + // the proprietary format used by Glif + // Glif also supports ComfyUI workflows, but as part of a Glif workflow + GLIF_WORKFLOW = "GLIF_WORKFLOW", + + // the format used by Google Visual Blocks + // this is a new and experimental tool, usage is limited for now, + // I think it can be used in a Colab only and there are now API + VISUALBLOCKS_WORKFLOW = "VISUALBLOCKS_WORKFLOW" +} + +export type ClapWorkflow = { + id: string + + /** + * Human-readable label (this is the name or title of the workflow) + */ + label: string + + /** + * Long description of what the workflow is about. + */ + description: string + + /** + * List of keywords used to describe the workflow. + * + * Examples: upscaling, lip-sync, body animation, text-to-video.. + */ + tags: string[] + + /** + * The original author of the workflow + * + * Can be a name, email, social media handle.. + */ + author: string + + /** + * A thumbnail representing the workflow. + * + * Can be hosted on a remote server or in base64 + * (we could use a "ClapAssetSource" here too, but the thumbnail is not + * used within a workflow so there is no need to do any kind of precise optimization or verification here) + */ + thumbnailUrl: string + + engine: ClapWorkflowEngine + + /** + * The workflow data itself + * + * This is typically a serialized JSON, although this can be other things + * depending on which engine is used (YAML, base64, or even an ID to a proprietary commercial platform) + */ + data: string + + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: ClapInputFields + + /** + * Default values (this is used to initialize the workflow automatically) + */ + inputValues: ClapInputValues +} + export type ClapEntity = { id: string category: ClapSegmentCategory + + /** + * keyword referencing the entity within a screenplay + * + * Typically in UPPERCASE + */ triggerName: string + + /** + * Human-readable label (this is the name or title of the entity) + */ label: string + + /** + * Long description of what the entity is about. + * + * This can be for instance a short history or biography of the entity. + */ description: string + + /** + * List of keywords used to describe the entity. + * + * Examples: location, character, male, female, car.. + */ + tags: string[] + + /** + * The original author of the entity + * + * Can be a name, email, social media handle.. + */ author: string + + /** + * A thumbnail representing the entity. + * + * Can be hosted on a remote server or in base64 + * (we could use a "ClapAssetSource" here too, but the thumbnail is not + * used within a workflow so there is no need to do any kind of precise optimization or verification here) + */ thumbnailUrl: string + + /** + * The seed associated with the entity. + * + * This can be used to reproduce the settings (eg. reproduce the image + * from the image prompt, by re-using the same seed) + */ seed: number + /** + * Text prompt describing the appearance of the entity + */ imagePrompt: string + + /** + * Where the image is hosted (remote, local file etc) + */ imageSourceType: ClapAssetSource + + /** + * Can be used to tell the model used to generate the engine (eg. SDXL, Dalle-3) + */ imageEngine: string + + /** + * The "identity picture" of the entity + * + * if this is too confusing to people, we can rename it + * + * this is a regular URI so, it can be a file path, a remote url, a base64.. + */ imageId: string + + /** + * Text prompt describing the voice + * + * Eg. "low quality phone recording of an old man" + */ audioPrompt: string + + /** + * Where the audio is hosted (remote, local file etc) + */ audioSourceType: ClapAssetSource + + /** + * The engine used to generate the audio + * + * This is important as this impacts what is the vendor and type audioId + */ audioEngine: ClapEntityAudioEngine + + /** + * The voice identity (the "identity picture" equivalent of the voice) + * + * Depending on the engine, this can be a voice sample or an ID to a 3rd party proprietary platform + */ audioId: string // could be replaced by an inceptionDate, so it can be used to compute the absolute "age" of anything: @@ -370,6 +613,7 @@ export type ClapTracks = ClapTrack[] export type ClapProject = { meta: ClapMeta + workflows: ClapWorkflow[] entities: ClapEntity[] entityIndex: Record scenes: ClapScene[] @@ -383,27 +627,27 @@ export enum ClapCompletionMode { * This is a very convenient and simple mode, but it is also very ineficient, * so it should not be used for intensive applications. */ - FULL = "full", + FULL = "FULL", /** * the API and the client will return a partial clap file containing only the changes, * containing only the new values and changes. * This is useful for real-time applications and streaming. */ - PARTIAL = "partial", + PARTIAL = "PARTIAL", /** * the API will return a partial clap file containing only the changes, * and the client will return a merge of the original with the new values. * This is safe to run, there are no side-effects. */ - MERGE = "merge", + MERGE = "MERGE", /** * the API will return a partial clap file, and the client will replace the original. * This is the most efficient mode, but it relies on side-effects and inline object updates. */ - REPLACE = "replace" + REPLACE = "REPLACE" } export type ParseClapProgressUpdate = ({ diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index b754525b..aacc3939 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -8,4 +8,5 @@ export { parseMediaOrientation } from './parseMediaOrientation' export { parseOutputType } from './parseOutputType' export { parseSegmentCategory } from './parseSegmentCategory' export { parseSegmentStatus } from './parseSegmentStatus' +export { parseWorkflowEngine } from './parseWorkflowEngine' export { UUID } from './uuid' \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseMediaOrientation.ts b/packages/aitube-clap/src/utils/parseMediaOrientation.ts index 67f6b595..ae000ebb 100644 --- a/packages/aitube-clap/src/utils/parseMediaOrientation.ts +++ b/packages/aitube-clap/src/utils/parseMediaOrientation.ts @@ -12,25 +12,25 @@ export function parseMediaOrientation(input: any, defaultToUse?: ClapMediaOrient let orientation: ClapMediaOrientation = defaultToUse || defaultMediaOrientation - unknownString = unknownString.toLowerCase() + unknownString = unknownString.toUpperCase() if ( - unknownString === "landscape" || - unknownString === "horizontal" + unknownString === "LANDSCAPE" || + unknownString === "HORIZONTAL" ) { orientation = ClapMediaOrientation.LANDSCAPE } if ( - unknownString === "portrait" || - unknownString === "vertical" || - unknownString === "mobile" + unknownString === "PORTRAIT" || + unknownString === "VERTICAL" || + unknownString === "MOBILE" ) { orientation = ClapMediaOrientation.PORTRAIT } if ( - unknownString === "square" + unknownString === "SQUARE" ) { orientation = ClapMediaOrientation.PORTRAIT } diff --git a/packages/aitube-clap/src/utils/parseOutputType.ts b/packages/aitube-clap/src/utils/parseOutputType.ts index d971cd08..a9a7d8ac 100644 --- a/packages/aitube-clap/src/utils/parseOutputType.ts +++ b/packages/aitube-clap/src/utils/parseOutputType.ts @@ -1,13 +1,61 @@ import { ClapOutputType } from "@/types" export function parseOutputType(input: any, defaultToUse?: ClapOutputType): ClapOutputType { - - let unknownString = `${input || ""}`.trim() || (defaultToUse || ClapOutputType.TEXT) + + let unknownString = `${input || ""}`.trim() // the "normal" case if (Object.values(ClapOutputType).includes(unknownString as ClapOutputType)) { return unknownString as ClapOutputType } - throw new Error(`unsupported output type "${unknownString}"`) + let output: ClapOutputType = defaultToUse || ClapOutputType.TEXT + + // sometimes we want to use a LLM to generate the categories, + // but those aren't very precise and can hallucinate + // for instance they like to use plural + // so we need to be a bit flexible in how we detect those + + unknownString = unknownString.toUpperCase() + + if (unknownString === "TEXT") { + output = ClapOutputType.TEXT + } + else if (unknownString === "ANIMATION") { + output = ClapOutputType.ANIMATION + } + else if (unknownString === "INTERFACE") { + output = ClapOutputType.INTERFACE + } + else if (unknownString === "EVENT") { + output = ClapOutputType.EVENT + } + else if (unknownString === "PHENOMENON") { + output = ClapOutputType.PHENOMENON + } + else if (unknownString === "TRANSITION") { + output = ClapOutputType.TRANSITION + } + else if (unknownString === "IMAGE") { + output = ClapOutputType.IMAGE + } + else if (unknownString === "IMAGE_SEGMENTATION") { + output = ClapOutputType.IMAGE_SEGMENTATION + } + else if (unknownString === "IMAGE_DEPTH") { + output = ClapOutputType.IMAGE_DEPTH + } + else if (unknownString === "VIDEO") { + output = ClapOutputType.VIDEO + } + else if (unknownString === "VIDEO_SEGMENTATION") { + output = ClapOutputType.VIDEO_SEGMENTATION + } + else if (unknownString === "VIDEO_DEPTH") { + output = ClapOutputType.VIDEO_DEPTH + } + else if (unknownString === "AUDIO") { + output = ClapOutputType.AUDIO + } + return output } \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseSegmentCategory.ts b/packages/aitube-clap/src/utils/parseSegmentCategory.ts index 7029a8a1..b909725b 100644 --- a/packages/aitube-clap/src/utils/parseSegmentCategory.ts +++ b/packages/aitube-clap/src/utils/parseSegmentCategory.ts @@ -27,6 +27,9 @@ export function parseSegmentCategory(input: any, defaultCategory?: ClapSegmentCa else if (unknownString === "depth" || unknownString === "depthmap" || unknownString === "depth map") { category = ClapSegmentCategory.DEPTH } + else if (unknownString === "effect") { + category = ClapSegmentCategory.EFFECT + } else if (unknownString === "event" || unknownString === "events") { category = ClapSegmentCategory.EVENT } diff --git a/packages/aitube-clap/src/utils/parseWorkflowEngine.ts b/packages/aitube-clap/src/utils/parseWorkflowEngine.ts new file mode 100644 index 00000000..7c2feb04 --- /dev/null +++ b/packages/aitube-clap/src/utils/parseWorkflowEngine.ts @@ -0,0 +1,37 @@ +import { ClapWorkflowEngine } from "@/types" + +export function parseWorkflowEngine(input: any, defaultToUse?: ClapWorkflowEngine): ClapWorkflowEngine { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(ClapWorkflowEngine).includes(unknownString as ClapWorkflowEngine)) { + return unknownString as ClapWorkflowEngine + } + + let engine: ClapWorkflowEngine = defaultToUse || ClapWorkflowEngine.DEFAULT + + // sometimes we want to use a LLM to generate the categories, + // but those aren't very precise and can hallucinate + // for instance they like to use plural + // so we need to be a bit flexible in how we detect those + + unknownString = unknownString.toUpperCase() + + if (unknownString === "DEFAULT") { + engine = ClapWorkflowEngine.DEFAULT + } + else if (unknownString === "COMFYUI_WORKFLOW") { + engine = ClapWorkflowEngine.COMFYUI_WORKFLOW + } + else if (unknownString === "FALAI_WORKFLOW") { + engine = ClapWorkflowEngine.FALAI_WORKFLOW + } + else if (unknownString === "GLIF_WORKFLOW") { + engine = ClapWorkflowEngine.GLIF_WORKFLOW + } + else if (unknownString === "VISUALBLOCKS_WORKFLOW") { + engine = ClapWorkflowEngine.VISUALBLOCKS_WORKFLOW + } + return engine +} \ No newline at end of file From 8cb30c5b055a0952e831882f8d52db9e48e7d72e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 14:41:16 +0200 Subject: [PATCH 235/346] update bun lock --- packages/aitube-clap/bun.lockb | Bin 17271 -> 17277 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/aitube-clap/bun.lockb b/packages/aitube-clap/bun.lockb index f57577f359cf3d2c61e354d43358b4d0977a8aed..8add52af2010d783c9258b706cba3781d77091f5 100755 GIT binary patch delta 4272 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 From 1543be212b1767a755ebdb49f2a9df8be2fd7543 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 14:50:23 +0200 Subject: [PATCH 236/346] 0.1.0 --- packages/aitube-colors/bun.lockb | Bin 17622 -> 17619 bytes packages/aitube-colors/package.json | 12 ++-- .../aitube-colors/src/constants/segments.ts | 60 ++++++++++-------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index a75713d027cce27e32c636b026a36ecefbbfdff2..223007af1203eb7907a316abbfcd5ea5a4cf6ead 100755 GIT binary patch delta 4460 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 Qi`KCrP^k9-ub2b>0dw6M_W%F@ delta 4624 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 BKWhL0 diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index fb0c0fed..08f70687 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,22 +4,22 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.9", + "version": "0.1.0", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm publish --access public" + "publish": "npm run build && npm publish --access public" }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.2", - "rimraf": "^5.0.7", - "typescript": "^5.4.5" + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.0.30" + "@aitube/clap": "0.1.0" }, "repository": { "type": "git", diff --git a/packages/aitube-colors/src/constants/segments.ts b/packages/aitube-colors/src/constants/segments.ts index 0bf4a2b4..04fcb51e 100644 --- a/packages/aitube-colors/src/constants/segments.ts +++ b/packages/aitube-colors/src/constants/segments.ts @@ -154,7 +154,14 @@ const event: ClapSegmentCategorySettings = { id: ClapSegmentCategory.EVENT, title: "Event", description: "Event", - color: "cyan", + color: "purple", +} + +const effect: ClapSegmentCategorySettings = { + id: ClapSegmentCategory.EFFECT, + title: "Effect", + description: "Effect, transformation..", + color: "pink", } // (visible) an Interface (UI) element @@ -170,38 +177,39 @@ const phenomenon: ClapSegmentCategorySettings = { id: ClapSegmentCategory.PHENOMENON, title: "Phenomenon", description: "Phenomenon", - color: "cyan", + color: "pink", } -export const segmentCategories = { - splat, - mesh, - depth, - event, // (invisible) an event localized in time - interface: interface_, // (visible) - phenomenon, // (invisible) a prompt which defines new event(s) to fire based on event(s) - video, - storyboard, - character, - location, - time, - era, - lighting, - weather, - action, - music, - sound, - dialogue, - style, - camera, - transition, - generic, +export const segmentCategories: Record = { + SPLAT: splat, + MESH: mesh, + DEPTH: depth, + EVENT: event, // (invisible) an event localized in time + EFFECT: effect, + INTERFACE: interface_, // (visible) + PHENOMENON: phenomenon, // (invisible) a prompt which defines new event(s) to fire based on event(s) + VIDEO: video, + STORYBOARD: storyboard, + CHARACTER: character, + LOCATION: location, + TIME: time, + ERA: era, + LIGHTING: lighting, + WEATHER: weather, + ACTION: action, + MUSIC: music, + SOUND: sound, + DIALOGUE: dialogue, + STYLE: style, + CAMERA: camera, + TRANSITION: transition, + GENERIC: generic, } export const categoryNames = Object.keys(segmentCategories) export function getSegment(category?: ClapSegmentCategory): ClapSegmentCategorySettings { - return segmentCategories[category || "generic"] || segmentCategories.generic + return segmentCategories[category || ClapSegmentCategory.GENERIC] || segmentCategories.GENERIC } export function getSegmentColor(input?: ClapSegmentCategorySettings | ClapSegmentCategory): SegmentColor { From 895b91d103c41e32c850919b531fd8583c977efb Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 15:07:02 +0200 Subject: [PATCH 237/346] 0.1.1 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/io/serializeClap.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 0703fbf1..a251d957 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.0", + "version": "0.1.1", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/aitube-clap/src/io/serializeClap.ts index d2898f8c..44378c43 100644 --- a/packages/aitube-clap/src/io/serializeClap.ts +++ b/packages/aitube-clap/src/io/serializeClap.ts @@ -61,6 +61,7 @@ export async function serializeClap({ const entries = [ clapHeader, clapMeta, + ...clapWorkflows, ...clapEntities, ...clapScenes, ...clapSegments From 550535eb8e971038747d1c7b2aa13819100edfbd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 15:08:23 +0200 Subject: [PATCH 238/346] 0.1.1 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 223007af1203eb7907a316abbfcd5ea5a4cf6ead..307c8dc536539a574a029d7e8c7c5835b80dbfd5 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rz5fHi$e*tTB=ddn*Fw%q`qU#5EnMHvOk2+x`1=eRu}7z0gx^r5N<;(oaHiK`Mh$2^k3m&`5>X~ZDC+vbxNrmaHiZvu} Date: Wed, 24 Jul 2024 15:16:25 +0200 Subject: [PATCH 239/346] 0.1.1 --- packages/broadway/bun.lockb | Bin 33910 -> 33915 bytes packages/broadway/package.json | 12 +- ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 169691 -> 170017 bytes .../src/analysis/analyzeScreenplay.ts | 32 +- packages/broadway/src/constants/mocks.ts | 90 +- .../broadway/src/factories/createSegment.ts | 1 - .../broadway/src/factories/generateClap.ts | 65 +- packages/broadway/src/index.ts | 3 - .../broadway/src/parsers/costumes/database.ts | 26 +- .../broadway/src/parsers/eras/database.ts | 338 +-- .../broadway/src/parsers/genres/database.ts | 312 +- .../broadway/src/parsers/lights/database.ts | 1222 ++++---- .../src/parsers/locations/database.ts | 1248 ++++---- .../broadway/src/parsers/music/database.ts | 130 +- .../broadway/src/parsers/shots/database.ts | 390 +-- .../broadway/src/parsers/sounds/database.ts | 2600 ++++++++--------- .../parsers/utils/getParserItemFromLabel.ts | 52 +- .../broadway/src/parsers/weather/database.ts | 182 +- packages/broadway/src/types.ts | 30 +- 19 files changed, 3334 insertions(+), 3399 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 982eeb8ae9d54d03c7b6f51f9cd50d69a9f5a4c7..553d891bde4fddf863c199742518a28c3b63ebc2 100755 GIT binary patch delta 6111 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 delta 6154 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ü@1*)D!Ez9(@Cd!8#@B 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 J8Y)`PQID)+ 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 literal 169691 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᭙(bJ9wichX3EMj*&t+jz zonH(iV71d8jNjZgjx{#Z3@I$RDaY6=vRqKv6b#N4ll>?invk7mLh_ul^KV-upGt4! zeQ|KcGLQ)y0nZfx1kDO#PmWVX*)lvRN==gEEXlDMRb)-*%`<6uX1#fLRPz2|_5LQ+ zzunw^xVeAma`3}teY>8Vw|Tc$4(`CDDRt^ezP{LjC?j#u)DE-L?9yo;CX zei*COkC%0Ic`HBhU3_;b(QvuCe|H@}uI?|d+Qa>Kea&mUmYwP``?_DcIB*XzKri4Okg?H z{M>%=OheALG-sPC@;jqkMxyGJ+&+(kc^yO!48v*5?fZdYgK?kN^PGD#*P*uhht(<+m8*x5R5U_50iII;n43)Dql+P zL~SH!NremxWp{V*7rK5PM^Qhj9l!l^96NA;T^xCx^--BbGQ8^x4SXa(9nVM`R=)wvm*>rd9H?3Odvl3Q1;6+dD|l#Nn%m z?SC8@m_mjwJ}d72@wUW|ukTl-=JkSnx4OLjP=Bd+64l1LyQ_M?`cV7Mw@UTn?M+#w z_xJsg?pIx%kstKqM0xkudC;?FHdyDKl|MIbp(OBBT2>xHZ&uT1C0Hk!yvJ%w_05&h zDK{lL&qMavwy#qco%hsqSWYw_h7zT~$<*wkf|Mk6H%@{cXFyK1;w0)J8}g36A~Si| z*;nL%2ij8Lebh_>8Sv0shHQ+nm?_ktRnx6Q*$cc8Q56WWx$G;2(Iu2A!Fj5Ey8Yte zhl}9+jWaS29LQ`6TRb<3ra-G~`+zZ!KiG1TzY_Y|SHO;B#VNgc9tMlveB@lnK?DE{ zPem>WQImD5_4*d4F({I}Ol6lWB~x0-qmrj7!Fetji{QM3PEWJPkQ|ypFw!8&pY7v$ zZIJ!R^aRXUtz7evBsJ9DZJ&KOlfp%De!0*DudTM$Zd?lF$~H;*6E-BRL zjr^~qHVSQ~1m~B)%py2XZXk|8vajHW4Wtp6KC&=SmR&>=DV4}r*+sO?SQwfgC0|pD z^Gp~P#rfqx614MZ88#Vuau}momD7JtaBMgXB3S=kw?~ zy=QX77L5fvl>K{+I&xJg$A)l``{ZSmH3 z%WW56-rja4M&j1nyVcvrI&O(h{`6|~X0;xIaDOc)(f#UHV&GAc^F^;`{_~sfADfB1 z`TpWpQuMqh`DyZ5){p&EPCa^-vlpjHTOZ(QTOub1 z(V*Zo_BLj#LReqSPFhKR268B&tDs%YZB+9yr9ICDW6_?M$mnUP9Rx}E%+Mu*l4tLo zP)Oymj3ddGqzabCilnEPdo zJ{!7vA4=I#?fep;IaTpF>}f;<>#RgMn;MITp(bOMWZ%@y^`_Xw?qIdT#YA7?j@BYG zSy;5^7sCjE4w8PuFcwo+S!82_vLzbjvdg^@ET|CW_-T+#=1~wlr9IDsWGQz(N*sJI zxiDZhp>J$WhY%zal2qu^tU=SX;2^Px!&U%CLw=?t=Xp3hv*a8mkipN!IIlZi)c^kO zuHN6TdrQZ=o-Wn9o9|X1>qBpeaaY%h@#WRcLvNiC-^n*$O6)7&{+r$&`##%wcAI2Sw_iAGI2f!4!lB1`FU6?_N%f}p zk|CvD2^i!w0Zgo8Dh@}^<&^R~kBw>NIp^pkC|9LtW{#WeUOs0rEzK#_Q{P)7v)R-{z~@^_m-5 z%+E$B{yARt9vgc<-dTex0FsxmSa0t1nC1&18p+t4v zv~Nua&o2U*MR=ag#BP{l{?#udtG#`3hlg|UH-;|WU>y7OEX7Tx*9 zFankwTF1r>8G5y*g{Cm-qMX-RF;`N$QNZ9ZL>z4x6T0(ENS;%7KII~3+%qpWMt3GQ ziE$_#L+$;%NVW{JrjJfc%A1%QKyhw7=8vByC%*aT|M+foS?^ZA z++O8%RdXyKSLuEK_Yaq=c(Z!nS-bw&n`6|sw-3LnkY3Bwd%T+Ui}>`4dV`KX@^Vf< z=HBnO#P#G*(=eErawQjaZ^;VstKwr6Mg=^NIkDG1X+Nq6nNYcB{+28%_fg^iy-Ljn z38pu@W`h!fBxaCokU*0Anu34oPpIf3O^ zIPoNxYy0;%T#kn?oT$#d=ME*m`s4}iMoGd-eLxtf?6SmloO@iCn#$JIk_n2jqh5_nwiiCi$Pn zp|f~M&YEhY>J=Ql2R$i@3FRznr8cg?lEms4hkp)v)_dG~;YTXA!WYM~RKlBB55_1e~5)u~Uvn7>_ zK;V)GMWs3wZ1a_M@nzg5VM^?thr?HC=<&yqp($j>V)yG;-#^N}@{haHeA!E&<1g|; zd#{a$%d7iOEuUXMLG^mwy5md!;d!$c&;^i?cN6gDq7>Xfb|C*DkB+S=^>{8Bi+a2SPftUlw1iJ~=+I%B zE-ZQ2yP#Pu0_IP-XR^&qv4sQQi(TNc&F4=6TF0kKpHJ7nN_ z94#{NQR09sS#lq*v^iv4wb@Zneb8DTQ6eFUsa64M4U~P!X>=K9QU#vJ!!xSDOCj;` zb7`$dly%1-c6s}OKyfuWrab~W)}$+Yok?Z-pjW- zOnTJ3a7qTA3&wUC_<&3-GVrlM2+kYlwGV@buGxUIMcJ%-UQ|)Z!6ds?0j^NB_jyOV zjCmB!(DV)n;%_A0zyIqGKYafWfBoU&_f_E0x12XJI_@SV;EAuCH6NC>Mel}YOf5H0I=b|x8TdZ-VZN8xV-)y)_Q@B{gxPb?a5gZZ9|~j8aO@rabuWiWaTx^wr=P?oU^PL`le)IjRSNHzq&G+BQcm6E7PFY>u^l5zW?=R)!e0%dty}Mtp z=Dcy z-E~7P)Kul`I~r9?wF&onQJ9aL1JEEbcE8BEIjs;JC1}d_Ha0FKQi*+02sNXG;5y?D ziFqCfi^P2NWDv7KJH#=?8i}Ss!fdA4O{lE6RqB4ZP1dB?r*Cc5nCFtQXv|CWvy8jJ7NUX3c5TEoDk#o(JI~F~3w|fNfygrwVKu>_}K$ zlg_I3V@=jSN@!zIWg9UDD2?3qQGhQ3nN!u6?Vc7@0LFkrpBpQwH*0K4JDZg2Qvjna zO-YoS(6r)P8&y(FiOe%$I0lh9UB9o7ujGE4;{3bccGl=vW61K**S+c3B2ZF&%&2k| zib@?EU`IAa3?}VRpXY(IsL#iXgh8)u7_N*vZ==b!-x0^&-rcj}$VQ%0Gf2o%QI8Im zDe-w85(gBY{S*@8iGM$?wcdB};c|6#-?xQT`nZa3)0MoI&o_?syV|=J$D37rczb*Q z?y}z1-iPA8%GdJ8QCH=!{HSLQB@lUH>xK+oH}K51C=Vul>NzUAl*-YSM6#)+@#y0z zy?Gv%i{5;kJXqsAc{em&iX}%RNz`jbP%g@b6%!c6ARpG8il<#Q&GUeGM#1?hrCz^? zJsVm4fya2^$hm!o`=PgFhRZp!AN4E3axf+#uI8W;H>*m>BrBbZjic+p6Jqj)tf*8nKYp#&j#aA zTJlaN7A^VMAY|0eIr77FKd5M--y=rTXCpUM6p|Gt6Ua8!ByQT?wPGfO2Nec)a(Lca z@}9(il`w`kz}Q}*(Wi8U+$(u(5MYw2O5$p-P48M^M)mCzO7e>U=2VsBJ!9Oycd!ez zshH4Nqf0ib;yCv!H$f4}^O~GfO|IX|8|@wwO7dJ74yh#Xgke#Vzd~4St?VHbcoP<< zP>fJR%ChU|t9AtnbeKa7#X%;!F&$Of-c?}1QFbL@>ES?f2V z=ELQc1h;pO+uf#<#b5dezNfFe{2mtjCR5s2Bf0dZGfuL#C*4gU>DGI$u}YCa6>SQ% z>O%IT?vN9L?@V-_Z7(@>!FSK&1<4srJWRtgr8zA*wEP15K2a!wmdNv$rn zs>1U?IIt=_kA_7R-a>}&t(P3Z&=k}=U$Qo;MQ4Nz(uzSt4@bG8N!08}V40GI=aO+K zS$HQDi!6L>6k5s6sgJYTRCEH%xr+qdV$f{s1%QD5@gdK{itc^tHE$KXpY^HSKmq5&-3r}ZXrsv~` zZn)nG!3OJ^6uc&IOk5y2C<%lVEzF`A>( z=v6DWDi^>g>dzZOXsNf|_hpoBPszjc*qLmV{mtlMJw?yBM)dWoA1~|b-R<>NuIrvB zZ?EJKigzFT8z-NC=&w3<8T<)K9ScKV)5ey$3vN z7(El~KyFj=RY7~7WX)qhdTdb1!8zsSOs(Fb0l&R3il6ES@4t8g<6>HTDF=SfTjb0r z2UQq6_5?M_>dOwKmGdsEnEQmYnxbhWOHfAT8B?CcJPsDm;>f`uF#W9Z8_NQ*Rg-E_ z5c*x0!Yo?_G!+aOWaojxsQ6;avX~3TVp*I}$h7C~M3TmVHcx{AT58SutWty`IbQE^ zQG8i$qj2#oUMwAakmw#hx(qdoZ>KvcpBaY+@;_FeM3UY^nWvuu<8XLQr*zc6;ybxiBoI#fwLW zd=PYo3DmOkId@&JmEK+{o1!8ZuY|8;t(-(2N9_itY>Rp5Jg05(MxOdA$D3c3v;X?j z=M9D-wAM-TyfH$PkfEDVmOJ7_WgBPrMkMh`6XVzkLkMh@4D!H+3(-q{Zb`$ zk2jypic(w8x;~p0x+e0lPj?E_NB8911!J7^!_AF~1-tj5e2aagMX!Xl9#uqW)`4rJ z$4d8<^)V0h#ril(9wdcFC$W?>gUkpe8Lw5)smqL7E9NQ-6MHKaTeRWPJfunMV;&IC zXni~hJzw$W#@Bt&vxZWRV)SH(g0_UkCJI@FWJwNVY<;$%q>AW5*0m-fTDW+*@9Pa*a{3iA`l_ z&T$vD$6XbsJdk-5&JeT@2;$;_?A00`2{jM4S&4lT6IKQ5jjQ!kA6iv8)L@%rVj+(D z(@l9GF9Dgw1DVvEB)T!=2h9mAXuA$`xk>6prVE$eE6$WKCr)L2h)r1_Gg;VefgF&9 z#RB;X+laTmduMLb&&N`1S<+>dwT``aOH@=`Q^XWNwiknXl(kP;AoI}KX@MLNoW%m! z4MqqOXUOXuu7XMWM4+9*+KUHsB}EmDvKW1;;MwVst2*U?%;RFh0TCXfBh9Lm-fV$e zP|-^Oy+A_0Y(zRpq#moS>!Fk1f}ES%a{mO(t3P+8xqt5L)nISI_d8&liVO|K)ZDTH zfU2DJMa4#P7A2!Im0Z2uaZzI)F3+}yEMoB1d+5CgUh{BoN0X!Gqg9|=$05jp0?tWr zie6XUymKQQCe49)JnYhf4@ktK1s^w)V1ssuM4KaxOhb*is?ysvuSLL=Evbwpm{J^h z*wNa3YL-CI-%bq12_|9v?28(_wVjjfM?hh?wuM@Es|u9K0)ex&4@8Ptj;xX_VJIPv zf3YBn4xt^IP9r`E=o3akFSGAFzGbIPl zgYcl*-fj-hTMyok7|=}qsV%dIY@9AynG&pWt)UQOtg4Q6ih142=VGfG{33`sRXKQ1 z794oAP9Aw9-uPOyL_I23-KRr&q#z!2+j>d z%QeLsjY~>vOv=S7IOG&m!5Ezf9m=?zc}fSKhr_e#z`KDtVIg?W{X=#M4G#4%Sr&q= zhN}R>sGO1YBYF4xlnC1|W2J)IM|jQzX0rbM+aWX6>58rhe$c z^>?ek#H&}ors#LS>#VV|U=3OxMoj2{T$*mOl2+o|UUyDNtP;m6|G-)BBdR6^<#|{= z-Ss3PQvBXzF2 zvI<;!r{fSU8l;j&z)YA7Gl4lulVRMD;;--T9^Y13iuC|mF}*}&+`B3!w1QR z1e$z#b1Og1$8~3$$EG;(dUYRLefaom?Dl@#i*-Mp^<$qszR0>u09FrODI}^k1j<8_ zd`p+6A{L>-6;EJ5n=*=`r_79*_%3F~aRLDV-htP=IRLHA)l}J1pj9~led~8Otwh$? zk^!ppxTS0{GiDO;oMy&yVdA){l=IZcK^ulc)*DPo2tbZbl6?m%VeZGRuNVj{hwbwN z!qg~>@Wn%q7c1i%gU~0H0BYJK`Y6G9w9YC`-P6kC6?smovWXcfwiHH6;gpjx4}`_Z zICe5Xvo=9L*_}>8m>Bz&PrVLhDoYq#dZlTm;zG(bj}rMQFJmqmi>M?Pvf>Wi&j#*1L)RK1KnY2e@uFt{NDOLBHGIhC{T)f&B>t+P?F zi^z?#k9IUtV#>^zNyB1hymWS)wd}1O3VoV0K4c~p`>-{MoKaCKq)c;Yw6~4N&Elub zjCtrhtC?{=(~tKIP2?pK1cc39&frpx4UF=w7k>eeBI}KU6u?zWCDLePnesN~(Xn_N zFB2G`;CbwgMx8?T@rK?8Epjp?s*tp7PiU;-R;_{%qlDC@7qeb$^&X~X zNrW$+T?~{w1V^es?-bQTl_8S;sd_(X=&4)ctD(GkZSHb0xjQeVB{JcK6|+R4n$xv0;b|T|Iod=|$v-b5zC0-o3v# zl_C{IM72e#=wOuMPq`2CFr1+zAC$z!e%Rw!3(U^JX!v@{MVHuQX*~8ubCTvaS-2X! z3j|2fjV_8#*$*!Rn#F(koj&Z=Sr4$uzG@4|)>~yb_Ur6k(jT-zfnl=E>R4fveNFif zGjZ7MKO7W?#en!4dx_Tqi}u5qv*@+M3@Z0+#Kqj(t%RU#_Z|odLLOyHQx3#Dcy>Av z2Sw*R+W7CAJrOV>jM{mDZ8^$r61ZQ|;yw(q6@`p0$ZCY>w)gR$iN;qMN4p0;ZW5od zn*8dgSN~6a{YzcN>kskc{Yv1us=w4C@8sPl_vC&R@7B{`*M;ssuNUEN_4Dm*8OhC$ z^Je#bu(PHVjR{)V+d$e!Zv(a7y|P(3{3N@NSq?wzTnjETM!S7x@=Qpdar0Wl=7Qcrdf1^0HYu+dxr+&|4uO z4Rb`34*k@Woym5=skwgTtSMapxt7qdjI_upS$b-$Mfl=*vWqPJ%~3#>Gb^~EV60RE zU0E`;P@3#e6jU!KQPR;wOV2}Lk)@BG4N2qsjlQSr%rT>_Y$P4is2q8x z*rceEY$wzTfC-~;W=fWxi^d{LFG18Os@ABr9j=*T(O$yneyPw)>X(8ne=Mx5b>4** zU7}He^OP(-55wnH7#CT3k17yrQ5I&1Z%o6$l7r=d+)G)5O6aPpH8!f~Wt~RNzo$g$ zmx0V8N>4Z4<={Lp3|$s-3+R)oLP)pYwMv?dYQBJR(Kj=mNq3d+KU}o zRN_EpbGt^D0IpS3rR#q#SV`bBJ7qA1s#Cx0KJqiBB-{QT)>!`ZYW1ec*7NiA?FU)PfBpA={nvl|@!u|bgOxY`@(-)WzyISu{_t)%#prB=Uye*Hw{>%aWEMEZ-Lc>R2vC*S?V=MBG+4KG;4&2CtF-#lYUfyokz zN30TxH?7#|6ul#dZbwc3Jo*=b`&fzKbzP%GQ=6*BSYrs>`@9%AA5mb4RRXL~3)ou7 zq%gWPHYsq=L*iKl?xlbI(SvD%wb}@pn`;0r)NFgXJ+A{dpA}mgkSp0&1-+Gm^K2FSjEaJeth2*hMqAXB!aa|KSqk^zaX4v(drvd~`*k6NfeoW0 zY1!*lq8MbCfbQ7mqN?u$#Hx3Oc2r)^Wn;UR2yCS(^(-c@=%kHZ;)5GgujjF_)6F<23fH$cKmV$@e*CHPM#5|B(P=-7 zPqL-hP6Irygz1qdYo)nq$$zppZFGuENxJipnCR>C4Uzcqvi2=OUeEnQA5#1C?RBX) ztIPLwb^A+wv<>dx-Ng^ra+-8}-@U(I-L}W5bkiCBs*YO!e8opRZy+Up6)1;}3G6Ud zFh&`mteoJfV(;%l8B#8}YJzcT>Xe{756EZSpibOl*gMeGL0gm~X>&ckgj&f21;t2) zToS1W63ejcO~ps6o8HyYWu{8grS<26;=|QV`EHf2?#2zqKL6x-V9>WL(Xu3lABlObk9ZFK!_ z!c}@9fSj(Yv~PfG!3Q~xHm;IQ95NfL0y?c+FcRA`SEW6~=skMdMiTLat27sg#Z`Ji zm|y_3G)&SWMyBMPDkM+j$X3M}yxyW7yeX-3`nhD9`DIFaN@(wxIJDYA$C`M;A zs31xLstS|`uSQGsb8*-rOMauYU^@a|CWn>H>JiqIdeW8L667e6Kr4MNgkhI z{ZzkxlC#E^0tD;B5C|0?DX^SzK7pk0DK)607+mmH!$t@OXu<2M zWoxib&bQJO6Bm^smufTgOH&tHji{MeJgX74+<`iJFv+6!fp}9(QFKTY!KjvnP6rhg zhu)Dlf@cHR3XOU*Pi}Ikyc1N49nJ6q~)$y|tv<{MZZ30~m=&JA46a9~M|7C*ERBjUeI5N6~QF+ajS2Y)n z#j9GP>j6Vc-XcA9cxIx+sFTWC_9bT}lp>c|ndY6#5dGuGzAaYOJPe=Pi8v>#YR`>I zTW7pAc4)p5K>L3CDP@vCyOCCr3aZdrDI5S?++kL|3`9=Xta5vHpRi#2e81rel%(7m zIjPG1PMkBOqD5BdGRd+Qhcv3jnlh_q0ww;t ztj#FInDVOT0rI?F)j!?$NBum+@g0Z_4UJy#CvFpB$)sdn1o@A3seGS-rjb@BQXedVk+v z%l-QMyAjnJQT8dt6aar^`n1=Y(s>)ErCW3;zh3PvUGT(?r2PA$sbF{&Gz zbjs#oaU@r^mT@>oi6u+KCmWL;?i_2fY%E6E5?nuVXk9QK+|c-| zde7|I>DbsRXB`7N72VddIAt?|Se&wNipk!CK@G_AZ|-%~7P=Ecsw5-ZMjx3K1si3#)FR)POWi(z zeI_M~Q+9kPXzsm5nK!p~uxd6jc$Fzv$%KMYTuN0Qb;T%OOl=fpOj%{~Sa@EmOrp{2 zUwLHXPn|Uq#(+llgLj$$DQK^XCP{xHNK8RStL%!`99l`^n|@Q)*gPPfzf)kA597_p z*Y^_N{CxYr{>T4}>zwTBKWkaNme})kx0>>${EI4Iyua*^vwi^i;O0S&mN>f3bt7-c zO|FsveSDj40ZO=k&`#xjBf-@Szq&hDHiMNNQvl)7a2qxYSN0+5*2K+nc|Yd1A$+4h@++9+LnrJ|J+lne*i zD5|y5=$6B-J7V*wSe&nucE0wbQo?&VzrxV{#|Le>WmehO?#IeOmL#TAq%Aq>PA!l9 z*a;}7hPUBwhPNHg_%ePHO1wCE<7?0T2`t;-!{!ca4myyL^)DKYa($RzWLX9>&>LQ+ ztlcP(ncAM_k#Jz&Yc39_?R)KqhMY^55Qf1sSSqK2RT0NNKaG-#)`EP5iHc2z^+-CL zvc2Y_aVXns1{I6#_4P5_Z=xf5>$T_Mmc49Ao=nWj5;a-=Uc_Cj09jhaSW1g-3uGc(D4(WQ$faEk?uRT#f=nYdg z2S_S4W-m|Uq0g1*$ocnn6T2m@ePH?f0Kz`K4P!WqsjkJ*4WR zY!!ERT~E7TdqkhQ4|XXoOR`cwO|`n{&eHGC$~wfupEs$D0i0plpi0eIDmAHKgbN4F zsR&q95Pr3_*@GRACYkc0=CS&$Ti0oOQTrjm3zh(?u^Dx|_pX~*2G znN%Fkikd;iGB;~K=6KIAiZpQ;2G4d^3Bg!}AnCVrktDD-Ss6_hw254KM<>FmQEj9b zqv`lbu)R8hJPkT7n?yacTHmmWB->AKJQq_6+PjoI?--jk4~4~PI({}7(CT1^no|=? zw%)QTrD3m97fLDw)uMcCf-eq7+r*UBG?$IVYC5U7c~1_lhCbTwX$WyG8I36l6N7Ti zG{sJ$=N1}gQ>nNzDs`Rmn&xr%+(yDVc}@Ev!WtyIHg=dv92!OgMWx__EDN(reZ(4* zPqHwKB} z9Sa5kZ0}HNhKjo!*7Ku_2~G75$BIfql~W1E8<%n$dDBx~(>xZQ*K3;SL3ldN2lw3` zw9|5q3?YTdDMRmRoO>6VTqK$R?uoH&Y*=fgQ5&@>t7#q(hqRh-5(pjv@#dfZWA$IG z|F55BR=xS*fBSDgJWi{s_wx4N_tR|^A8y~RWCL40Hu`HZ%NKw6$A4M<7YG0KV%;n7 z^6vKi&zGyXy6k??U3_;bsm^0|GrBqTjh^kSF(!7JB;p++V+77A^l<`R>dRF{0Y>?h zy$=}roTQ8GHq<!^NrlRr{h4$a;%DY_#CeKvT&@RY=go@~Tq*!w1tkBR-nZ zE;X@9%|zkAe$`waPTH^9lMP0+_NiG;5DbcM%5soBqUE5-GpZ7}afF;Lj}rI^vuZXN zhcc^XFtM0b#|9yI_D*7Jv(XJ0Lx{RKm2>KYiaDyp)+?KsOty$P9$7G9R?Xz_pjN~T z6wk=4+WQQ1NP@+%RXLqw$}y|LLDnUs$%yBbvuPuNv6Sva6wHD|*(pUGMKZWe}ZkO*TKHjXT3 zhXbd4_DMNwyyC2zVp%2%Iy2SLl)VZ2Y9=7%Dqi3I{QmQds9CEuWl%uTDd()jz>Po! z^e#aqTfO;85WyrwG=k{WPp{szhkCcFztp>r>%{);dg|0&ecdNb<#_#e-N5fb9%I#R z?^gLb-pNn$>It`3Z{Et!y3YfhHJwI#7Z9A=BuTYK_Sir*%muH! zufa!;_*t8!DH^9nW6^I$V=b1$v7umkeQ1yaYjap-PsZk6`cq|7a#W+@Dm;Xs5!e(g zW_vTXnJ6rl!_l+R({Z-_SN~H5sSdUDZ6Wy9N0n)bW1@-5HclR#F);2UI%PV{MPo4? zPAYiX^R!~m5C{eiV?|?pF)HhX%CW1m{yl;s1KJCXU`LAbl<6>!!{=6%&&hPy6A>?u z;2{j%*udqOv`xxnl7Pmyt{z&WD3In*z|=VMrKU`Wmx0LXnhtv&UETpX2SazhlF6~; zTQ!8<7~Le*|E^4GnM|*#7+-#vG96~}u$T_tloGe6>EN9UXmE2cqB^LOm?u>bsFzjr zxie%{ll_8fv$AuHu2M~z4)ZWsOoyXm!C2#%pZa;GmLh|%k`jl~gAA+4$X{de=wbp_ z?PwV5l;1rb2Dx4CGyQz&s)rJK!YkfIWvi`_ONA+TnVz;2E6>67hJ%enC7aV%sDt762Gx z_2YK;Q#4M^3!>l53tH@eqeDShK(s)c>P>Bu&Jq_ZXIh`cX?t@Cbh1%Z&EB?kfV9;P zn1{k*2OK>cjBGX1Aj8Tc_!^>D4YkCiocd~@k=4l1B(rWI?6`w47mdXZIH}la&n?PY z0#6n;m7-0KBS;lw!E5Wa6n%>_Nf~Edu#z;vxOc&n9Wal>=hk}9$qv{P5eg94do#41 zb;Q1fqI#<&<&s0iKBJ1wO3tOdMI2RNP1yl21Ci6U1NH>MF3%zcWHkc4_!_x1wg^-j(ZB@!v zvLPK>axU83wohl7iOJ#z93Kk^TFwx%n=pe+@X48~7*milM3#ZMu&S|WqUutNqojDs z5SYipatYyO0ODk`ApevpgYmW|iz=lo=}^)ABeNcOpkCZJLm8Lc)3tA&t8k@%$dG4I!8@ji}}2++2d=2#f| z-LyUtM#6AG!*rcd^7rN?InxfE@wIXr&jk77a`UsAAIo_9Lu0w$&$V9|VA-uQV zb1_0WBhVa)^$^+coUmZ?0ph+~xcLx9d-+x^F z_}3?@hQFUR5Cpx2GP50A`(8wtNCon_cZ`cF8g5G7{aB!8h%_n)n%bpsiU@W_TxYvpWQqcPC zy{6^e?=2=%iR_d7rZzh&6Pz-|=Akgl6gxZ*r)`Su#|Dwt@-p4fR}wgRQ)D5i^me1x z$VTnF3dW@dsTIA;6q}32c2n%2R4k_0v0-R5lMTl6W{a{c%da^psIdx+AtFx*39jG$ z`pd?}?b#*S{r~K}TXQ7Gk>~r4Pf^w{Jjbkq77-p7_k9^_YPloME+v`Bu{m1POI+C) zp@AM;$Z380<5A5@B&iT8!0c)ORVj+iMxl^dsQ8tK``jRW!$>{R#;u{3cLGFf44 z%z^;ezYLKI8kNY;#LZrU>}BBc4ZGTT=HN_UpEM2{6`_{XX&Ef3VjD2jPE_#{s4AkC zQP`5aMH{?EID0TVHb}$%?AT%VvGAeoIhP+_NH^wdTOXGODr`cc7g-8 zp)yj503L+2o?YUQ*(shCHTS~hF=qCrM-EENQID@*ys0Px1^1gu4oZdA+E1FiMZ${U z4F}LFK}wzquhiLt8M84Y_6`*}C=%b@U2bi|rk-Eimg|-Wc)j7!=dZubpt*@lZhRu_eA`-8K&e>QMJ%F6m z4R%veV@T}FI~){>br$)PLZ`ej-f?)p%POG5q=FLG$2NC_{cCF72^723DI_1ty!&lW zMWzmOq*fLAxuf8vk!@DhWPYN-q_q+yw-){;wIB`VO;1H0Wn)#5R~PA?LzJkEG`QQX zQb~zvtD;a-kx2#-vusCv(1Pc0*f@*edMff5hfggFo~nwxa3qbEWSqxchTO$U5*U;m zePpY}+yqUML#!%e#_Sx-cC?;|{4!`cRuOp_4O(e%N+InWoLoa2?-7JH+VL8sB+#4M z5(`=RRy$Eo#Oh0B6HSub*N4y#L6<9r%xPbD5B;+d$#Yjyf_q*Aq7a%cT?q8)rRKH4BG zSl8+doruM7)D>k>p{4-&;g0<~0Dnm(tUB_uM*$pP!rS|lLWz~%O(k?~&BI(~4=Dhz zNVZldWtozh&)gA`2T@pswM6R_%5xX+tzBb1+XRg$dfV0e(_gm9vK$qBOIr_>PV|$l+5f zgQuz^FPx4=ipT((o!PRkHApS&%^2T$FNYTM8zrPJ;8KZT>a2LZBP72NT#i*pUWx-r z<-pR^FV}isRMw)+9})(A6#=~#KC4)X843B}a^z7QRw4PtLSwx`BZ=;36?yAWX(pw# z;;y0u`cybR$_2C{hcFvs)e({hnOTM8!x6D;1PHZ!lt#NFf^;h0MI&mAY(Le!cnb&7a@=e%43jQ(p3$tIAcO~ ze2F+-w^n%a0W`(v)NI%4iOqvZJgL|m@{fGqyX&jFn@=e>f9lJgHk#xuYU5!F;Zv3p zau)1}w+ULUByp=U8U+eTf;11ezt}*DInXd zsx9BBbwUA2A|zRO^HPq3_z=8#xF`G|3I`UPM|n7I!Fl2MVDze;1Kpjn^3Hj-4OS>` ztT5UKfyy)u$8*djowjARf%OFEQ8W%EI1f;<3eL|BL$*8G@jrT3ikdKa<*E|U5@W`> z${Z4JUZiRTm)O~!HRJ3F&SM-NR6!g-@l*xpWw^A?@ch52-vR$M%Hq9HrnUA(j>e*~ zMyQ}|#&#G-KRhk=h0t=Wdhu^0Ej}&GQK{i{MKVv9jwEvWj#-VT3SUZg`7>1-8CsHdVHEq0KP!V`>inIkH!n_Yx zPjw!{;*)d*Uw{sD(J?c0zIgRb>#co$v$-rkHBIvMw$t_nKX(($?N6=W_S?I6;d0wq zo9}R5&lCSvn|N_|ee>lP_q=_vZS1}LawkoymIxZH#i>?ELA2SRu&Jrho})G-8=D%9 zps;2?uPE%P(PN}Oq4hd;HF}}#;@}9t?<|+*Fuus7g_b$BmT-)M4oTSRIjG_QD&V|R zK~IYw1LAO6^Z*j;Ow#8Gqf?%wv#_I)SKZongs`;18YVd}LhHtz2wG$8%23W{CU;=8 zJsAI?8}|X_XR~*UJW~0283_gzX>0xNh+wHXIEd|pPOE9Pk$9hCA1ClTj|L1f7H1Et z&toJUT74eG;kec3r8^b^HD`NjLg;OULRRpDz>&LFBBIlRj50Cu*Urs^oSytV%ErOu z=lxi$^7C`!5XgGfrbX#e1v@VrussZxo zLy^&nVp|IY&mhDkjVPF9_A*x`XK`0geIBIYpz8C$HnytI3&a~q#&f{FbBZH7LKUkM zN>|A%6-b1_c7#$)U}6b1KioHC5Sl}(&-;-{7gsk$+`YdiWcJ8O1Azo+oYlJ&md*T5 zM_okDC5UY@3qeZZU5?su$dgb1pkr_PTb{qv!BBj`vlSTJUG4jV<+svGi5QpeO_z zW47*}VA&nX=+)WLE5Qpb6juJGb91e(k2SxEz zwcusAfK`UQ7uaPEDmZ6?XIgSZVM03`n%TKgplxv0R~KhdSWgOm8MGX$6ugWE-44j0 z;kbNPR2q^52}VS6ra3rS1jRcU6r+`LHT!w<)1DSQh{Jv@_^|ufNo&CiO^ETvAx(wI z$OIuFh*GU?(qEe}#-1WPhQ%i-L|%YSw?&4ZOFnOIw#_PjxDM~%UzD4V z6?zv}H#e_0SGRA=HUIbG{BLFR-QBx)t$9Ux7q2p#nyVknww5^YWq5@@?w-F;mKR=` zFSnUp{p2-j2k3#l>Djp)Rg?501!@DW7;W z7-bOHe(WkIGVf`YB)iMNrmRiVYMq^g`G$}^TzhXi6jJ~?AW&~1JfWhIbw6m39?&9>y2=S{;qSoV5`EBWX#f2&CS z*-_w?<9&;E#a#&26&pZgt=jwwlSP!8_b_(Dbgec;lxGiW)PpFjBK5OpLo2|h4^AVJ zY|YshFGUEgP?U@oC^5EK18pjW^>Lnb?}^mIaI7lz>PX!?QqHlF(%SBwDRW| z%m4U|ljZ}Y_g+fc1<{3rW#iZhag7XvyvGoQb|j(%i5OD$Gr6y)SP$ay#FF(EmWL(l z@86d5>&^Rc`}T(4->aLO&0V8n^X|juhr9C}E>rpP)!DBaWDNb#5%j@WnsYU(70>IP zRf6b@$6$pIv9?A&NsuQayf)}ihe&ac$~=hODlagMZ_29-+XGx^ZmXLgrbG!{&war0I3Ru5L(xiBrx#CVG*MA5v0kps-TY2{0KT8mYNR=#ws;GHxdr zM~9jaxPeCVjn<3Q|}n-2=a<*~9*qkRyK9cdNlz`iv;w6pX5nMe?TkB$ z*s7&l{k*SHCo5;6bVqC+24nAhzy)CVE*LlibA@?xgjp9_@3=J$X6KOYDA zu_yA)AHM(k&;RSq@4kM$dE3O|s~<~~Y;O1pC7s{g7b@p+aUQo&%w`21>hdQID>;X} zty!2(1p&K5Y`;QMRv4e4Mfy@;Ois9{dDF}?i5N)>>n)qC$PeOtTxAcsUW;%gA3YWDw?l`r2OXY3Tjqrx6j}DG zjh%Y$rsN>zEQLm36I87eq+y0b-7{sd}FZJqXAr zsd-)iQMcw9=TgrXum0mLug>P1O+CNNt!nxG-Szvcn_Ux*%X)ovdAm8kWF|K0ZMeF5 z-JW}ObIV`fZfl?8)n)$2xq+YTvZu|i(M+yW(oL$g_c@s=Vrjh?a?R`}B^0_Q8I$wD z_*pZ~t|~pq?h{(JV^^gYGGW_*C4*$|k8l{J*-Hx5w*u7|1i4g130ZrSY)o-a59whj z4kt?wV6jdSe4ap(1TwSUXkKb$y2OOo9u}JI|Znta79)SoeCGEBWX- zf~#QtxmnNz9(6kh@v~lyHY&cT08hMM1*rswJ_73Bzkg4!H6|tz72kIH#1pZ~W?HG62>HRoi(BM9Fcv4D9D{jGk<;fo4S- zUAcOchgGhA(d6)ZjAq-tZnyV1GHrmM@JY7W1*!;Y^97~UmTX3yV;+sQF)M4^C_&w>u9`ik}Z@WPok9s2=v)VTR>I0uZhPX3}d47!HGC( zQF2K; z|Kp$TnfleEFPsfns6Q*v&d5n2h>4Asb*jxDlkDD7o6=L9$g=XHYwg*&IeS=tej#xD z@$NQXU0vUEasR+cBSFp@(pK&iXv)bFCB6^YBur~c7Lcm2>u2YHa~Hov*EZo#EbKrx6JFW8g)GUq!-SOSr{=Xk1eS=h0pAXq}(d$sWLbPt%#7@ zoK&Se6%TPc67V5GdJvrbjXQobIMfw(Xx^Ol%@3hTFHHg7ME+g!_0{_(61T58Sh{<6 ze%anp_G@oHyx#oVn{T$t@&D%k^8GIJ>yNd|XRWnHYtV7oewWq}I$e}-y@_|XA0NK? zMK_PndC!x^8W_SB-0i3?ZR&5bnSqv({~!|VT1(-gHIl`aeB|vm`^oftfFnA}y+g<#JP_l-qMUts?-OFvTfn=|z^}Mgi@i%AjUpMhF z2*ZIBAEQJZcj99q9qi?>v7jkOYHU$5WhKDN!mbY)L5bHynq0lZpfv5vd<@fZsLaOz z7;EO^*^y`^STb%JO65ZJ^h1N&ERiVj>RJD?IW~aKTk3kX-s%{U!cnYbH zWpEfxyerA6y+b=bSS>GyjMSv4HrE%U5lAX|D$?uu>HTiz7 z#wEQsxzXTstM#%O1bPSp3}Q*vW|Q{yiWx=Xkg1OWBu**yu@Dl2)&i)h_cTDxHU{E_ z@JX1;eNCO~&(it^AG4+s((-+SIFSevhv=KV4m4bh^MSy3|P{+FE+Ff*_oH zV#5xO4k+w)WPAupM8o%O9X^V!86wR#xo)yzkkKbJUdNuSSjYs2>rxprsm|>2Vr}i| zoBa}o{bCWFFRcowWCi>yxfv7vWW{L6{twBD&uF#wgLCTXjAdZ8N-|62b}<(DEUmU6 zRIR*JF?taoWZ@~M$lsC5?#*Tla&@?D#sD>Iqx&Z{XP#FN+Tgm~@u471RXPY+_*SMl zWI=kiZqE5oqF2(-s!V#+?fCi?b&sF4y5=fAGYpnAgW&CMYpXtCiO4}brOGUr$T5A< zqM%QJx=0mfCa9OH7-eBiRXlq*ptTs&;CK6zmA07TvdE!kVQh`;3&$XmWrqZ-s%bu~ zu$QSAhhxoDtRDCTqL$>mH}~a2QD-R)RZ&Q_QSmLKN{$Vd3Xy{~$YtN0)lm|kT8%!1 zOvTd4@!M&4%IuDkv2`+)I8e_h84lM@BU_EaS28GVm9X!S#!G?YcvBS%M`MCA?B(9) z*m=c$^o#`ivW0`@ma52x1V$zWWhzPUNmUFZv8F0s3M6RJ8n373VnB#l>cpE0rRLs% z2t}dDF8Ejt|5eZA=w7N~6q2V+RUG~N)P-PpW397pl7QJ-6tF3AOcY!@;zc4v+dK|H zWhFlqW-(DOO)<*FQ>Q8Rv-8dNsKe&!a&z-OT>q_|+zG9d{N)ej=LSCf#l=P8ueVu+ zAItTJ4Fh&w>dlw0Hs8N(zuV>?4qUWD7MqaxSGc|7cjM;cDU5gTuWs5M>iG|M*Jax_ z=-DG>?`$8c7`PIq+5XOi0*={Bqk5e20P!sT3jmTY48Hqal|6V^1! za|UbK3@aejPJx(d5)m&`L}>&Bpf)eqiwFpU<33kbi7@()HEd z&8IvT@~JO-(rhX+$j0S<;9knf*I1`=KX+304ES(sFG>nWIoDmH-(+x`VzHu-((u&LzODe;7=1|V%0LYp0m89 zMVP{GJ}DDKswFw7S^c6muA6KbWML@Ta(Ez)JK3^u>b*8r-`88mYOBZ>)K~Z7D(O*_Ha0WlVmE* zcCc=$<%O_uys4IjK8-i1c%gThS%R9R&0bKcOhk3<;B)JG1PR-`*sSHgOv@+{`!g*E zCE}DaEeprEa1f#lyx#m&Ho08&_xV^qBn@i^Ex@^ZXoY(T@Utewh`s%xX|MuIj z|NO;woA3Ve?Vo=C$3Oh#e{9}t{^y%N{O;?`e|+=(?>BG0*AO7d&4`2Vs=Buy& z^_xHZ;hR7F>v#OqU-54Jw+(E>=0_!8-BbT+o2U8Bzs>fB^WSLMZ?nDJFMgxJ-{z!0 zsgA=`a8lE~imyYkBx2|S2Whc_L z7&GM5dhHT(CEK(&t*}L+66OO0`iY%EuJ$E%4ob~B=j6GQ$)2k6#%tJ_yZ|;q$-de~ z8F=QQnAX_RwSr`C+uWNXOPhOQ+}z~#$m~wwQI8(JEfeLMqiYj**m0Jj3er@CGtzkW zrO9neqdR1(?kQz;{AnGxtmi?yrnz^BLJF$NHisQuo30$Qh&pOPkg%AdNzJD#ce6T! zC=6wF4$s3;XLa1d;&jKR!U4%?R#$M*X-xt#Ibpyk_LO67oM`a6WX$`{&{b5M3TBEI-l3TOV%3uj_kVYgAOYp63*>PEVd3X_1kwa39A1sf41ighY#pZLFf z+Io#Lv3F|8L7DjKx*3ONCbm{$Q_nAM%XK>+a(#98!`p2_;-~Y=eD%}K>$V~#Tx`#z zTyDa9zF(7H&RPnBAO7*@{#@zm;)<`(GB@w8e*WEl#_bc_?c<%c_xz`KJ86=Y2hEYZ zGduGJ0a0ZtLPieg4f!@&ASvNZlleSgP_x!3-Q>m~%1>(Bjyk!qkO{3o^1G~I8e{8I zg2K*oV8@!7utksuXfusNkh& zGc9!iwFs?a5GLCu33wFA71i4JMxRck%7l6{($0d*DYQ65&s`o+_u zz_o_%PVW*PkgXy|d>6}$WvbQ!b0JYcOKGe2dfw5!D_IZXvr5(ngTkwYZT`tPt>jd{ zm7Fuink=?w^Nr879m_|)uXYd&azwnZ$I~DbPpet~TnNAU^P9hH{vV_M-`5=f#_Q0u z;miDykDu%2*@T44RPF`lx8-_gY0jF=!jH0TN>FeKp|L1@Ic6-70-FG2{pI&di`sNRB{`{Bi zYx?Rh-+%qFw*T(>_M*u;fBNSC`}+TEANt$*?QOYy{qcGK{(t{(dvJTHA49skd-vu1 z=)uYT;wSzAXIrko+MVDf*{Y*AAaZWiRz}xW^1xwi$cX3+nE6T7u983a0biB;=gI`H zph19X-hz!P=#Z2E8&H@e*%L4|2`q`63z(?7vpq`wsJ5|Z==edgV2iVPA8v0y<^wao zn0mX3A6w+TZZC54u3Y`}(Y)(5iPM9J6b7Ms()7^4ae_~pBl>LjJ87H=*zL7;s^zc+AQf$e^V&1b-V2h}iL8r( z;;V6L-?@hFL>m3*Ip)6|X5DM0rnNmg_B_!-7Oc0%fupI}N9MOVDak%l%NbH=O|+8~ z?LZ&u47JRgXm|5OgDf04Pc#a|QRj)gUY11E?PQ);J5|M%plTZ(luT3e3mb}Hq7n{s z@vdZ9?d;S`H%&AQ$Dz_h16-_WqJx7)ybjt=Q-)2BmZXV-LeLBrL=mt?0nRZn9MUB} z>m1xo6AglOQ1yR+trJTVE#!n()q`wj>~^5U2&MYm4pmVbM{Pt@9);q^!Fi?#XZgf# zn&^dqa-?Y@4+~E=D66#tweweE#1blkpxVY&DOp9tDn*XQrlhipxGzsM3dAAvL_^-n znkQO}4{FcB53lYnB_N}LXrY~yYE7yF3Jf}liqY0Ain3!*-h6d_8LmG}O`E>@a9g%N zv^l@r-14L4-RsSt&i}hyY~Ejl4=w$&oz8JnZZ==t{r&GBGaJ8anUtFwcAu})1%Kze zyLbFSIh)Qegw0Rkhaa}RpThaYFS0!^@TH&hhm5^`$sYaG!rv%`(UH)xWoxXKB4$F7 zluXz@W34I7!`Yg_kJu9$-eb?!EHt}X^INT88X*I+QcMy>sjcNs<@=$`Uepw&amArh zd&h+gLUA}@{ZSIb&y%emasFYFw6~UKXm0kWx%vx7by))#u-;iG)%^iT{)&A>5vlcV zhu}nrQVT6@XoJM6-R4&w5Y2Z;{tDDb57b@&s_%m8&yHR+U&eyc=&ZLeH7yI8q{p_E zrILgR-Uuq82rwq61O(R2@_{|od=!R5tLB459Jgw|kPf4f*}$omHA6dZsEzbBiI({V7_d_NegY<_UE$Rh7LdP>Ns9GEH1n~-dBDDlb$>8sG* zsKACtMm;;X)6>mI$vUhYx*x7n)6Exx!Y;KW@KXzq?5Z&es!+KUHbHGR73nsSD(B*$ z9de&_+V1J*F9noi)ypl&`4 z#6flQ5r1XX&6nE~v?vs(zGd1isLLvyR$ut z1FT{p3Woq~KQkgE*A4-ogy>C4IICgoiOHk5J)t!^b}@OWD&s9^?Itlx`0+b(JY<6Ov2L?yj2 zv8FaKD+?!OOvEb5~{_hT~8&^8gpC%zS9Dlx1g{eW_`Nxns8}h1QINcPC*;DM3Lc zk;of|!8ki7t1B}Pl66q^Z~(4TlbIKeC*W&3X`S8ePYP2?Iz>?fvE!r*OHS0S!_tN)g~F>LbAc4GK*SjkU72|l zh(pTEL+;8dGcU%+@fFA`wd+f$LbWke4tc<}LDQNgJOT6%{M*HQps*Y-#1AC5jSah!iPgnstop3e1CS zbcYAGvK~r-L^8R}zqCpOFOvv1MPD*RYv2>{qq_XSjGr%F{iTi3P2qYIuCLF3EH|x? zS;@`2^UJ&2a`WY@pNo?>x8ZN4RZHhm-fv=Ci?^@&!T0ZXjc;0mn^s3%n4#@&{^b|< zKz{M<*WZ2j=3l?&^);;IWC^@_rf%`GgRe zh2q<>OjktEp|IcY$<-99Dl@IAD{&99FeGsw9*9-qesH8k8@pnssuJ?mqDxXJERMbI z28JdptVJvedDjWEx}&bfJxs^L8uvlLST*j0`%~?(FHZA*pg63InaDOUS4wFS3RV$0 zz@%#13B{RC)m69$xf&2I4~o{QDclPuWjMv2iQSnWnWR-UdSN)~=Rb%sA(sSb$Yh&C zZDuDqy88AD!Q@!=?S(iHI#k+Cb+91^4z^qn#Z<#~LwgaFZhed>8$fb2ug>V|+oM42 z*S8PstE~F=VtkY|#Q02A_&LR_HAbO`IEaU=1vMelWna*fl|{~kovyw;h|gYq`>_7Z z#nnv_ckgGu%Kam!jf4m15bad7XaXo~GbmM3yw4PNZZT#re6XsNlns_WgH=b7=*rrz z_@JwkBKZ=9k*yb~lOU2UE^#1^TGD63=G9+ceS7upHLrUPAHLYtKY#f0uiJH+n!ay^ z=KryI@X03)nYEHPBQy0$FKyl>@J&)eUbIq>V{C;&7Ug5Dg+r;Cx7*c|2N`=pn{(`X z^1^w}MC{1G)bA)Hj}UF<`y>v40FeW0Faj0tRyE6te&*Ts<>Wyo_Q}bgDY9PWQreI$C*7na@QEf}jVk?9+3{aH8CY2!sKd<}mq1{9l4%V@{t3$1MH$bIUQS-d0w`!fxHMDmh3Fy$+gcX4CR2r109peEPuj)c zE#Rz5perX2vM?kkA0CL~mXjA63hj}tfz-RiQ$dc_b#9Iju(unuZByoqh^0nZy{;H% z;d@t39;V}AIr*Sqta9>xvKG#>G%e$9I9}S>9r75djnE}*=j$m83^53j?9_xRjhd%4 zyMpo{Sp!PpLE$`kxf_0qL$VWg#Q#Ah`0Jh zpyX>xVLRdb^WgL2)p;tL|GGQ>v0VRRCf=)W|M=}ceESFlYr`r2iWX%QI zC`Hd!hO~$pr66aMLPaUg+y8V0b1Lqyh0LJP`hN~*jRMQzVRWDyL1 zX%pC>bt05|1>`{{_6f+JDVAOZAHsersR9%Bw17(F#Ib0x>c86tb% z)U4at!wT{s42M>b2Z=at1$iMI;DHeAbig_BuBT=2!b`)56dgsV4%np*K4i8clxF1` zT?KiVj)N)4`@vWhnL63i5t!ci{dC=SR|`Z023g)_g_32diq$40h)Si>u0IWm+2@E7*uwf#|)c zz?MdXk-YJpJ(#W-Wnm~?ad;rsbj1UwyrgqY8QM*vv{qRYl4?@|Tbql_e=~gBz>6Lt zXmVy&9oEZMjKlG8w&I{%tl5gghjXB`C!Ed?+8AAst(GjcSt~k1>j9@kHMzB!W9I72 z?DVn~qht+;&`zx5*j-uE z6-)8)q|h6j+GRLf3PaaeY?<0dM2d7!Haj|dFvl^9-V++8V^^M+G2uLKRcw!TNCb_( zl)#^Vm7%rDZn1Z^LQ_?xK|LXkyK@)V()m6WQBBKrWv>NkTLl*0m@I%xWi}bCt2Yml_0%%rsp-v2 zL6O#YUjHcwqevM!_D-qA|2k+9ZPS}0L5!FPa3&CS_2w4>%BnYa1tE)0tM>lw`s*t4 zB}c*QN5YUSf-DE+)oHZKdtc*>hpyZ_%EKx*zj%5aIFydvm0hJxKoyC`<6*D4`DS0=O}>x_e4=;NxdXhUL`#egu%ClT8W z$mnGv&+cs2v(TrnArC^aYRIdG{AnO|QYw#Rcgm1$t;uu-5qOsp232L7#`k4c9kun+ z(Y)%Tt08yW&BLQdJ{qTsELIEc+w@XOC`frJqJz?2M*;WG7$=Pf_ZM$b&EpiO7d1Vil1e>{`hClb330gdvOZ z{I5WimG?Wx`&}tc#Eg~1e@3lDUPaK(bCshBC{(Z50W*Y4IUJ(RYZPNk)ieX9iDjift)z1w-Qh$&&R^#Uv^jd<%6dUh6FU=jM)jvK)e>IYQYQ1ey+|@1Rbj2MW`GN^RlN| z6x0=x2f_FxEio3rOanJ-|`#RN{+8L*H>4!H~+HvOZ)rV^KB6KFRwNq z#bn+#ul{z!glyjO7jM4V)bQ^7;=`BoI_7QPj8AjPm(487Wz}EC5hWyyJ?-JqlO*{Q76DQerM2cW{BlLqibSpyT+0C`Yx^v3KW_iPvYnp` zI!={(>0alpk?g$hL~5;!3#5vG&?=oPvLOi;g;5f*W{YmlLRX|7WMN38K0FXdEmALp z19;byWTvVz56QS}NZ59y$3UwK(h5W@XtJbSmEY3_d>oF4HR^+Mv1-(Z21|pJq^A0h zSZi|LM3FQk=E{RWutCI_AX9B)RrZXL9OY_2d^{*xC#Fy@!~~@Rt#Q&0I64myBYWM{ zv;#-%qv+O+#rR^fayifI61yVx3*qEQMe4=-k=)|2E3YWUx{NLfWm}aq+SXRE^*V$K zkkON!CoQ@f^(YVfHR=PqDyv4lIPL-TZT5uT<-B-FyiUAC!4h!f9HWRPlAvO0AcNBS z89rT&dJvzz8udZpIf)+NOW}};q_TFJHv!J;4ABW!k;9)1P9QlajP;I6g{WxO>Z_|$ z55np~&+qZnsD%Jrj8#-) zIlhi$1zJJ@N{3ieVVg5ce{{9vL9Cw8;H+Bm9wwY2si(rgl&#KDM|NXOZH=0FN7DQU zsKiW|WR;rb7y4rIAQbz=9T(&C}57V(q#YapQzeMe{^=cA*(8L76iGrnNsC*C%6AAXJvqs0iQQFrNW00(; z76DhW_>sPfcHrDp(p;k}ptIo}i34X7Io=93CQ)@E9gU8DKC8W}7QYZsR<-z_95Z$t zWm&tcpE#V;NozNY6;T~93#a#7&C z=XK(JMi?1UgxV@sE&3Q$ktOZxiZO`K)5^t1+!bS~MM0EpRwV5TA}l$tFg3lV9g?VC z@)l!)KvWha@y1j3b;TG&;(3b1ZidZ&lrJtWHs!zHUtC?6&1Ly%^Y-fc{O?znt;G0; za{IPi-xKv}rx_3Y)T@)nPJ<=O|KDw7m?H#Zs&GEEb!4Z8Kyv79fjA^5D0;S$bw%Vs z>{b!^nKFTzEK22eo0HWMwWTUTQCgV5e~=*#x{Y-y2j#unTaY}+#Ht~$8uDX`Hk_B} zo!wO%+hR>38HC14AE&p+Alo>U!n>&fjB(~h^(5pSlD`7=(PR8p3Hk9XsAUo|b6}CC zVq@~y+Gz`AD04vO9DCHD1qLajO3X){)&2D(3HjNx!Qnb@XRQ;;F5W_$jm%kS z1MJ=ERuF286bft9t`b6?ZD~CTd7O?_LOyD;6j;MP^iDDo|=Tb3>0nJRCNiv@IHES)d$-ezqO%lt^Hh^suYozCi|={ z?CGlfQaCwQ1$m+2FcuYn!CmgDCN!3?3T=~XZI!bi8>PtBx?n+ShkF#{VIWoo`Q_t7 z+rdcI@9=?CBU_CmeC2@0glGiCR&`u7=m-`-&-~qnS`}SPrP0&Ktr)%0zGjg^>!lkFZ=EhG;SEqhPg&X7>71^J+-(kS9zC3I6_GzX3qTUA zHf|^9NUf^kWe|X-O~-D2l&xC0M9O$}tR?QLL>`4P33$|jL z3Na_ED|t9gEArAnb5^tyF`yAXS)G%{8saS7(3O#2 z2q&wI+z-GwCRY-7F?rHiyUGCQtau43^FXd>;cJN*jkI9n*~2RGC=aWO{Nm|Br?mDs zB`;;MxfbA?c&mi5ZQ8Jg)|fkBPPSI1XIf!bL>{DP?OO5N*-(Zr%5+Ta1)>L;CAEAu z24O-ff>+3inyquKqe-22ZSM-ngK#{xkZigD&4uLuyt}#OMcRC`d3*J~@bY(O^mU$f z1YIi@V#SulSf!_$y`m@v6N`{WwfsaOK>@N*sumeq+wL$s_T5#H2eDdJ`!BBWHk70w9knnfr_Ag?46|O4eHD3-iM8PP#0riVS}#RTlX25=i4v=< zRz?BP5+2$ofyrrs3S9sW)lJ+d7I%Afn@3OK15*`y`9_4)dL~58`=e68fdE1+H3Eiz zMrwDOfIa>xd`n@_=m<2aUG^(kN zJ~UXyBe2cE-4>)Fp!5+$h2opH#6f#Ie_j%>XRWAeJ#(PDQt=>I0}|jt*;=LIM{(jD zcujsf*%^^hX!nsVes>xLS&VI1QlRF7TRW@G=t{*egp*^HiuJ-AlWkKv)qTmRt_13N3LR=gA+%gc%yVQPV+4gb$`&|}+K z%iLNM_=p0q7_6!!je9yAkJ7VOD?TVYr=b-uV?(32(#UDRC)x@XGcggo45sp`G%r^q zqg9aJ>tJWa=v}FJkd03=h;IQu*yZP!gZTcf$-vj;U3nMF_2#FyS8aaYCN%lwqf-1) z7XIa^y}=(kY3!UOsQ_q~p^zz2^oAFXS_e^!MFdmZ!QTwL_71Y&)4O66yC<|q$1Wu= zLjnvKgMO;e;suZ%vgBYY}6xhh#A5TqtFi3!79*|Q(;9i4 zjy)ptA;DNh=7aA+lJ_4&*6!?%^|IwUQDAC=s$=r4_iYpyn}dYGleTm3g5F;cZh`cQc4!WyK3X%*n6V#QNUkE6x%-jXS zp#dxJI}_wcCOOsS{BkUA3Mql!B$3GxyRa_%xfs-ynMZ*bkeLtbudFijVtl-Aqk)at zMetUuVqYQYQ0_QXa*Da34GcFMe~GY{gkUuQn3Pjkerkr!$@4$*;;)BF#u zqbkgSwa^mYRf?cp5Hdh1ppxfjpFOND4-)Z73XvC3)9sAx=ADthc=h#<<@y8vba}t| zW^)_x@ynsj@Enh6;7H)G}y*8PW@GQ#aku}nkU@U znH&WHFKq zvxqV?43L9BfFf$FO7xWEL}v3q?xQ>MF32~%E|$uGrHEt#ck}0Ow3=U@#Rr>!N^4Mv+=t%a8{V zHTu@Hz4!>(Gfig?OVNXHJhc?vZLa(aDf;{CRZW&8!FWBug*3+!2V>u+(`b(jd*`6a^^(97B=`c@y-t zbt?Q=NC;qq&SnN`SEU{VbycaKD--;dg9AH>)V?Gi75m9P+g2+^B1G%iFH*oh6C)94 zg&KX4dXR}H6{+uo?$07of3Dk|G|P%FfEpOUohC^MRMk~DgQ|_wQ6d^hOmvVyv5kV8 z1${k%dPnWASbp^6KajzhoRnw-gTWgI z+k-&6P749Fjv9n_l36eWB52HlWJ1)H*^#rouBT6rvM{Dk9~_9|)~ARv>eH93(+lck% zc(b=_DcM*FJgPm7I9>`T$0|@SG#pM7O0;^C7zr(BLVZYhPD7zyXj`oFZA6=#=Ac9MIY-OJq$MqsZs*Uv5!nQ3vLZ)yrtQOj8 zjY54$fWCP3=MwUVO})C_O39P{@-MG8-@h&A*PC$35fZ=8yl6M?uP$%O&8Bh`wSD&W z)z!Oh{q(1}=t)CswB^7HCo#t=3NW3>(4LG(|Y8qqOn$eqr0wPE3CKe?K+ptNStxnNK`-=+Ho?1N$#a^}g^Th3IPv{qd zDk$D_wN=v;4Off_0R`r!MXSK^okSyCR<6{7A*7i*-_@eK-OKHx2MDfO^yjx*(xG)~ zYCt4?3R<;buC!p^u!l~zf*|jcrjRi18z49e!zxBUdpdkOR{_)L3p6P!MM?m3AWSZa z*-$8~3aOb1qvj1byHfNp8>=_=s~icT4G$K=ttHCX+xgwN3Eo&E1Fi_h*lVD*#u#5?79FYM#cI#8|u{6qF)Fo zs}|i2y(Rl5Y8HBzBn|Q#A4!8SDS-&epwJp+Ac;=O+1dK86g|qrDn-9|dK7r%$Ofj< zUou)rp;V!g;(Z5#7EuE4J2ob%Wt9qMWjI|adJvygihk~JAQ4#hckhplx@a*b5o~5Q zvTF@3+w5!zZAy|+WuErzD$#>%Jbxwncdb_W=H`o=&22cp*!&cJxY@Mj|Dmuq8!j$B zyxx5Gz6mUM?>0Z2|5#c-j`a5Yn!Vny&M(9DhgJc7)^wP!KHQc~Eam;?oU!|GnO<-H zbpGGvV)Op)`ugVewo>}5yTAW^^Y-ptJ2SrtKd=MciV|l<*ROV3_HTb(A79M$+LpYo zSEv5TQT(CdJ=siCeQWSOd+9|xZonU%6hsW#3+A~UwoRDq%uDME;)5TZRSdZ#fxWfMX*&aQ7kcm|fU-j_EST70a$;;_LE|{ca zge)?VY?DH=ASOnXVie`%L!QT&T|KAB*4obQ%{e zDOr=qu@$RmSp*XMVn$ZylEWPREWqsQ;e#+7SPvg1;<)wjWprriP3xNlQ?*J7*-!(+ zZ)c2e&r@a;C@q@}lT3}XF2h|#e3*_yDdGcQtcv)-?G7*p(0cXl`qD6D7)%wV@}e5c zI}rhb@C9>)_RqX&WLFU%BDMSFD8tEszHOfE%er~IQ%O%Z3unmF`w z(MH!w=WL8;4=ds?1e9Y{#1{gARvF%wrUt}7gdtWG0X16=HP4rBPy6aodJd?F zkFdk<&)qw5adr8_uSD_AcV0LlcA?YD;V~LFb(ry48DpXmU~OowiQ***B#NscsgSFp z*^bi{#s?7z>2Ujv=^|q1j>%SJ{^DlyL->2y)NpZev$?w51l|ZQ%jPG3mDihib$feJ zKB80d=8LZiznACr?qc)i@`rNq#b*2RHy=BJT-{yr&&<4=gWceyfi*CgN$0E8B5^|NCEi&FIl9M1;)##^C1(HT%w9*Cn!(hDt zO*se@D|w&wYynzSs$U2v$EsAX+>wlT&dU3@vo4C3TVAwQV0t&&)Z-N$imJu*Q`5R6 zp2aJRO7$oZXQleZo~Ko+ z+qH; zFommP=P#RV=M|xgg7F{|PbwH!Sr{Jl+N;eEm-nybQnwP5+pMPQ}(c(s1%Bx|WpZ;I+*ZQkspyTU3e{+o!vao{8Aousaj`L2qA$VPHuF zi|v0-x)s^Ms|){t;jqYXxHx*H*sZffz4jjUG+n{B=yFW`2FQojS2mVVDa-w69-^W7 zi2FsMco2mlq4@AT9Jf%sjtyW4@?Wyk8T&?(Qb|TmHP$|_+^UEYLu)H5NK8OwK0#l!1K!u={L#}1 ze?82smtf}k0iUx}ycj&AL#Ijew6tZ7;G=RGdMEo-RH`+|lTt*~kU7l;&@G9@qc9v; zEFLA|EEYc|7JF~3BfXPqxH-g{iz=mV&mZ(qHp=a2I<}yZeVJwEOJeaj9fuN&2f#Rs z#fK)#Xfj5Y9<$SY5JUEyQI(v7LhD=aHcrYqWJ{&bq1)2|W0b6eihu)foz>!x0flr3 zNXAVKFk~}o#ue4J$B`S=e!$bHrgbV&)+UM7FCG<(UkWE@vG^Y}z>oz&((avqSz5F$ z_v)C`8wYu8lG zPG=#>YMQaLBpHvg^GTYCAC#Ui{`$qA>iw5@o7Ag4H*xd!vgW$EX`9zKZ|eI>(06yg z`Rf;(-(9`C&#(J8_4X$3TcNyq{|&FVeNHx;ul~4c@y(^|WtZ0i(hsjbbXD2po9iag z(e=GN)ay!1z3X)L3zeIj+gHLvAA>1hs&A6K?e${UM&;f0->z?dxZd{l{yE?4Ui$Va zb}#=Ey!7q$KD_*2y!4a)`vXTTd$^t~U<{^~7L0Pf&#uZGR3b?lxJ6?nt!!jwZD1A! z`q96@C*0G|rp;qeSdHY34?7<(r&_qVZ7(3`EnJ)2g;rGZXd4wLx#Y|PhBZ3(;Y^#4 z60goZ$zKMkV7vtmJhkQX%pRI`$~W#OP{6CywK2(MEuqDf%)DjM5~+*b^W8_!=v+Z6 zFOqsL-rwiWf%lr^PVEdC6KvAx6;$j8Ut{;0Lsf-hG1)l?X0~iC8Zv_{9NLf>1mbMS zJlc}nJ0S1$B!?PTp`U=&2^E?on_A65*^D)mW`lRLTDL_*W|)qH88Z99I2$ti$@1%# z9fJUY0#EHbw5JlO?>>FXy-yM-<*F!B3MKXSinFSxML%W`ti$T;``J1*KV}^#;0;(d zj60pI1z$ZIQZ-Xih?*4J(2>!_x|n6PnjQ04G-O@~D938ZtOUY&bP~Ky3rDmj#s`U!G?$)QYBhSVyeks&x(xkv zP(L$P9VA~k!mI{q(U=)TWN*`#6^JYr-v&KH3@9Hu;lkOueOS?ISp&@>HEmsTPd940CV`Fk3y}Mvqiv4r{Y` z*N4#YE{jh_I}9FG&PjH=;-eBOKyhtV7ax$~ENfd-nFnDQQ<)D=#Br<4>*x?RykuIi ztC34BGnuRvp>Tl`Wh*X}RcKao)l{0_Co&Jiu}5S+Bo|Xs{%W@)RoRkW{Yvrq6J70v zZ&~X=^nn9-J&ot3(gPcpR3qE^;UtNA`qa!QtC!&%Bo>-AHCq&=2SFUs8V||hcYoRZ z7u@{2q-x)8p1lGHaXRzwwaLaOtDyRu ze@2*8)&WC8%c;x^_C>*Zl#>C$`k)(J{BcpC{>9f{I3KXKpN#k9gWc^q5ff)_P6>JS zeSa!uEXu|ZO)D-qnpNX0YSM#%?AN3ZiHF?i+xn(%7DVZ#hfW(3xp&kL&F^*_o1%AY zywVhkWYY{P#nglp(pA!@QsSNtGoz5~SEUacn7po=+nbv=uVhQv)W6?c{k>N`r>ojG zn6@oTejD%Zw;RqjkgcyaujAdO)gNl#hVC!_<6XVGcwc=jmq@kU^zTXUNr2Mbc1HwN4VmK8YGlRuTJT zGFK%kYuRwyCzucZ1w7#zdE|om>a8*ZB@wogw2*X+ae*ScL*>c$NBs;n$yO-sp8oOTDm`SBnjH*PY$&YBC zXHMCo{yj{`S^qw&cxvsY1>7N-hAOtIt@Sl3%ebBDYUTd-Xgg~to@@F^YuiNue2~Pa z)-+F10AB}-Ljyh#?>Z{A2sV-p3gx3hcBrDc$)W&03d&gke*u87+YVXeU8d9! zC}hdnO-=fJp-}7<{qodKzLBl1`-^6|9#_fe1D40c@`wyyRWm_{^!E44P8RL)H{ z7Y$woTY?I$hb%^Rn|blrqTD^m#M8>%-_+|b?>0@=ta^L5{dMZ*=I`}(D=**Pq?;bd zmYeTiZDMcaas5FmzQ2)w-(9|WdnMo6RpaIH4 zNd#P>6_u@{uK9SCh@Aq5*;k9vm3a$}HTv+AIv0;mX8jeW#izUAN%IJ(HE6Wcu{R%E z(jHK`wjD!4J(KtSLy-WzY2-FZdA@dI7Ye#K{o!D_a~+i7A0RgER)EUOW) zr0r}Kn`jjQ#Xhfr{9M{uv?~T#INKG^9u7(O`@Hd~c@$=-P_H z*S3XyZpAPhXSd=UeNP~=wVuGxP9q2`8&vNH0?;HOgVG0Q^;z~#?z?T-W1fXji)O_j zh)*p*pQ2f@GQ5EhyyR(inz9zG4b-Y)S*+y#FseY-DbBG_CTPjcs>c@HiWdUQsks%n zc2EfGz%;4RIn$4`FY|*V41?B8kyZ}JJbC8w8PUZU5 z%HmONQRs~TV$e$bLrzuH5M@IONzVXTv?~Syd0M+-TZ{jLx~Nq8d3b70rD&rfO7b7uoSjcTTeLI=xjCGrVSoDk(^qlE z%^xoBHd#J>cVBNm1hTT4+`YYuKi+lEA>PTByX|uR{r0i{`@jEB|5*u&Z{@{)D3jm1 z6)j#}{pNwSPk-T)<`XnI2ofys0Br^nYqH95AI%3@LZr%Bxnhh@SON8{_-E1J7zFfe za6DHgdNsU6%9Ftn0ZNAAmDah}Zj`K|Zbmgz6WW+eh;x~G(cl<_;#^>V_e=f|7SV^&7~1~m3x0q)D%>55hWBV5q+iP z)1LM+!<-yYuO8aqPDHO>$A>H$R`WwoGgorRg|v#M4{HQ%6l3qOXPnoDZK!4z8!yS# zqkJ4rt{#euk9`2`N-ls5qqP9L2GlKqyx)-&P^I2Gp>=7;D<``UM{BFbJso96!8oKI zZ5P3q&#U|PT`BeYO4f+imv=pCy{?-N)q+Xh%wC+jeI(yp%j>zn-R*_D5iP&+$4?tJ z?xc|pQ)_D%a{$?vGE$UiCih*+7Zt$QC|NssH-l|STONh&374Q_*OpfXE*gSEJvG3m zmP=r#RWOo~BXCh1oUA`FajdmsakB|fi_-Ea69`H+(>rY*IzMF-jc45y zwSH94lVs6Zk}1MQS}!+JktX z06Rg%zD4b4%7oEQ_fA2Rsx3)>+B&UNL+!okjp8IXB)SCbTeQ{8ryee<+JjI$sj9u3 zlX>&*?o;a8pZc;V4JUa*Bx9xyRs|CltCe@u>(3ynSbS3)lMhL!rfJr}YEjuv_l?#<6ur555&zBOa+;$bgIfbPpm9SP-Ly$X@wTpUIUbZM~53+D* zVS5mW;}*78MmEI6hS}~kBG+0DCP}1Dy`UaTlfd1x0>XeSLB4mhmaU7*_Ang>Q?~bm zaaOjU8;QXaYi}L~Cjey=WSOd_E8E4eVlqu7YBn36V=J=^a#7hH1o5z9<$e}VQQ2O( zYO$cwkA+RJptZV$q;i!H*c;bJ%|_W+J!_q#gIPYdsBFIwSWZpZUOAaw?yDu5I((!W zDT0>WO!hUo4bUUtsL+x#eH)a>=;Co7l z5?J!2KGXoKQ%)kJqK$`MMEkh1JqXAlmF@j_EJ)gCEqfAnSpH)llIMsvluQzT_@Wht z*hAugz3*5q++;6;+2O54Eqf4(Lu%Q65sEO6L;76HUgiAd-R5n*y_2w1UdJZA`_KQ} z#5ZrRF56|j+g3cs>;Lbv-v2lYQhvpco-|~EU2l7Dr>^&ejRxCLY|uM{*K6QnfmGwv52<2Sq2;JJm|~-c3^c1HT2z!5 zo0$90H{|k!73Fm>IB-ECBzov*@4akaK^5}dU67{>41J6bfZT%G>U{HBRFnrCq?-X3}?)U#?6xcMMe3Az;bGe@;Xq0_rVfRoMg=*R#TJ-UKW+4jf%3AD1(Np zZW1J!*`l&2DUWh;mXu!r9}@7IUnpnD-;n z+co3EN`A@9@4v6N+d*=hUg6y9mEY7iH@96u?i@JU-vwwH<3KE>HU?_6Gb89(V(jPPY=Erb?j=|M8j zvh*`WqL-2eXCBH2b4J_eg88KTsEp_p>tt0ZrAEWPPl&qMqe>4l@uaHsxp~L)=F;?b z-A9v>jZrH|NdoZoV6%OFSaY^&o{-;f?mRM`_&^Cq}Q?F zjSk*fGj&FEHB+Um$a%Q~z9kiMA0(bM`BF4Mm=&=u3etlt99WPZ1>(2`>2+|hF{FXQ z&T98IqV;`tp|w__Yfc3;O;{;RDN)gF=2k2U(!+2ZN{}Al;w(r%HxR)EbQ)3bv?I`| zI76h2#@>&i2$Q8ZV+^UvzbXZuk+>*G50ZFLjd1|RQxv3E!a`sq5#zAy=GxfAn37Y? z)}k;$P|+0mC!&ujR?>D~iSrAA<2hXR`(jke$+1+Ws9lR zRKqkkE*1spQBDpiNRRArCn89%lysb=Nsjz3f9FCjQBRSoiG5;9kg&M)+KpUGpNN6; zVvR*TdXSF;>d^yqNO*GfGa-8Zr5DWvYrQUa?#6?2yL747wVQ0cN)%*kA)_UAmUJni z6IjqXu(N)wi~92*5(m_u2axzfZ+UU|L%qFwwTbulRle92;rpA-n|SxPZF%y$>l*Ls zPaAEF|IA541sa@n+5=5xVN?@)R1K<;h{YR~KvtUEpjhKM+W9=)Me%qLt0!G%j#)fj z%>)`}$vrq-6t%8`1oR?7ObESFFesha)La5loguL-9uG2cIPrLZiuzVE;z`xLdf!t= zK7HRk{#OXcpYDRE&7%f`_|WOj>S{C8+-Ii9&L{g~??j#yP_i+QPQmS&=)42(XE>Ul z<0zN7zPmi!?zcD%0p`;Xe)q56Nv8dP)b#I@Cc+Z2m%F&L5p1+sM`sm9*GIl}K8>fQH#K9A$d8x#bT`&y9 ze!JkHK;#>F*6VjS@9q{|gMak!N#hc{C(vOs4_e|>v`xx|+RcLuDpbqLR5ZC3`H$T* zQgW1*z2?C|SvhX=VC51*7Ob=2rla6h+uk5YY3=1s=!%jiN!AoyiZMm>k}O?3Y9EY3 zvDZF0C=~C@%3p0>*W1nCZ!UA)^yRFU_hMYTeRua^2BgHcm-oHtz~=sS-IUwQzt`I@ z?|M`28Bd?+YNw5&Wh42yH`6$rjFQ6Vtb%nC-q_qnXBSY=jIY8I#`#H#CCgzH#V1{y zj@xoryF5uyOI9-QsaLzsjG%jV&T=n8RG|f{8WyUunU#Y3`f`s#vCnfjY{nRj`C`yTVesf9P?rB)Jgzkl!f@7_pFbVWd%5joc1wlF++v?7k-NhD zzHw;=BXLc0CAkP~K16#_YaXWKtTi81G_{gMYrSN9xC0Rr^_q^VBqr+9+=J|14Ovk$ zCD`f;&pYTYYR!WnKDB;$idyqpR=g*Y_jac(LJBc@=T)}JDlFBh1cFUVCdc3d#ynfK z7RBZl0?VVj3#o10_@bEVp2%KxL&jq6mlg=vRhCwQZbT+86RedEQ-^Eh&-)0-8*nU zgsqzr?_O_nybp`Wrd?g;zt!8#&6~?>S!J$%*1Y>;fApjwlR!uQD+uhOVwArXB>6m>Z0 zhKy=4XbQQt*!0EYa`Ovex04gq6i3l&FFPK`JyRKr$|v z84!zd^C%E!x%nu8A^;3Hxu4!?&@C5L0!h>?bV&+jQ5pG0iIidrY1SxXQEwgu>Z~`v z3`CqG&t^J3jM*d()D%FMoH<7ogJnh0K=h_T=9%cTs5TD*azM3ti^4AfnV%)^l5vi` z47mp;S2y3^Y$TC-_vZ3iUf|s(-Covq_2a9}>&xqHyOempiJLd^s=d43zV2Crl}~Z0 zlSWYTHUI|pyErIC7V=zB7`?K^6|IIFABx+=}zcuo>CmG(*d! z?6Em5XlU7;a^IcIc952XEg~1WPb=a<4hq){1gidtWCnn^6v^yuoZtk(&y$&1g|=9t7%u zYV!b2U&)hS=6L-xsrlz$K500J0z=Gh{mL#{U*(T6M;(Pnq`1#_mUwl)qWhJ?} z{_Z1(zIjvs+h4zsoom}fBgwnc`)9n`#QuHP-`74yVzc=+ z-p1GR8{f%_buH`EodnO@6YsZ|vPLy|zHPgXufF-O|Mrc17K?E4n=c-a{o;L7kN;=0 z<`r#U$%j|<>tE4H|F!gn4Pcn3+D8juH8Av)vb`@ONkCCqPnt}xs>rUduIjI*XQ?C+ofP*7)A&SCD9>$%0xcG!Go&ywUHXBtFQ*;Uw{qVC~!% zucgC~Mnc-zYnH9Aj;l%`%NB-Y`rIB? zT057kH^K~GJgS?I)A6`&eo!#Zy7_Y>k+cn-J%_2$Lw2c{psJ5Wp$|?)C)p@dA!mz? zt?bj~vYT3N`@x4g3`QdfF-aeFX z-qcOG`QiFEfBoV^uj()F=547jx=j83?adE&a{+v-S9ksUS3k%0y0hnbc#hL%+B)z7 z5$tp_(vhjjs7kdTHPA^3;Z6Bo(wqArUz(NlE=k&>Oh4fockGh(IwnE@@cyBCDMhVA z(V&{{b9{B_x1!H_NdRC&aJBA}v`3lPCutv)igU}6=gA{j(~ljn-i7v(=yj<8Rkg(` z#0;|WQB&4XmQ^bt?A5XtJFkb29;SHKvOhNr)*B3x=k4|@PZ3L!u)GG)y>l$6;YroJ&TAe&aC7W0J zZ&m^q1m10F5I84ms$%cGLhnfhZ=1?7nik|HL7UBNSd_9~2rS1cWv>N-0RjjUyOF?# z68D@uap@JiC3g$VDjPYMY9XaI%gGm|>`@@jQuYx7CCL(5z-a(^iX21sNqHW6j?8y{ZC;L@?EB z-?W(>nq1Vh2ibUPO`Dha!TGWOZ(mpWMK9}}-1yC#c>OM3$%1n8_j-FP+tjwe`hAO$ zz6{;oT;07NyZHU><=f58`vPnUm9P76xY@LLbzi&mGiy?^)3w(<(f0Dwlg*y!2-NMh zJ83Wij-KLhN5q_SQ_h#F(2(q;wP}@u1bw1S0)Sy5DunxZVf>G zmwO|do}2YidC5Xg)eOkpNxiDzVvoE%2*s1i+vg@GPa1<+N#u~H4x~nsISc)i6ZGEx z#cP#HAeAj9R{%WH>=fRjhP~LvJ$&?(MypHGI(wzb^g}GYv7s?qp#+Qpvi6+gGIR)w zTPR!{y@tJV2_g)d(M+{UF_uuMXypy`zk8CP%TVtEm`rdXM5FgKF&TwnNW?xo5yvfJ zucadp8#hz2T?9$>nY9tC2*jD1ib&NB8PfC>g327q0&3TJ9ArXNhBASqOelER}# z)r`-kVJ$JwOw~mhdyuESGWKC3=52HA#g5rWB4MxN!brYkoe9&-d#boipJHe%skKAJ zzOd@fMxay!w^>QhqJ%xj#X`62k8NRcP;y?syS=@vHr3MSl5BN1z+8 zBZ{nZn*C&oRN1k*GAH|$mYZaY+)r1cJZA)NnsL_6&Jr!k#)CvX;WBgVvhm7j#sxzT zVd}{rz@YqLH%Wc~CA@WB^>Q-h*s^W87U$-3?-pg_K`8dg#)pk%&W%2vHJE4+NS3PU zoLcj~=_WMR2nuT=6`kbh6f`l#;4IE|zeQnru_b%>=y{AQuv{D!f$rkyh2@njc$RmG zrUUc^6IfZ0Q~^f{BMA%9f|4{n*rt8UVRnFiQCA*h;n2GBAP~o`E3bpY1=*N@ck2Xu zZTgumm8+9=!a|dq;fu1V0qU5tw=*kzQB@vh<6x@tek{(a@^jSoWnXRdAc%+63HP&jilXw$s2g2y!K0bHFioWyE{Z`1xj!bV zm`JO_Ejufjz0R{8ZBbNyA+Vf9<;6|Rg164<-7Z$yc5_s#EE!ktmM&yiZxxzabI37j z+}Gt}l!t?A%KLdZYsv>%U_646wPZ3WnlG(|XjQ0PRJKWWBUyeFwCI|n61<+76pNzr zAW(-Cl?TG*v#9)dD#flJGIqN|@V>POR7qLtm7_6}EHn~0m(VB$t(!?RE*3@QK`x$F zRNha{SycYDOO2&|9NA9Q6#X2Ad{KGmr&HPWjzT)A+PiKPTR{6+HN~Q;Jc!gMX|{e) zsHSG?mu1_-<+i@5Z&JOL_wrVjrP_Di|F-$}dE=Mf_q=RU?WOSbH-GK-bF=wvZ8x`d zBiGvW6CStq?(NNW=?&Rm-w2US_P~4_?_R$b6E~OF_x1Mn-P^t=wwtS~n;+!D>BsG* zN{y{v_t~I#!i`Y;XiN5wf8E8UwPcswEVYC+%J~5eo&8jt+uS@)9z8Gyux^)$V0Dpu5@J)IB%nE|6rCg{x@awH zS75jAl;-jvf$(!2v$8kJIG?vu@+^ z!IJi7ca+G-61(xIT=Py?XjVdcO^Sq?5JM@Y%_mnzgMxAP`JNq#1Ww3txFeCg zPbS)+B6r8xq@YrDq@b80M3xxRzSARvBo25t2Zga)dEb5gyFdK-FMs;WfB)mx-(LL0 z@9xXZ z&Fupl4_`QKBuMU{7Y24RDF@D6S&`1NY+wNu!ILt^NZyf9%Oy4T7;?-F-$dzI$CauLXje zwu$BM@jBNccR#`<3KX;|f&!LUc14oS)q<`Al6@4XuhMOLXq+fSZUq-rEInyJu>rr;o~Pq>5~ zxiPVJ0rSM#YCFxg>V3@(*{XEx6_UxK;u3nPE>&lu<1~+emffn+9KQbvKNS`~Tz1Pd zUEY@2vh&j~o;DcF=p^2qhPoPvlp$En?$`o%M}bwyXxh*k@TC z6b#vKp*WXOH6f z)8Rb0K6Q9ENUi7~2|5)CdV6stp~So3i>g>NYXOOA=3p&&6dysy*`qkBP#af<+M0ux z)oLd{r(mtILZWra_2IEjac>Js&Q&(1K!#bF?}A4$OyX0^&!^;3tb~MtELikY*zKq` z9s2l=D3CZWpBdTFnkxytE$HIohmc+jB**JftVF`H_T&QXb};a!$orj?t$paUPEk^H zZ)HO>APYx|KWUr3U{Z`DaW*Ml5-5NMHOYtF0Y-~#pn)>o`o`j8Z-SOo&(%w2QyR?L zGc33i!=OB^OCdM9*TTyR)(g>p;#Dj?blQ-3jqG_U?lZEv7zs*LD7}G|(MiRQ41$kb zONg;PZdeR6a!A8su_L+n7e6&D;{BVOySM!q#OAWkH@NDD9{LG~H*f3h-OY8Jx{VU?~jabhZ?pDHF~HOGvak z&6uf>ZO{})*IRMMs#5H!x8y?AFjm&HVfIUo!g$7gb`+j37qU=ztI=T`xBuP{yoA!v=IPG}0QY<R(2|N=k$j0SnwHJ#{!61oGEdrmNg7MaNRv58% zl7+D~EYTU|w=*yd2Nj}Z;xQ2G3^qoZrQVB9!3%-pc%1@T7v2P9>lk*OC&+4NLdnW& z!(Gv+1_ zRW7sUhl@VJAR>qK31|_K`Q*~B`+t8M-fiB-yAFyx`@5X0+{e4EV{rE_-PQkiC%;i2nS3=H%lz4%?}g*+ zR_1n+_k**3w>7qGsAaZF=Ozqcp8{Tbdo)u*fyRmKEVo&riqVAsY*ajBFu*utIZS(>)y89zx4%?b zF(m2ID)xSy$x<^En|3(w;I>9Heo~|2gJ9F%U46=v51;s|r;Vm|!5ZtrbYMMzi9sTF z$>~5LQBnbYlGrRoh}n8=XASKa$)rUx{bzJD{34n2>Ww3HGgbyQ-e`0jrZG{a78jH0 zGBuWM13$$agNhUbxrWKM84Qbd#vlxbwlfBaIBq**B^}_{pk(d0T=CzVLA?GXY2>#Y-c<>5(7I77N)w?8j1k|RyOuFVcB~XZ15^M zhU{eB(r$Lfc+t)nB=N9H^?n#n$<9~_i6!bsucqptOetXDB&x0E-rv0K^C0B^u}G{Mvpo3C*MEKh zY3*fB8$NA<26S$hdo^b%8IzQeO;KS#?;E#AZ31e^ykrBT*-_s`yI~N%CtZ$?+iqCN z1d`k=VPbduTi$conW9$3X5Cw9OI+je{XeU%WV!C?v^1WOAI@&rkHzuZ4J*N*paa;4 zvYo&smh5D)s1O8DSvA@u(}q~iiZ0YFtu z^Sudf>?J{7Wh2X!sX3eZOu0q7VUUGG+YN(29Jk%D77jGV5aHBFve;&VCDq82!eE4s zXrK>M28XWH?yo;?Hw@EpFuP$t7-zfT*^!7^dj~=90__r!nuVq^IIEB`s}w;ivMDu3 ziDQ|`hKqK?Ac==nlJ~=SN_N9KNRSEq_I2(~*hrj{Bn8VM)h-z}C3mX!qsh7y8?l;M zGPdY8ybwl?*KJrSBHQ3u5~tlcVTZYtsEyK~qrzg0N~UV%Bm}~YE>)aGH;ZP&C=mxW z8%AQAv)S+woEQSulJD#?A_T-*o2pQ>aFS4QC{77W7}*4bI?IR_&4xiv4rw+FP;x?N zC)N?d%m6Oz0%0Q&M)3fuILVtaM_EWp%c|8DyYmnUW?Rdm@h}L;A&rN{xtctmtBLSW zoBP+dH}AfGy&WZeb@TmgeEV8r*7srR126;M`N9F>m4|OE8SAv(c~{%q3Tsk!dp@gK zrxHL>CK)f^<|>DoceQ9A3?lS|3(T?G2Wy!yatUMnG~tdN#FCO~-V}w7isIV5D#2G~ zEAa`>8n-Rm2crr0;p~I`SRB87unr6p90#(vvlNHAoqJ7RP_brEIuwmf`&`}Z5a}YC ziz7tfb54>zS@&S&I;A}!(A2D=H#w24DN7zL?|-x^rKXkD>>5?F1!vWri{8N?31{!% z*`omlwe`k_UA)VQGvx>>G4&Y@Evguua6%=Lx0r!u>%^jWFigkUJ2*$#4~rC`MrZ8K z?ykTQOK*6fW9%Rnx$`K?lyD&dI9ETPkhf?Z41)O7vhXQc2P+u?V2yU_Z<}n4sh_@- zg-IAeG;&8E%Rg(jrP@aGE<20X!3$yJc&&qVMA+^md9TBC4l~DGB{i=AO;U50B)H+G zikEGUu53tRKl|Qb7o6Sh2wT z^!B26FbK-oJ9rt0^w|vT^b`qO3S66H%#o?rf;y+Tm86PpuJ|BP$-KsD(L5L=9d>hOp)l5#Yv-~ogU;&sV;649&K?PV5ns zL%B_+8hx?H%@|Gj&u+#6!7zH=@DK!90KiQVQj8kC%Mub5`~Kim(ri`JDL74yFwUA* zEV~(lTs*0pQQuzX2aDnA{h>SgRQ8~|U*%(bx(l8(kHHZcXQqg~SQ89mP}wK1Ftni9 zL?MBM%0Mwvp2cHJIPSpv8IGTE&@|g69D}(yb_Zi63#_dH^kygg7_P-~OG=aE`q<<) zMCY4w**WVSMyj(4_azTwl!XI(7^6TOwTH114hY0n!j_!|RI^30U<8R?^`+(MLa1H^ zC^=dTtmg*Tl7%r2$Du5Y0WQuK#f zAKJNi)WaAh@u2$j0E{Q(VXTD&iA?}MRg;y<#Zu|BuzH+r4XYrVovN)S;%q}ovokVF zCdNyF}mQ`a40vxx8AOxMd2him2wbbd}_cx2EtiylO+>ll#>IR7$cONj)}3B z5Y4@B8|_X&2rZbZ+z|*pQR=F1@`ZY-a;m=f;g2&ymQ0LMLds>ly7~UyPs8D6<@-2; z>ct!ig;13mgL0lQL1kOXd?Jb#=THZnQS`-Mzxb-%*V|3~d%gW}o7uhT{zJX3U-nTC zIbOZ_zyJIH#I4z|X*ai?oj~Hd*aJusV73bN+Pr4F;;6UJ~L5~TYvq^R-z#_3!#H#uZ)jO=Xm`c(T zcU?R#FE0+7fX_Ib_;lsvl`yz~-mnm`YY=C#ap;AGy-mA>)1Xq7#N48#mXLh1d!`eQ z!f@7?pFJJc138D2G3q%tBbm8s#`zC}KeB`{32oPxZK!@vd!2DO&ie9EMM`EBh`!Is zMsIh?o$!)N=tm8qmp_~8WtEDgz^9OikTuP!c^2j6K@gu>IXoqKc^xBthr%JoVx*Wm8Iqw5Pq!OM&Eg<>i$~u$Q}qdO|{y>&Td!Dt0?m4MA=| z1Z86Ntdy3?TkvPlCF9;N4B^TE)MZpz;3dXDoRZxh1K4Z46dzh}4NCx7b8u?L9 z&hql-BE+sdfF;tmA^0|Hn7pVj431y@}d+xh|*aKex^wDS*^xF~YISi{uv z%jv9js#;m7eY#N4O8Ai|)FR8GqHCJZ(_GYohv7JD!RJuvA$oS~t$EONB=?c~T(qj- zd#Cl@1~;3c3PZ6(r8g$Lcw7q}1o5e5zEjeIaou9Y2#y4joyG0F6GTX*(1ejjQE}~e zDWMi%GGgA-F6E^#a=cRTIwBkg?VX=;?$iMZwJ2a+6=DSygau_Bxgy_231;Pii%Re) z5oaa%1#trM?gtkh26^~q3k5Cr#(C~iuvVP74;-Q>cdOP=XBp9=6g&vZSqlDKh|t=a znLysbL){)hHO*v2dD}U#Bo&d3G8}Sr%3Bc2NqKvDeI4b}o9mk&Hofcn z+pFGYWqUgP>gMjQzl=BUuI?}2%J;O}o9p|#Uuf8Sf3Ls3kYDTw)c19Nz9eZX1#hOA zVX5S7b5f=Bzg~x0qC~4z&OV_dVhA&@Z&7_8{Odid@6Qy8eofnJjCSgKtrY@G66t&Q zO*9r%(x$3DHo1=Pe#s);Ncj{WRGHTXIcn zWm|7zotYG~ZOZGMOf4}ao};-$=3=LP_>99)!?LC9E{Ni)3K(kW-4p#`p0o5GAs) zs3aAUt;|=JJ5htqv$}#siGG-lLrL@lV4NlT=SCvX&kz_3%28`s|Hp{U5L zl}iPDhEz=6SFb%t;z9M-0T@q7qhAM!rO@m2{myOHD1>HwQ$VXjDKj;LDF$@u1V;MsZDMU8%x zh(l`hL$S?iY4q!6T~e@y<-=}wk?aT^Qc$Hi*>6mL|d9>D9@Vh9=4?=OkCg$7Q z|4S(R42mzm`2AP^>(86N{PX7bU;n>fee>PFe)IL_t3UsK^Uc@){HL#f_uU`=^5-u$ zzm*;DZyVaE&EG+P`9ROF`q|UQjDq(P*M?mij}RG~39>yw)(UIxGsT#cN3a!Sr!tl< z9#@YCF?+&==h)Tbbxc^T-((s`c1e)n5EK@j6uW}*oY|RJT4A%dbbB=KK3H4v z0VSTF&e|O=wiO@c;&7(I02dER z$tUy_KJ7(MnoB@(tZkU`tZZx6+BQ`!%N|x_=}N^11r;*NlBMfjOJT9yz4_<~snoD# z8-r?El08f|spPCz)num9l5G?gxkL>MT%w+LK|4-M!LIGBpt(zRyLhH%ELpd{KFNB3 zp%@i3McKZuc?D0iQ;e~K=w3fo!g(En2#=2>iPSq)=+MJ4+P@&hLLT?K! z=~vSx$5PD%mm(FOl{GAS41ThgN*S%4N9T4;}`up!QQ%;~e_(KE4S@1}8JEoxIG7qir7`WVM58AB@NSgD23 z^u95tJMeyn<42D6SjkZyN&Efqqmsm=Z&#KD>yC685!Mx-{ zjKXmCA)Y@S-q|2w%`~~)c-?iJtOOF*LmI1?Oh1{Ap->7T>zQM@WJHY9aW*2(!Sw@) zj(TTCA8@y6If~1{lrvBi)>Ia#?+^q zWQjs*k~i?;QSV_Cil_A+zI$Ca{~WLK&GqJg_2xExC%Nm*ZgP)aWyN?aSAErQMvdF< zH~-@=|Nh=b$no~eyUkaBe6#g_SToHe@g+2%M(n`0%A8mxED;^fh5 zPc2bW640T-3RcAiRT-`(Mfn*!FR@?badEPT`RIAOD|qyaJcf&-_c_+VU?hqGVB*R1 z$|dWXRBlNUI!s9gEKOCHVsKfAurv8^(dHOr;m|h6AP~oGbF72IY2yGHb_+!dlqpf} zttf*m6rNNng_YG$@v z)j#u+Z$Zh>*p!GktD0VPIR;5Qta!a2##3`S)`8-|%iD+3#Gr-psLz9`QBKI$_7)9csF2_iGb6PIPN>G3#5puv&o^Cls+)nT50!{`kdAdAlXpFv=lFU3$UvxPJ zK{=$$F@VW-oWdqw-P~36?(K|`Up(-_0pXRWEesJ8>0J|j*<^$E`AoNEISB;P#jPw z-jBt3K=r>p(Fe!HglEjz=W$P*as4+Hy~tqk!VP z1lDX~i^MUOeO2!-1eD_ygx4Y=F%BC&9fU}l8pouS51{+ZqNKPLRzb&_y|*^EeP!>X zNSp=X&j||ZRiI!n&N-N3;p$zKI}>D&L8nllQK{6XAR3#sNy(ep(y^!q4|4Jx^x%^i zyo<1Q@UE2{*-s~E2sv@cL0NQtWK8oaHqFW>&5*V8o@S}@q9Qzq$n#W$VTREkzkKt) z<~&~Azuu0R{p05D=1skqAGzE7$Gdvh@AbAKy%dW3dWMPvZin-mS+d!9zAnZJTU^7msVtgVdh2 z=Vyup=wQh*OjG6|vv!=UJd4Sa+H+A{C95)^t24#^|Lncra%4A>=6TPjh|P=Dj+r2X z18~57Z^~2}wY9pftIH%!kBwQ~;IEQXnPd*hlv;DOud%PUPqL24ijzmu5d+j=B*};{ zRZ*E_FoFvF2)KXl_*_SvdtWSS&x24rsrDSpkMg?jZ?50pKBhbTV?XUl!zr=4BOlCk z)y$dZgXXA=&)r6q`u#)Mu-JxLoyF#1X1BYjP%q9cFb^I%%eh1#3@T(TCoTq7)H_OI zvatb2FN7|$31;yGoex7kPKDa7H0co-G=4n1n(Re7CZ`H>AJrG5ib2cEYF)@kvLD?Z zfA~=rh7{_<198*}^-4I50dV1?qZp#`RD-~Qy_=nTua_-Gk;%D*pl#q;3(ulJJq*YF z0`)<;I1ALz4Mgu{g@UAelg8u&vTn-gKAJ20tRh2|V~ewg#=Yovalbx22;zY3cu*Ek zOrKuKi3Hh>b(kh(V`cE#YK67-daHa$fk1&{%W~BDtY;OqMS1##aB{Tr^hzQaC2w-Z z@8X+;iF1n27!A^ns(B(^99`apJ%m>b|i>(jf%dq#5{X`^OUZ|(5G7aFDui zBF>!y7FFWW1p7B0C(mkgIeHhAmE-^dIqC+KyW3T$CCru7M$($D+vTW|97if(s@6kH zt<5#uH6rf50>eSU_=kkj-oJUw`obeW>uIBDJR>8zoz=JYI=ASeGNn(Ij1?7QAq63L z4GkRNzVgE27y|p?@v|$)w2NfY#nG1+*1=%Nc0nfWf}UoAmrcv7QiE($>?N&ARnDBm zE$M9KpP7r-VtHYZg+rGY27x&4^1{lU!V$Z`cADqNv6;%cDstU1mqS(2cu<}whD68> z_BFr{({Zr+!hSH$^@Zm~VhA=E=Wy5mUbN4)Xf4ZcB@l;xeYDR`x16-Csj;^+pNqx% z!XSu;)s6SFcxv^9l?j_RJ{X$XdR(nobj}jm^r*WeuM#>^EoiQ}4{CEWHE6NE@Ip8_ z-ulAIGt7JMtp7NZxXOF(gKjE7kTWbcr#M+w{Td(_hdzf{gtJ&+7)9cs1%{FM=Cle7 zD?uUD1`)$9EwVbcoHMDElI$J5=O#K0Dg<3UcW+zT=Z7)~${{NZ1DG6rg<+l1u@GVV z7@27@RyLugo*$do$M!)~2@0!bvLR0`xjdT&uvlRj74ExDBy$Zw183K+m=)jYs zj@H#>Fen>K?emLUuT!Dx4osn7cEx3Vaes+n5T(WY6Q2+!w*-^X7js9QFRwP2S9dp; zKfLe${r!*E<^A?oVAHN|HnBVTZ@&Cy?zOW6?IGWL+6a>A*N6djyP1KB_#SXz=f%)JOwdYdBr)Od7)uX3kd}E1Is#nw+cNUVOXsRli9U6$f?3++K%EGx+ z@$BIM1D4qG)E_7Z7881-tn1^sdPozk^-AZav)1ypHdBa~N)_XDoJ$qwVCv&GWn3SC zvpcaua=m3pt5h9Ij^$DItL%Gcv&puF8p=$8UaC}#a`@B=^r=-UR$}5kIf@FY@G5yZVsvWJHOraJ zOu|_zRE%=+ED9CJZ`{6;4{#Q3&)3?{@ z`tJ7g&6|4n+3lvjP4VXM|HrHCpyHc;3YzPM+`{gloe%jeNtFy27nYY9L8k z@hY|wm32gb99m5?Z>Ys`$SC3Ga>z4f!f0!Ot)2XLFb7?d?p-*bQ(a}W#!hkpy3E0Q<#nH35S>=hK~+tok2z_|aaJ2!tcMJ;aIS|u zdpN*221jO!+;x_)9R&xEz17I%+J|0CI!HoCj1=Ut7x&jghUqxhL(b9E$0N(Qz{tES z+g8ifMsBLuK5nNarzk>Jp%mRmf?=XPqYFksd}^Wl)CwZ&I6-SU(A4RXB>~edg92Hj z57yEok&mSMI_StYL7kmui}jEfg30mLLslMP-WUfU(eCc{A@w`;E~^;(%s{M3jxfWr zD9uoCm}#Fi)G!j~ddMdQW#uGW-`{yc*zFx;8Wb+j9Wc8$6p*5tP#LU-or^ZwS-!ql z5E%sJX$vC1t%Mv;31l4-j>#MJes^CKEV`(5?`VIZ=o4ew-Eqlaw?{4aA$)n`aUo614?g>vGRx6mY z^LlD3Y96&uUh@4uCeBdnmph!w8Rb+=R_8YBAX%y>;fq0gn8fwm=fU&dt&&$P(K_;HGm~ozT@%-786O%O?!_&nhc9lX=sbF^> zszD_US{VZwggV0cB%Nhc8{gN3ixe+ViWk@5?(S}d;O;KLy;zZ;!JXpnQoK09p|}@! ziWe(ye*gFTth**FGjq>9XYc(8SIBS^MAk1OCz#jLTJ)Y4cjWhg6zCNwo6o*;SWHdu ztkuVshIEe{B&BgJHki_=B=eDYKc{r<)AAky-~D>1AhWqc+2lR@D%8J9UhyeM;9kkB8EW26wwHRcM@j8Eui7C z-HD?hZ%+`jQWjN1vhHvQi49$7O!xf|-H(|c_8+)Tw}K5X~?DzmF}Iy zUc&td-t7U-$9ju7EWID9C-JYFOW6z4#Rqin3T%3S zGJf(y_~4+PL&~_Q;P6?W^+xtk=Dja&bW`Yyg2Zpn0#|QDkh6X8{Uj2qgBGAhhZw$m zu!8Z|9)}FyjGc+p3kAIm+@pZ|$0ruG$G6%zcth)rGD1R?#^7R8T;FJE#*b;6yz)2D zU@-hO1%Vn11=~IPKS}X_ZGUeLKI;|ty6|kB=2)1diFJ4UP1SnwPY{CF^C30F_j}O( zYWIsF!l~gZj3^V~?8&uC@nM0d)Av$l;M$?kE6%yI)@2*nH}0la)MxI)Ad5?|w8Qs_zeZ(Nis2 z#}yQamPA1FT!glild@roxMGooF@2_XRV@$Q72QaL#Nd=Mun)U8gs=X-tUpd)ZoYw= zl&d7I3#arU6|P@vG5mqQ-(A-zGQVkx*5FSksl5rD3K5nTb6C=!kB7wo&c(w>FK!Ma zOve;)+Cgt+a12w6>dhRAau)NOOEj(DS&zv3g0f0zh~0tju+|F$PZQ9R=! zE$8Y%_-X&7X>onGQ4eS2#IrI?dn?g0%$Nii!WNexnL&j4yejNQ9Nalh5gf!O6~7ZY zOetip(-26h#yB-Iev!|xa6YpMc_{RHfz_$T=RW&H2S2c87lRtX;J}nl8WU)`@f+e7 z2JMrFF%`~6vWBTFMS_-H4Vrt05#)FmRYf7$?u#h1@u+X!-lHlXW+gEyORH1IEpdfV zeMk;Y0@MHWPnd%=gvelhVy^&Q#a7M+Kli}9fx@pZ;JO@cO6;hNq_STnp|uiHXQy)? z?H~f<`c6iDO${u={0{d9DM`p5eQ}jy@dzViVh`q~t9rYi4w~8;DabJ;B@Qn9ZWdaE zR}R+3No+vZmVOOyLaM}VP7F+h>$9@P=@_V5qopI9GnYYQCj>JBGSn`tldB#0p8FE3 zd9HkdAS2&%%;J_=e12upqakSwI(cz0vw`@7H(KdfsLy13Bf4)IG7I{6m^v)`2rEV= zklyaP_`YZ5#l!bOKkr1=D{c+;JrLXcl*gU8h{PU$TU&*vj)zP zKWRh6!J#ng_78+h9ezf+&B-*cEyO#p&)J^tB*~f9tEG!jaHmS>1nu6 zyVaN-G_(ngu4#~b5t1%aGp3KnwH0-Qxg5m6nuIY=EI1H$N48;QyZ(xtwccL{L>T7g zQh>R+nm(a-Aq`jHMJYB2=+kBr{Tu z{|@q@lPo?(u~5B{#C*+IQlS@xlOaa%YuX2>jUw)ZJTsgRG00#E)-3<7hklxjrp z++A_DZ--H@^)y-=gKwXEwc$-+aT4W9ir4J0A?f3LH}jvN6d`^(pqb@>(^q3%R2ruK zJiG>N2!>tw*uqHWZzv>17;Vfw5t8uZgD)*11v=d^`!80RN`M^3t!USrhywbM^K>qr zbPX*Mk`(u8nJ!MET%S)K{B;-BtCcIeuVKm}Br@yY!JPtDrkj#XaLH=cuW zy8M49f}5L8|MYl=@^_{QdhycUjx`NIf0##` z4ql*G%=6kpA{7D(pY_JIQWt16@NiG)E(;tP1hXM5yRi{6lfH=&unW(AqaX>OV0Ru^ zjjA+-a}d`^cLIwParPO1A^%>s)K~S-N*`I_SDHFRvERYY?9@x%S`f`aR&6L8TO8$B z*h6T?1s;%mcnq2~pQai8?+;fH=7IX|o5>Wk3XUmTuf<*iM7FmlAU{<$+ua3X zadgq!nuLPG9Cuu1>WfYd$}lW^>f$szph_NVWhlV zz>k~egQ+{;cANhF==A$lD7<^>=g$znuy&5o+qraS@6IwEK<(QpeCF)NxqbO&8NBvT zj`|a}S_{l4+<7Ws|gzXSJl|c?lF~O^Uw=bvl zKEt>T^$mHXow>ZuoFl{mDFLbv0?vJmg&A63kBZt>DW*DB(^{@1=%!ZxYS`~GJpf1@ zd*M&LZ344KUmW)zQ+{!HDbH|^MEJf)T8-Aw7~{X9{=({tVwvUh-&40$^737>__rc{?-qQDPx_L$e;Liv}qUF0pZqoBfGu9+EtG?lGGK`_qR@oeh}px* zFfvr0@fmPyYtMoIV^X%0C1y7)TsTJR7A+=ifhymw6|j zcWbDs^T*@K!Ry=R%U$DUfNlG~sO72}r`xceM`q4sUXrMZ+W5o1^y+L9%hI-YxQ#JS zCum3?H86kj_tJL)II%!~!`J5ZEH?)by``R@D6;|{Zk2_Uq2>#zB}8D zBJkHbfZ6^kCXk1A$OT%8=M(JcUPq_>R&A*gdAxXaDXlQIL5-m`p9jCFZ9Y3{(bzD4 ziMI<9FpZv&$#;L)76`ZLe$*VGcup)nG&^BSY!-&+Ez>{RlwPoxp~KyG0;t-ol^q+e z*TGQGu8Y~Q-DDWi<;ix<2+I*oMYXy7hmSyeb*)GbYh{wGz(CpDxF%#hG}L~;$=R10vPsA9_bitS|bzsCMT_W5eJl)1s>xfV}ci#7E~8fzb8 zx}pZheNL<=I@t{SgjS(U-+%Sx_6tOu(t*}&sq0e?ZE0T`E$zv5<5x+Uq)C0>UjcmB zJK{}agN57w>1|wt7@}+?m*m_pR~3?5OPfUps8FeLAd0j43-s)G$R&&I3KNApu%^By z)6}>zh5OKB_IW<5%jv=OMH8P3Z-sMEM^C%|YZcjX&Ch@>iv)2sV>zM*EX>%uUm zpjHKzm{D-v!QbtWaQz@I@$3S4aUkZt8c7nayw4K5dSxy1&CxAR!rC-hdsG)Dl0v@M{KCS zM{^S){(S+5!`}q&bA6z_Rq}`=0+;3mKF^++;KfoR7TU0$RFD_V>V=?XbSVdk7ULIa z<;kKP!?hR#lc2bZA17QNEIK*3*1>F&IwR2U9>0E|%| z>oZ8Yqi+S-;fbZHeRX={d5b(Z_9DOmD3lB*aI@jUjQOk};}-#RoUW&Dl_R}+Sf{DGel*A>&1<&X!&m}T1VXj(bKKIDr`A6@78 z%fv}8TmpKZSubDO%TGXfZ>Z_>9<)+a}ZRe#PiKf5L4S? z8Ed$G7#4_?VpS59ja14(kkiD`qad6raUHN2!;p+N*#Xg)C$fgFz?M%L9IzjGHWOYV zB%9yC`za7wVST}+ILB(rzs1FSNPFS6fx=%1U2Qj(?EcX<{0D}M-6Re(Sdsdjfzh|; zWhTk=eXE{|-bOd3z#LD!xv4cGjcRFSszJ+~kZz}d_J5snMT}E^xX&}8v+NtL6m*$pJ=J^BfE`wr1%#h(8BG0^2jnCKEThfD=uF1Iun?5HDyo4xvA`YIg5)rn__U37 zs>A4Fm4eu=*D)({;2cCss_FxnIWdobG5rLi$W_=W*Gx>bOvgqy8s}(xC1m6K{6acK zUsR}a*VuV&A{{Y(k0(gpz!g2 z%}b}V$ZD@o%i}-KSG`SW=cK1YzDs2KW=~MC_k-*|qun(aZov!vw>9^4^<+Taq;Zn7TqM2}6&H!#9X?#P`)7&SmLA91!GNXBj9~_{cUMP?gcvW#5qP z!+{7Ln4dMC=VxSst|#jl(imF3OL}Vej(U+L^R;0Lx8;EqiQCocZ*6pe>rm9XoVWGK zetEUl&J}2;j7+AYDsT9VRaC$D4BL8ljb_xh?Oct|VkN(BH+cG0wL`oYAb-3O5dR_kP8+sP1ms8S| zwNo{Er5Cd8k~ra@?h^&B!xMX+xee!E^L9(@!K9VUNXx5EHW>T8%%%5bTxTobVWHQh z=k0kES-zRG8XL6r8L;;&lgg@L89QHJi1wSOTLp3!W?KNf# z9^iowCf?8a?TaO);nOQ3LK)vbA$Rv07%UbXfrhvWs<#DV} z9PIvg^={J&3mV!W_)-^AG7%NZM#RD8ky_f6mWCu?%*FtbhYKs^Z~JLroQC>6mWc>} zu59;ycPZ|^byPX6^y43nWJCRg}}oX zedx4aoB858iJ0op7OuLEO9VwRpsoC>?lA;@28)E1i~Uyh*?YRzr|Wvz6>hIcpA<)- zTQ$BqZSXXYE{@Gf&j7uvLzqPWIxdr-k-5#+rYK5@e@#ArgJT>xidEiZ2RWP#xu3TkxvGIom*wC9N(pK$Ins>Xx!askVSoFF39PB zu^D?^-;Aq{=uzsShVh89M?&X9tbSe3bf2O?KrG*>Fo2$#x&yM>^kv{@CK_0h%DL1xi&um*4<1}w=k#Q)u}d&FK6Hr1|E zuTvw~FE({_EeTk<>MRb?J3`eyK2oGw%a*tP_W-sZRu?}Qep$Vb<;kBNXWJGz@Fmw$ z3X~@FuPVPIMn(K(?E1r z-vR8zW)$e%33aJ;Ii0NTxZ1w-|Lt1SMd!e=Jx^*G>QH-9m=z}auFGD=IMNwm?jdhG z+FEhPT*ExEhJM{Yz8lbhiLxdn#H?J(PM6tVn~$Sh?Bae+n5DZkDPb#BTuXNUEl#%F#OVh(G}oq3*lu!J`u?{A6T^1k z3;lsrRHC#HLRU0*&2YzXRA`Bx_j}zHTEsL%$%3E0LjBwS%m-j0$V|L2m!_ekj~9*o z;)dt!*_biM`!Q46(%NOG3n{G%8zbm~F(sGbxH5w=GcWAf(Jk>2i#;?Spr$<|j^3_*d6P^BZw<-a{s8`jU5`_wpi~)6KZj4O~5(h{YGUwCjGdL zMmQ9u!h_AJ*eX#LNWclRY1%fJ(cB8um=BD_DxBuI-KefI^wBxkCw~Z|!3af+>HB{D zfrdY(#%+Zw&^IMn3jZ?_;E|oyqUvuYEVMSrlhop01i{pZV($k;7x7L#o-trH4IL`$ zL6E~p`8*456TL^nXOd+RE^b*kJ#HHNR{vm2b@5r~tTipaJ>nR0%55#AW(~DE0WQfP z9EB~&O#W7I^R5cZ$tn)z3ms&+33W@54;jZ}=SL^O1#uQh`4u#z2*S zXFM#c+~PNIJi$eLFJbh6eA*o~%&;6jnyN_hxB*%fYd~d$s8+7!^Y2&%vp8jZhGoHQ zuLi(JSn6b26fAYp5w7|SPg6{gkj=w(!K2N6j5vikLEBIsbiR|^7l?of8!Rdf9_k)b zM=uI}irvW7Lp3tH)dT)&V{nR539u?GsYDgRe1XU)D4z{r=UF%^)Sp1VwU$>0@17I4#=!X0Qi&fn?(!{qGgU zhACLH$W{8PwSEet?3br<2S!2=tHzbQlX8@SsnE zofYi>G%TvC7n$GVozu>I3ZctbDghgSe;0R?chBU;F3xp)E?b97CS6Za^Hnw4!hb}9 z*H~}tEDm*DPd<*-cB_5yq*TIb3`(AQ|4VDa5GWtrJUrF!=5RE|f8#XIE zok(cOG<)D`N#?|ct5P9MHOqejYLr2$Q{Y)yO1A$Hm`y{bUcO)p8t3|w;=JxC&v@yW zkF3X_UQZo5eWA(BrV=meO8vzu3F?{rs{17~5(d8GBhU-;khm zd_==5sjAnz>`qkm)~KsHdwgO`+gIu`aL*1wHmeiMZdu?&T#=O^AIL7dla?|TsaN#+ z^Lll;^e|pf2}VaSQ~Pm8(%IaVhWaV0=9`^%H1DMTqZJ>6f_WYWz+R#%3&L0*z(RyOaO&im zzJR*A+j zuv@5!(HfZ}iP`V$+o%zW{Q>~J1yo^dkl|Ut8Z-Xi7lG3UKb_o;&HZ~qd&@;FdMM33%rk=9Y4U4Fce0LA3RL*T&P(48Zp!`1Jih&=frHwmL+0se}aiX`E6S zH(%_OGQ4!PkpuG$afhN@YlVUVttVD&5?$ZaRZ_G@nN&;9RA}rOjzm;buBC<<8RFg} z)5Mlb#7^5y>;81B-}P+-HTw_U5iCN|(2rletfug@Ecg2pTA)mFT3TnhxP2?(efF2O zY1S+!BVjK&ce{sU;dK2$T!f{IdlH>W)kP|39u+;7Om4E%Ccj9PE$ivXe`3g> z0B03Z_6)NPY%gdQyT|24t|=kI*J)Y2&&?oXdYOzuML_~hw87;AmK!Bq)-11QWGqX> zSVCoSV0KHR196=>s9K+9!?02-+hCaUh?aTa%D}YR5{?GKp`V>_Q6$h3B+IbQ>)39J z7x^Ux6E!d;_1^2?ytkYTtDn7?j65%@NIPL^?su~ls?J#o-y^obVReDfTn9Ey^)c|; zG3;_^R?GK5xE^->FSlO509f|p$yF0|(uXE2uk?I7=zvGkdafd$!s2Yjk(1Vk7+OU6 zl}YmonL8isLAdkF0_MDh-4V)BU6$;WLsE&%0Ot1=-an62%VwE&R{c{x$X~NG{MafZ z>xI<=+9JlCW%8Wy+tq8pDF=wMqtL;Eq}r+wNgzWG(&Cx;v#*4ihA5egd2c|#_UK{p z-fl~Q$0v5Sz8Oqh6B5J?Ncb?b&)_;u;5RyrkEJKMdnz~WoZ#y#3V{Fq?tpnCFnXb1 zdN`skhnI>*14Qu7n`LZLan+H>%LQJ*_(z=*v!2F@&LVY5;lp2=1gdL58X*&Vs7!3o zaq`RIgLn4dgL}UvkFF1nr-#`trwcA|$q&MRiv>;*Mrk1uLZo^r{>_C{i_XK;+3NFj z0P67-N85EJ;)m0TundvkydHakHzzb3pY^OG%}&4+&JAOn@&QZ^ecCdr8=p(4zTrqg z-K#=ma(%I50tIg*8u*16>IN{i)0BC1Z^`SF=g&TWx3)q%6#dA*g;DO4+pqrf@ZoRR>$|HKRqLsRKw9#ig zdWF#ZclH)L#K7J4U(L>~p*X7a-$GeN-%P!1Sx!d7U?2oEpT#6{RLaAjwr_5s(oqZ? zAsVt%!qM$c$LUGkXnoYamwi8(-y7gU{EreRHeInF(n zDN%-3n_SpcCO5=|z$QQFP&QOtg^Zb|%u-BbwdexR5AD!Z>3qDU9DlU;v)|HYr!P)e z(4b)j!pM}5h);<+@S!w%I7(j|ncTB&C8d2oy3h(!*2g&QiG~y-(sQ6s^Fd_rd=nGO zw38;Oq;6XKT~61Yco(uKy|3tc{+)T+&zt) z#nN}L@15O!TNV=c4fe%uzzN%d?8an%Q@!WDbLp3P4Sohi*t)^%i(h`_(WYxwDDGT7 z>E4OzE4<&0nbJ<@_g2)^DnV`#shUH!=&w#gHgaLj8Ah@lp!C(svm$WkDYVp2(qhV^ zZr%B6&BvGqJpRwam|A;D^C^E7vK8R!kuIi4JNfcUEst_EUvU zIxvs|9Kz>QQe~Pf>@0T`qNV3cCR{utj4_?t1^m|ad*y$hY2CyfU~OKT_9r*&#?g&; zD6U^{F>q0Ua7)!Be+&6f%RzG;PxF$>P3!?0H9?e!q;>k;@hD{RZ~d{!_M|P}uBL2{NLM4`f*zJGi*Jb4pby zH8JSjc)8WrcD>>K*ByL(@bq+EYP988d!m-@;5*0mZ*j?^2`_ic(B$pa>&Ccn=gZ{@ zOs!VM!fX^06zJPoAvQi>(?de8b)G6Vct7-Z6()QX32V!tyCim5tddss@v!|Juak+! zvHdP>AT1NbH`7wd@swlp{izU1^smEJxc`2G!?xFX32+4Gs~YAUigCQMBco})o%-J0 zk1bC38fo&J`-!F+kRAegxOqNOkUH~J?uuG8DKUfwt2)=Yssv*G(9iYCh_hch+6V+7 zyQgRh%JDt0n0$4PT&gSZ|8vxr#z8wG^UwYBLkC6Wo>ColR_sU5zCS`Uvpd^Hh2SEB zj->`u6$ttLe-?6L7ou!UY>c5CODwb|uMyfzf7}R;%;#-kSS{KeA4itQ z^@sbS#=w%7w3=$G#-#a@S}{5`31hmA&~M`(taSA!i5KB~pls(KU!TU5-sMi>As4cD zpp27+yY}izke>VweAJ|1pOTzt^8c&E_yCBaCf=vi6RuiMz_k-PWDzXLogmF(d0)YZ zYVmBGCQrMvu4S5^ZB{=!DLk2Gd65q5aEz^=CbC;n`ji^sPSk4G8GT{7%O*>rd5CGL z#HAG;ULV+5iED=4ct#Xl=5sylNrSFCV39j;XCME80txiAz9fmKl|D|P+V5*@b4+y# zlB>7VxF>)bO%6n9Xz4k;U0c3>%DI?g>%QTF`lD${h3Q7nMH87{n>YPvLx!4znx$z|6Q*q<#jh#fp|;78^V5>1_`R ze$Kd9NO*0g|4=5i*#F^zs`U$(`dM<}voEuFB2{>gNl2f$6T0)%0ZtaU_2hToFD&r( z5{V$N`uN7C`6Z1oU(2P#-m!`6R)_$-bvU$F#N~Bp_H>PDxe}0c5&GfX@y5qh4i0i2d~oLn0s`}gX}7UXbVwz&ezvs zUy6Fm{jaN5mK!0ZS&6t@_pMF}VdjepqLvOZmN(D|=W3Rdl_KG@r6w%@tf72@mb0yZ zf5or__gL9)$5GLc-m*nD&J*!5jynSf0l>ZJ!>Q9dzg9D5v=tZt6|WKN^Lz5Z-g`lI zVL}&_SC563EywB_#;?^8;Eeat?*Qf% z2GOLy1-dzF+4;Dg6x$I6-YR$B(3aN&%RK9lu{}NIDCXZ+f@zDR`~%7c3fFvn{`~E4 zdU=NGxt3zx=M9ItsjwC-!TM2}P|&gWY|aT64q#8dmk_CZcIt>e zdST^*ug4bC%NCwtffqa=c(vq1r}oDU(*@3}qe4BPcZ4>?5P_HOxk_@Nltfy}sNQESPAJTuvA6AxX*N7q_(y1TkTPQH zRk`b_)i|&x`f_t&S>+4gB_T>np*;)2!zU9)73Yb;nZp5!MiSOq8ycFu~ zva@jTq%wWPo81P~{&N!P*Q9V2`PLb{e_gkhnU6oJuMkYkG=H-Dw-Vk{m{dr=-z2%neNl7+?~ z*-IQhco{Yvzm7%PXW6n_o;8=y#8tel$+_g)@(zYH@n@|>x?L$2dy2kL)V%8?ha{YRd^bpK}vbWaP`cylAtuW6+<4 z1&mQRMi|ZOgva-`A%}muz#hzxIZX~@!xYDDHL5cGqK!QvEV!DkO)QogLof_hwRtb1 z_>3RRW!uU*p+F%=Zqz#Xt`?$=Tm7;CaZupf^X2R*H-`Z`v>WnSaFubq5hFW$ycWaP z=_z@8Tbkypqd*r+!Xo;b-C>y`eTA{GgmFqM$6l28(*=J8506|ZivIVn^ zfBbDp9xi_VatqD;bslM2(-xRRP%@*!TpiOv@RO0=@tgS-myDIhDrxZ^^SP)d&CfBh zZ<5P*)%4Xeau)kQc)-%-uT199{0U!Rx`XoqW&FJ=}6nUEHWnf0(p!XfAeHXuW*+J!4;? z0W;A_Q;&k)94n9;^A|?EjFmTGJOV=}wP8-`#vxK+v36b=oLl>$I!}LI@P_fuFBJp&C>aQdfaa&TgXRVk-wZOXq`{3B6y%Y~o^nUa zPsrsDm!cq!=Lv;RA4kLPziR484ei0x;%O!oP%jiOE4_=Yl_A%(rJIURlu_|cjFP(o z8cW3K65U(5d~W}z>%uG6)yv#S9dtG1B9gKsd?|A&{%^=VpZlkHpe-ur*(zmXO+=3QY1F7mHzx%%=;n(4fp*e%DPj;_;xXRnn5=j1r~*w#PZYK&q(ys zWV;o6bo7SrsiU*fQA9FV4+AqrQ|CK!Y${$MINkp*r^VjZi~hHl{Rwe5_AZDZJQJ`mS29FXs8p>7FI?;DFTL^=ZI?P6vh21Kuk;*n7(SzaZl9P3RY{l9ayYM#lDjtKXd z?1D(m6%xo`2?`5C$qPkGRJ)x*{k1lUT*!6q=h~~F+T$auL&j^J5ftO5+MAwRTArtp zKcHg!TSelo>SVajbY#sE8&$fFQi-qB=J{dgT2qU1%-?^$EIvaBMJ5LHVqq{+-E$*T zAr;=r5;@V9bbwz2)wum&Mv;B@H#6ds#`BsExmdFOUArNe&QQVFKZfvHVi6Q6L;j5X zbxi2ALoWwdF<2mJw-Aw$v)ClSsT6Yyz*no0XA@v}`;yetv(nYw6{u-J5d3y)f3xpI z5Yu+?2^J2tHtCOQz8l&6GyqPQtEoenhrP$}~OSBa?&VYcf}=-*PJMichY=rMbZGymMvv@N zdS*sbId_8ORk7lY*qlAIlH6Tz>wk7oXrtzxd2jx8LqRtdv-lV?0VzYJs&O;6L1NvJ zuuF#tmHX_c95UhDX<3sj+DC=hw0s)*i4i1;_hEXC!&(rBamy?j&dDqAR5J+4Kd}wd z6hy&f3x3I>k0`zS4u@lnj-Ur6_m~)lLZ;BL!C5yH=u%lXzeD()Cw*y2RzIh;`4Q{> z`qW_9tzDD-TX4z6-~4pokyD75Rhy3sWHO)gpZ?zczwY|vBMeUb5#C2c;LqM7vhH5t z*C)f@?_^{K%N1o!a-{&xY9KO1H*rZ}0Ql{CpD+8({ie<&=w`(mmUaGk`u3Dm1#5S4 zQy+EjZ4IlnC4Rzg&q$F;WKXZs*)!7I)cLO9&mGjN$1*m-7M^60nz?lKE^ir`ytG;P zu(&4awNRTW8)-DZ@LbT`jU{5!#_axhqDcH~DH98A5E%R_Q{wxZsq8~Ex@`?lmwUQn zLB+6R>fO2vMOeCL1*BT%9)ee*e=`AZqv1#vZdtb+u)O_nG<1;qQ7(U}l6G*T#Xvfi zXStfNZ`7`_`x9}Yq=9>R#(s4stt{C7hJwIfghku6VR_B*fbZAa%RykEx4W;Wcc&-q ze>p7&k-9%!*lE}>0CpM%UAfC8Kkx4r&{OXLu0DR@3Z#H+n+ASax7->7K4++7%5;w~ zhv9Fu9rq2qOxa)2Z#Og@Xs{sa#h8E32R)1r!Q43e zJ2q;O2wtU2U@upiueen}sCQ@ViEhL2Tx2<|DVjq6DfoF|$BZAgq(D}dc(bg(%CK4= zt{a1X+E(*2dQO@a2;O{Wh8=ICI&)IfL<{_1=|KA@W!}84QKCrg`-fqbru3P|J;yH< zYK&eBV`#@Hm5>V-;(5iqjWXR7un86;u|E63 zM2o)q?SIQ(6Lcg$=A84`0=W=f!unvgkg1N$OoAG2S`{W|zIH>$DNj^W(vSm{D(V)8lD2%%^j0e^b)sqO;^ux3%Tm6T_E%=|V%# zDE4-|z)SLY{B&^HmVG|Wb_)1-p%N7A+qOdIo9`0j#{ynONQ3oanuPz{?Vm?d`a<-( zKS}QOK2A-DMw`qWm7M-AhLSCuU% zGL5yMv$DY7j9}1Fr#`8=W3Y%o_N9_ja2h zm}#b%mb>j2YJ%aq@kpp;kZtag^I`ArmfvNH2UbTLu?&UfpxG0Gxr#j6eS?(V-j0C)q-K`Mn*2MJQVpT?%WGX z$F`zecahi4xL>!gmRss|?8}ZbCegsOX=&8SC6Cp)GH%ZiutcmKFWqCZeF4J8Z)K|mF)(q;<+!ij@m^D}kr`Gx=)*wUlngeA6uMcMs4kuIRw-Scr zXA-{8h>(-YYbdV5T=(F(|F`EjNszpoKgHkInfn(5uA{A>-_3Al2>9&EUoGX6T9O73 zE4CcH6*QPt(}pFACs2ITSlJji!oD)=yEfahiU;JKiX; zG}S6_Hz&sq#y!*j)v@~xRNF~f|1GFop(lJ1`4_uZuTBtI_|Dhsn;>S<()k2{sMtkv z9&bjP1XZQo&rrKfB6*pTgD_BuIC;G(B2vxw#z=nh`g(u}n_$vSSR}SRV_u!;fneK%@95Uh-1~j~%r< zB5~uaW4Z8;@Wk+I|9|5O^y%q1spy=Jho-d>Gs}Y-)#FiDfFGEMprqOe zeoj46e7@7qOZWB{lJ+Pt5MDgYv?WX%l@BzS))!H)mlCIK$zBQb~n(xqsT;*c~@ z#XXiTQvZ}b?665^t2f>|`;^bh-SUc|cT|>Lyq~uJk{EkLSD#7n)204>~*$wTAThu5(b*NF#)#$o_IabKE=Y ztA@8rZ+7IAxop`YgzZN1|LsQipQp)GPMLK-n=Yl=L+CLAkz8P&=|g>;SdI7ZoN=7_ zE+38tg^+?}4#MOR^?#<3XyfHnGg3uVbD^^MNO_Y13N=<0oFQhzk1h4c7Ex~A6 zEx9pzxWtGlKIOhEWuPjYMEUsh#F>H$x+5YCCBZ8Ih6T$QGW|}u=T3{qS9e*VI&WZj zMmMYES4N=mq{4PJf0#~(jEf|OdVg#@ZHZ4#ya>x!B;sy0t{5LqM8D`L%U{yy+Q&tE zR>qHBIx3V&9$t*R&=oT)46#KdQK!ZbX>ShQ)P7=*dp}tD$%9MT8E1_f)g#kUn~ahU zL%k_C*H}sMiX969b|ZVg!&7!rW3m05;7a{JoN11$Lq&_VJaVqIFGddP*PnZ^9I=zCoVY!M{^eKVM+o1#fEGmK0n~aE z(~>G5Q3S@>wqJ>5y&#B@`@X!U5-@{sw65|}-N&6rn#KNMByM6=rjap|nY~yUM|Pwf z&Fnr0XN3KRRaYyT;C$e*kLz_5*QU^nmfr2s;X+J-k9S%jh^Mfv)#pt}m(`@>H@HYA zda2=S<0U_GvV2ZAiK=!e<$U)IV_Tv5aG|nyz3tFa#_iB6)fKF+rMmjBu1)eGCBc+; zc&ulle_ZCICHF^2(^SQw*ZZJ}o1{9C3dxKd2NPex#z78)uyIiJN7y*%yZ@!2jc@vo z22AL4knH!Q2?i;3!^9LOEEmeZNKy!BC;9Bl>%XJ1SXZUtB{P`a_&ym)HIkmLi~-NI zRyqCMZpzJCqaJ{ha9wXgBMQJOqrs^oHE>+f-!1D)Nczy4135`u@u&g;{r5O;7ul`bn56nXjxss^he}dHeYWvo#%0HIV|gJch>#oL%m3T4NOwLi^7rztq?Au{|b#behq5j!-=V(bjJz!Kgj zzx%pp8gx?vX#M*;$k$WDX4eK-E3@)9f*n-dcqK@dBUdlp?66jWX{ab#Ze0#Ia$mWet)-#cblKO-$cH?z5COv&G+5Fxb|IU zbKSa~@#W2?)Vy7>+wNxkLsxLNKF9I$X2Ayeah~&}p_L>}Vj&8^6R!h?7iJ`Tt||id5@<^@kTRd3R!r#M})`T zl&Na8)3x1GJtk>vtj+2senobXfEFO7R$uLF?Cb55tVfcWIHE$xfRZTyiBo08B7tNc z5a&aL`*%Ftk3<5j_aKYbPWjoWZ3C|~^-&Ow`mn~LRW`jYEGKX6Li3D$^du7pdtIE8 ziu!}(*Lz9)dh^q(w=dmBg|{RoPqv zSfh$;YBe*U!(~bR2*+W6?r`rJe4Y|C4xn0zUJ>@uN)AbRutB>jsY3aU)+;o8JhB~i zde#a$=;O}!fksEvoz3o0aKu8%6y?zO{i=`Oqa-m`2)-ucbkvLHOhX4f3B#0wK0OiV z?4XaOgRJaDWbEzu5mQ5x1U``OPg2qLbD%*Y@K9Kyf3!_G;lx<55(h8J zf`&?Z7Kp=2`n3C5{COy(fA#Ta4M?!)4O+J|HA*0)SwLbw*?wa65Rm1dy{>@coAfGP=DK-xvn@crzJB+Ee9JcJ=dJpE_d}BJ z>E_R`zTf=0UT(gt`Q_!+>#Ofy)f)*){`}p4-Tb?(f3Fvt(x-jXXN@JX2JUsN`{!uR zIAKy%W3wWkj7oxm!otVI^}xG0-vD`gQ~4W;v_-#6-ePv2Xm^B)ZZGLYVPPQjeKDeP3uZQCsaRmh=FkM$Hx z^||0;X&M^mNfK7${OHk;5Zf8;_AS6Hno78xa1DLrnaL`&R8+JjH>!e6Ts%G>8s}*^ zR^xnD5!8`ulmt*t!l>PTMYeH)P!zZ#w?8|rLh!CvwPwn;MHdziNr%RH62ynrhtJnI z9~t5xO1y2o*~Q#GGL>4j%B|O{B?~IVDuH*f$hDFoI#dJwM36aG<9s9#7DI0gwyU$? zBB{8R@W%H+HV7{iK#hM z?-o(WP&rQ$azf=i6NA*t&u=#MKYqBbH~pKvc_~So#Iav4qL4dY@~oKwkCu$b{cz6~ zBIL-d4D{iieUz0zV3pUo79IM?nuTf^`rt`uRv-LGneZ-XuW##T0_EsqW+fSoq}5y{ z3W?s!I^r>6MQsna#F%8_L3QwL#=HG8j%=FzJKp12QwQh>yuYo%Vb7VcND`f6FWc(a zVM;1FhGtW&rQY2ndC%8J)ZKfO-VqN>?T|Wuu}a?q(}yfTK-`a;iIk~0BQQvgq{wN3 z!Rf3J2%X%E>e6Bj8hGDn7*6bcXNg$7?_If&$Iu@U?dYi1gG97V0k|ehg@6&cM3t+M zg1B8QF76V)_n_lc;&%d!Rs23S5)mX;GT!ej9u=_Bc~YT|dZ5Z#qUUCmEmn4|RH|-^ zmW2cHI}PGVE#3r+tN8t$^*5+V2i$jYvd~*+_aw{8zLv97v0xvT71?rOxr2-Hn}POy zGQh0bci0NW7(gHPb;dc%ciC1}zVu3mT7vM9jEXg8*VhogY-=#kzVkesQv1$qW~=s{ z@-x8Bn?+MxLhE8+Wo+v$wNr0tV6yU+J2E!qwm8f((7w}voKXAD1i@$CE&2H8McP~D z+sS&ejW`oZR@Ji+FhHwl`l(C@Ab+Ek<`=!z2ex+_jA6rz$Y4#VUSJ485yd_k)JOR@ zCv7BMqq6O{@hRXL&cm|H=B6+H{^FmiEF<64%g;9d{awAe+5GgfUian{pUbZ=Yb>?= zY4dHod>c1^xqkPbpKZSWv0iVIM7W!)%gyKCz3dm?Y`(e5|EO<2-&|k4el4HRSMlbp z{QukjW`Fwo_O5?G^Tjv+`j>zH`n&&QbKIr3SM8Udx%3nN0XVK7rXvviVc!oka0JSR zm9;22U@1;9H&7wF=uN90;^KMOKwMAr|A4FFxr^)LkU;9K3gmmg%f^gOmV^cu3aH)@ zQ>EA&MOCcLQZ=$HUEC?Ir{E6T7S(6DC7%9l6zcW^lYsh_? zKr0gGn-CS}CX1IT$=MRg`bC^Sl-r{&j#Vd%8R00Wola6wGI7yVV2*8JS`-u>9u6Fx49wfxEXatGf z(+;1#4-`~?Vy`IH-W64r5koQc!M919#Q~k6-Ja#)u-!iGZuU&<_K`ab$dceS?4IL$ zhc%VhR82_&Vbn%RCd3Lsx8Mx-nM@aV%k4=%4$AG5((&tV&gas``B)-CFJNY~KL+6& z*@(U0sSo`&VCfTOv)l#~`-B@qv`CGHR(q0&q16Vjv)0Wj#1bU#aaA!{R2V7?je`%b`^c__0JkM@N5GE?6#-KI)k@b z=^$4kQ>_ZUA%*}4Eu(g{?0Ya&$dj-=;M%h)n?)gYLn7cmXyQ{neOg+aSu8U*x^%xvD)FsMxw+?eKJ5Wy8V=$i7p;xa#5GS^FFULD0J>r?F02SEp>u zvUIg(R7jG2#Y9{wRAPIm_W6kbv)bX|UKUvLZ;x)5e;cN3dS`ajQC1L1uvBcJM>-B% zZkXG$N9s@y&jK-_hflhlt$KJy25QY@_5KhbH7~)BMx`ZRl31rU6`Ul*IVY1dVbXTN z$50PX@^M%XpOTJq*270mj_q9uwAmApTI1BqjB79TB*v-&7gi~d%N7Y;S{S>b9-buP zlN3E4K@AP5;RQ9Hzxe7W31P3^)Xml9XPdwDaeK1F2}1H>`NZzeZ?3M&&6mFz=(np~ zzW+NsZyG%~<7j_k-J2k{-z8N{)Di)6QtagRLNS$zbMeVu-0hDiX?(!N>D>MCk@L?b zAwsQbUxSR`DBCDkft33s5mbTtESda z2IZVYEg^EXdQsIm6v)$btO9url@_6r+)_fTcLJGxX_Wf?Pvj(RvNfZjA&Haywcc-uY0sV3W7&`b&4;?d~PAU_de z&eb3v#{)5uqp**3Yzo=sK&nL!eVCE((6FcwV+)aTa(2;vXDE{+GKE740zppm>ThXnE@AFDuqoJ62UblUD8S|?q-125rjb;3dK zc^i;(&zq?hDot+1#oYpVl8A>E$irjg?iXD%{ln?8+CzSEnlCZCbt|8#Zzx_mb7jB(W4U-ZTpzq-V; zX4&ZAkqK_k5mPg+pCXqm&h}rtiW;m631o$9nG@YT%WoRy)jvN{CL9{lZhw42?tW%% zaxWxBMNMGfl$z23WZ}Wqs2=QqF^R+@vCp5d0mi3&(`St(SnDaUxBEt!eYlOosw!lo zD737iZCV8=wO53ogC&?FE{83};ocMd0EuidwoeI@l@l7Mq#-D*zGUOc=1jlA<*=o= zUrxha1@*Y6o%4bB-X}KaW1rJjV(TTWEIU>e7F@v?fgtI8sJHVZ3sZjj^gyhB`mWiZ zrXLYD`@vYPkIlBpD{re)B&eulSt1*jjmco~&K&a7({$YJr%wvT>ZczYiDcMHRI(rH z7de*}tX5X{+aE2dRC}?9woD#E78Eb;*3*+9PRPcSvbgH$-+MTNy<}u;cEumj%2g`J zR#sD$@H)3`Twiq59!LUxO_Yv`w+2r{dm9?vw9eay-?`2!D-d@RW)3WVHQ^2eoC#xt^R8eQ{PckCg zpkrMQFdq8pNj?tx>66m2`sv^FH(E>n6ZVB%sWPO%Sz(E#3!JJ#3|2{0jFKPqL4FIR zH}un!M0}F|7r&nxuZPr_i(mA=__wQfy^C^hXz{YX{y`SFML&yO%j6pY<5Gg!m#^B} z{`*bb{O~&d+ymf?twpZ!rk63xi@qH6%s9z4o;cL*$Z1aAvLtJJ`%_Gm^-N-CLtdz+ zKG(K-t4hQsFLd6RLya~jseZsk?%YN7aZDJ`hWc6N-PV^(4J8_tdJlW@+y`G+uaYSa zN~H{T5gLt6^&}IAO!Y~rs6R;Zy;sPuH$T04`%>QOS{93&-({&k-5Wk@9>J0(?Qq}u zMY8!q5aqVV1d6am*?F^7w$`9!*Ts+)wM8RCy(8}<9`8MVklFSFv7nsSUXkhNWD6Dr zvFQ*a&GC)<*ii}Wd}5K)Edw5rMYmO^W>9jKt51#!YRo|MJs ztEi77rrYU2ZWrVbkV}%$t5l$CChqO+JSd%OYrxU#WyiyjpnfXAoU5Qd4hLd`+J~K= z_Ps#In;!1EpvcyuqL$xrvXWdO*X$Q_bVq)A8i&Jv`m}r5Gx5{M;UU2-dB1;r!QDjW z=;Ri3Z3Cg7A*7}(K;!J9arQua=2<)r>gm%)z-K>u@W`;kgVz@Q{tTg|Y+NqXJF!q7 zw3Q@R7BH%h+3RY2H4Aw&vedI+e3B~aBj6cUQTvbDaJ;_mtJ@cw`2IKJP8)+4J!`1? zm;h%3?>8e`Koc`6+~(Y|WyKDR!jf&N-f=UF!#pENJPXwWE;XwpJ}^&2TL^$VCW7rP zGtjHrJ0DZAy`EWq(p}ZbS~QNDzPQ^G&q8s?5}y={wVwHLgK0EwPaf`jUmD6BShhW* zlWc(f!9_!>Ow~|a#o%Gl`DZALhh4(q-sAjMS^S5yz=X0a;ZDN1P?AlNm6O#1(jlr_h?>=iWB#ZLs8RTmF^pezY2%f>$J ztu42{g<IiYJM9l&YBZf|@_Sd%OARWxd?|R5#z(?To(b`o-qw_XWsruYc|p#BX25 zx3>*3KHGeCSvGIt&q-eR@9%CpOq<=Gf2yCqe%-(Co0xjnjO|~&zIy$-UT^YMym?!% ze_8PSK}H|>b!@+c{o|-49Y^k_00LK_efy4}wJbKm8c9MZtD|hBHEV?_YihZ)hsJx7g(>5GdLYi*cpnFcchIMo?wgW1&#XO5hz+*%5iME8B-;jI zY-T$GYWX;1D7>fPxLbIil#5k(KQ<7%#fEK7z^;=_2`#yb$_ERQdYYsnrlyS6K4lvU zmqq#7P!pZV4L37jY)Px8e}&g^3i9Bf%G7(?Mb3CKa=eNsHWl8e8} z@$#c0>5o7Btl^NI#0Bg9Zt*}J(T9{JIg)ila-!aSygF42>j)(`hDAZ^P<>Cb@kx4l zoRpsze}D16cb53Jt;Xi%yEiwRxVgD%Z#Qq>UDhw;j=gzx`Ko_W+a}X-BVR*)DX+Nv z{=ImPrF1>L@4vB$Z_=xHnTNeSj=ARcYTN4`xaPBlURFe{&FzQ|FyK?~b_Le;mPR=U zb-lxqXT z_OMGj+xhyAS(qTxP1#xLJ6Z$ z)hJ9*^i{U4Qf2?p;IPR;;TI2NhdO(jjsxwePYK4VvmYIa!O4Gnm#Tg7rAN8xtibm+ zWyu%C)fDB7L(|8?uwSH;L!CWI;!JblQ^L6F?BDw+4oyF%wp+W{Myxg_Wi&cP*iZ$N zy%5s`nrag*%XNn~`-u><+Uy|@)}WKUYZvK+Rx28`_JSWSe&E8-n|&uSx9KG$ zyXDZ5#{z;6R+RlR2Nf%Mr3FDoA2sk|Sm@AYPs0CzYvJm$?|!^tLH^snWgoII3#Imn zh7xOMVZtZbA|<2>q1KQ&A{;Kzo`m9H-|CZYk!ykWqXrWKLhqb^J7H00SD08?53*AS zC@SQBYS+2uAT`;n549v2_ER_ap0LQ62~#PGt*o6?3(HT3mtWAflmoFNKjt#Pa1(w8 z6Bdt5^t3h-7fB5B;S>osaK5qfoRXpU6NYXtbx{IM9*glw7Pv`_X~u zzy^ob?t9}v4bA#0DPONIGsahddunto=RG|GtkU3YSeIyXt8`IPDT}Sg4LT*kHFy~qB zLF&pfXRkbEt0_bs+(J+do%Spc6D>(jx}iN2r+p+Kh6qi64z}N9k}o6|D#dMEl1Rdi zk|8l06R-rA^a7Bf)1Cz6a7&U?;_*Bxw2y^bq%hAHJpN^KCu#@DLveM>a1iU5Cba5~v4UY0ljkAGraAK5<3Xl3n#PqYG5CRV|=a z)Z~{aJCy3Jf_?BA%#w+*F`k6tU`vlvV(}p_?#ClOp)&r&@A|CKl%+_LZ|8UQL7`?J zjYfeW2o6oID6x`Lwh~|r)fd0m{zl4phu}wG-hbrbs*L~eM2a;Uw;$=zn^;RYL<+M2 zK|LPgB2>f}dlPGmdD*9Uq>N`-Se5akhoc{JMf9|vc&Kg4B^#rl1l`ZYTM3jaDCej` zwurdw>o{`8^K`7vc#Wp^Bue0Hv3Eq<7eQ-ofqQ^WeaniVQms{0S4>0)F1Q0dJ!V0C zX#ck=x9yOT1lvHhO<`h5@A;7yT_kgoXI`jc|jYwkRNYg5c0f$g_K-piS~jxycIA zn^=>Tv?y4Vc-U$mlQ9_&R6)=3@vz4D!-T_M7eoL06VI9t9|)0y-#t;tz4*DrtgH`7 zQYFJG_I6QPUe{bpvDwAc)R8rw<>T>N<9~bKGrImq?%&E^x8V5b^Jh_Ie55jV8a0Le zkX7{k@Qsx?w)DoT+Bp?s)G9k`b@8c$wy4`1DdSn1R%QH1k$@0-7rNd|;zNm+=}j{F z*u&=gk#yOHQnNvE4cTcOW6F!d^Pw`Hh2lY#aV$T|b>CfIy}S98&iGTm?em7yd*ig^ zRJ-tqi<70wfhy5@fm4I9k)o0q3KAwOU@YcH4XyF8L%F&C>_b^0v5%&9rSF7XK?TZL zH9~5V;u(YCH`p9@C=cOcwZ?~F=riLX>|ik9AeU5?q*(odCl!^jPYmbCK*d0;hqUn| z40GD}mEkb5a(YLz&C*7ruCqbNXfTv{f`D){E z6fxFVwnU4f4av(Gl!nwN-Dv^F$S-nf?}2N~ zsc%xf{$f*qluy38+}y}bz0CEC&0jx%bJ6=)^ihSqnR9Prkz=1PDF5WkclBoT>g~n$s0ya%av5Zs+BdSw&c8P%Mn#W zt3LVD_kgSMxm)$)kN_rf&`%KV8ojnwnrT+m{(OaM^D3YQC9k&4vjqCfY35_AJ_*G^ ztA5f=dTrhDsKFF0jj_hTKDlscQgg~$Nh!!{RBWSDWXM@Vt?A{Qs-aLHc1Jh&9X7>Bh7 zMA{J(z?GO%P{wX&-E$wd(T`ha$dr7FlCE9c?bDwKF{@7>t{}mKLEiUqq0mfX-Pa9E zatoqSDJN3ke2&c}`QM_3awybic{rg^pW4k4IaaYM>zk!9RSC+ z7Ybg!Py5ow988gwD5%1HM15`jY5(>1g}g6>OJn*=tGS=rs+5^zVMV_tjhS&k?49uR<>c6uDRx; z5EoQvrFZVIS|!^r$`Wm-q#0ph0Ef5!c(oO4mnBgMStj0< zx_NaYV8pj?>vb)g^z*iq_}yjwj~{A&+duL;Uf2E?;^v2|Ua&7;z}4mVU&w3TNX#1l z5tA%A-^T0sQr^GCALYKkdb`-M{`d<&Z@`HeeNXpyjfpa0)J6cO4!AB($vUW2DNRfK zjLw_IaoVApo&@{>m%VdW)5kGk9rk{Rb{8#i%q17y&m1`|n_)$j0yl+-Aw^_ByRbiF zH$BP3!EuDAq++dUe%xFF7!$0%9Y+`etH&fOld#es(^f9Ys(uQt*=h1x*Y)~<_Dj3N=q8GXsqoIvi5@p!Gj^)#|!oYQ@;1iWUnfe;oo4X+KAX;P zOA>czZF`lM@_My*EC%ePNjb*z*zO~rzeq)t1FZB$J3s};JtUTMip$Ty+bsqKme*@1xP-`R2CeL z?C&gxC-r<2D4w_dJr0UK?810QdS6pk6S-7Lq0iW-^T_h#IjgFj4b~eQ%VHACNdG<+ zEY4N`9tnhVF0g@p4HgyeEw`d{F7;+uN; z+2*^K-TJ=W#BE*h=1pJuHtG7KPRoCKvFvcMYtVfEcX-w~vfSiA0d}f}A~&0R(T#y# zej`_uY%B?vva)FqD(FB>@hpuGxK^FJSUz%v3bHOF%BDexEmZxdLDGPPise0&t@5K|Ox4l-7MDEa^87~+9t#7I)*kG> zaI`k?+&C%3eh!dL?md&Yr$wDEF0s>#ooncoCt;ZK%BLsdyuI>qbXdz;_}I^-OdtbgQS{kr+fXH6`Alrludpm?hwm0<3lORqA#FMhPdgVJqY$xA*);kHnK1Y*vQJjKAGA(J95V8s$ zn@ivTc=3dM=#`%c7OPhtrs4hYIs)&?%n53AL8CH~iz$k(s%Vo}O)@UqvZdS(Y2{fS z4r}GpZdt2Vo_Y}F`kga-Yl!HYCC@6k(A$#gZSQoeOr(O1bu#V1guz)r4r=AoM!Kt3 zp3IFsTiZ{^?b@Ow+hX*xWMpcJl69(2Emam$2)4OGZ6R%jT6q$Xp;iX3v)0W@Hr6|n zCRxCkEGi6@4d+-*#!m#%uw>Bai(hEvZGG_C7$tgnm1oI{&D z3E=}SQL9ZpAnk}vxIICajZa{`Q7B2dBG)_lXO@fR<~*f{Y1yx7Y?CLUIAoJgip6S^ zA2*o6ND`*~J~Qvd^b%DkRRVfNeb{?+r5oh{F;|;tsfdO$dDzt(?>% z-q}i10hm>DT3gqcC0iI{X@*_BjlWoB^4;TT41slSzi(wzQi2dwm&(0Ou0$^_M^!*` zaSdwCiw6rsmpsYBluJH65UWeRBdGC&PMaMYMH29;CF#Og`!U}l>x6DW0^J6&Fyyk` zH11N#(`?+Wl23}os**oFhxW*0HSB^RGP_z02N_F|pv6}1wepx%a>%lG*<^GKoOrQg z4PEjii4)TBq%fYhOFj+@7qlh_`+le{RsyJ66;1tYag@Ygwlig0%cZ7hfftGYP$fSR zD$Z3UAGu7(_m_gVdmzY{m~%8r0$Ho5qQtbhM3p7o(vW@4v=|dRbjhWsW{1|A*v*yOh4mU zxuC3PdeNwM=!KsM6{{B>Z&(@w1~xmp6Ep-c*{TrHD$25Th2phhxuHNQLU9Z2H}t}@ zK&)Q)2>=p63lg_d*fvbEK0q%%r}qTl{Id9qLNX*O+TodHYC`b5M-ADl8sKtChmChGwXMC)rsQ@FPV6g4Y&^ z{cb(6z5Fs-qqLP(gt+G~rl9gV)x_2(Hp}|Up#z?T;z1qoZECyyGL9?*{vGe}tg&PC zL>h3HD@RJMP#?#D0ThAngM<4n=3Q#&h^Q@AqM_d%HqEAc&!t=a?jOy9u>nakqT9+T zbdC+EVw2>>vOcMlnpYTg$vO2d)`vPsOtP^0-9G>hcjW#Q5ILaTow(Gk=onj8J{c!; z0H{=ZSww6mZs!&*2hk7x?lc{%-#x2H={OQC3WU9#{w_0j=xybyn(i$}p&1ozsLDss zHW%PXi$M=Vy*mlwLyNrg*1N}1Awi5KvbfW`5+!FNIk$o)i4>(K;j>1oETCnZym!kI zilN?pB2=8K-aT@^Lei|s^R6G31t<3%v~t1qPBRkJa&p`!Z`9z6Ms|x%Gef;Q3&g5- zp8_BhB-jmrJHs3MNQGqjL8k4z!oZ57+#M&2inlSist+07NkAUf@cvruo{!T#4hfd; zx?!hxdq|S#!LU!tKs2(4fKh>5ul!{TlKw#G|YI{T`RwUg!NKe|5Ptu+PU~ZnP7Q4DKUnC_+b;ERL)7 zimGW6L7Un+s=*k8p)RI44E6IQ=c|5xq)f0eJ*C23ZJ#kw;^bTu5TYWqSw$}kknX2_ z0aC7Qk=>8&^CS~%1@f62>f^`^0EVpI&!KNreXX(;r`Xf|#-x(%Ilrdt$(Hnsy26p6 z-XZuAnD-u@w;Jj{ngxq2>rt?~-UEgTL-1Zn0@o{$BT0lLnZ9MzNqZu%7XjMHP|vck z8tO+62RIizGVv~~34PAEsZm9eOHoarVg#$aLrc_j)@30EM}~Tyj@3}F!PK5aS#?Zc z@Vt+&ZFWxgAxFK%SMUO25)g8)CG%P*%m$Lw`T?7c-*@ zxoq=$`5hLmnk-{6q(m7O&sRr^`l(>CD(c^8JkWz%y?>-i0z)+Y(G_MR>x8Q+wSG$q zSou)D-3Ka=r-4`%^-}<(*Zo=4c7LSG>3)nsB`5cV`r#_sOPXr76}ds$^3v0c4D~D@ ztD%0RL}&uMoyyxNTHX4ryxN~>l^j*dwRbl5r6t2LmIH!%7Kn!y)P4jFngul9ZB=jU z-bC)k=BjPwul&<5|L=FNUT>~)jhCA@^>w*zg(U)1%xukK?;8r~StK4*NXPP{T=(7e z)w`QdX{0~(+dgYF!8!w0n|;TykZplhL0OkwpINI_BJ72;6p%do*cPP&Lnl3K;Z64* zyr;1M#wLk_?)^D@CdIyKg|-;hi9!i^%q9-mM7%hAC+&}ILuzzjF#9@^yaG-2@7KSM)eR?9!TS^~EN07kA81_5qW4NUPvPzUHs|2xbD%on3 zamAIyp%z+xY2{?nho`pZAxy6DY+`JZ2X``v%NCG5`EJa29sYY&T&jmDtO zP@CMG2#U~G6+%vmbtt(e00WC*07Gs4M8G*$ZG9XN)-Vbb`~H(d6q+YTA(_0{F~!=}o=_{_6Lq)&PU&3a#|fr(SJt|(V@ z>f`Z1agYQ$a56RrDiG7f-6DGuk(f`nqYN8kZ08s65c#+F*7vJ#zWS$L!F;`GG1tv? zEU)6_+xNow->+mbxsg?_i<+%mPV$ewk?-_EM<4w@&l^8S-hs3Gl-)qCl72}@L(TW* zKBQ8WKT=CIXIshHMNQ#QH&5dCfXmal>*nK_ATqt9&#wDMGf;J}fv-kx0@>(QaHv%) zxn(E!2!CPphPrtYi9@>iq)@EgHy#o?MB_kG^8ExOn=BD|WkN>D$@?rV%S{#VwQylA zo8iUX9(maIo9;bx?+EDJ5IT2p_8$4juvvRcL2KN_L@mN z3XvBu3_bEB45#+UlSG`iM?N-U4ygMnh@D3c9D*rM0u`#DWX&)tW$==9TbEj-Y}+A^ zJWa>RJn~^MR*(GXNCYMl90Tsl>;q)SL2;%i_rKKMCMYWx2xWKE)Xd_j*ia--l6YDl zco@d#E|QN0$6_DZNIP(%u~dtXs-l%>M|)HeQjm}bi#EFV=3Si67>eX40?xULqBwbd9l?DP4Xllr!>hE;qbF*!h9ScL;Yzr&qRF#f>aGxpF@ga>o$;YrBS|agMbgnAcDonI&6kA!&8V84sWNl0S z4`b-_7ym7mFXS6{z3rm$*^A|LzHQyH+_Aw+o;6Ss+d3pPucL7JVwR zV|jh3H^wX!Cv?MyvAE5OKVc#Ar+w3B4Q5}aG_l=1vmkGbBve*8TZ^Iqs6rJOS}uVz zSkv+$dpv9yPWPV8mrV6KLU#bh%hD-ZqAaXI^+Q1!Gddx4j3vPc%k4+c+a4P@zNZsg z5Bv7K36qx1OmUS6q|X{qTx87xOc9)ol430$U=8i@Bn(sb`1C}awLLzT4rE|`+e4=m z;iW~%tV{HLa$`_25-M%vRzzoH_gIu{4dwAP9Cyp(lX9`j>OzS(*NpFkzZk|bL# z8Is4Mz!#r_jx6!V#odZ{l8b|t#wX?C>o-^11{L|`)j#UZhtA1AUcJh7QAT|Ci=H(% z27)HEZr6JUOOA4fNacufv#3SIQG@EIe@#E-9hcK#haz~An+IG>&Rhf^8-n;?jkg;1 z6N9TEY_{}neypgWQ6XSZm0GqATdd2n@v#V=gyN70J}DOU2T5-ChW7RQ^9AzTez@Rw zN#IZShR++wV93gT7H)x*IER{5MY3wu2V6)@+%qL(dT+2|QeMQwLjyc)+HLPWz3&Jf zX~^UG_eM76$ayB%$J^sRW3JI?M(2BIqZL(R6@&)mO(JbeE*KUO@X!EH!fJW0fP z8{p&U=$+co8@-=6oMURei~9RklSEm?+Uu<{YhMzDSPqpBPs4FC1ALf^)c`*>5Ca)T z1N(>RCMGY@6RFVWUsH8XMJ!2~lKQiBEveh0WM^oACqX=|*E`JO^E1FlZfMp@*kXBK z9$Iqfjoy-y#jGic&}7Xr+|NCvXdorm7N`sr@DoAhTov$&qM(q2}nRPK{E8+GlC>*0#MQl5F|mD zq+C*UgUY%XeXGTjUbJExO5jOAPAP#8<8j6flaEBg2@OsM-kq?m=yPnjDR5qHgFqm+ z!D?lr+@6|)j?0-KL;X8R#IQmbyv|xnf{xf*{wKG+JSq&84QJWTGX7!IeE#Bn`{6IY ze6jiVT`BeQwX7!J)XUA~l|-ubW)m+r?=D+>^Xm1hc)cld<8s}k*RL-B(fb)E`6A=n zmlxYvdoQajMmI0FS>UqLSl&+V`%xF#Uf{#Uetn^5jW=NL#uUuHMSPW{&Y50**BIzG$>PfyIaJf5oO??~_-a2mpZp%W0ZrEB<8A}u-WX%cHx86S4 zMzX=#vu|CmFaRX33P?rBB3~6z+VkD`b3Mi|j9zTY6&Z6rDG`lCQ9x<7uya^KR zMwcZwmqd)4EzNRE^0|vUCG|8AtE7GcfXI7VlAE`$NNpjP1kNazdqt|ZNikDY;6hD0 z$ufeAlMN$DJqySxsUIg2jI2H1E*Z`=MvYB1ib+w;67@1z6@4laAg4ZV@8V8LJxj#n zm(<_Xx7V-aX7u@aZ+oxfP5qDfroU4D{9eiAtIPJT->hHE>+9b6UVr(;bH@;ZHO6@% zY*$Wbu@#f7YDVazqP1jS%`1+Ey3;8Z56I+M4p*7{SecNx)%9i-e0#2@K;fz~g+4Z> zGeM~bxy|=}Uchz{-wti^EEKCvUTyNALyrU3`={*6T%$2LfNYjN^f^WijN;_2TvT)A z*0<6FT`%mgQMbMK?7akyDQL;{plLQ^~$w#hPeYjc(u%CPFAVT%kD~bMJMrZ>fYXH{@znF-dk5Nr99k>0b5T+A)R@T{zGq zd6tjEI{BpG@7XuLICdw|Y+c_^K7e7H+(NXne?XACL9(Yv%o~*Mqh%l#ZT+H_VrZ2o z!T2;*`IPW{{^Faf{EsRz?N2Y`+s&(+&D)pq%lpFPKfU;M0rSC^KXcZsLEGmS?T%`> z-Xpg+7&N^z0wlR_-WkQk%FA>_9}k)1N!A{41v+4pmXi zAUKqybfgq1fHQtk={GjVlTaKq$EU<%9jW(_*g0p3`ZJ5&fr#8oE}~PIUGI?1Sw-tv z87es;I!Ub-E74F74|{dndymwELQ&fsgfiWee%B=Fw?#qjPTLSBhra>caIma>2F1ol zEL*oMm!cd5l#ohOh67!ZXGxrJekX--)x-Bg#cJ@xw_W~y?OmLFRG_0( zq@%>JIvQ1*B=fSTVWY*_zM&m{BBZQ#czm|bd7%DqX$M5&Mn*E5kbUiT*r+5?jmjYx zT>_`DY^Xl8!?Qpfw!^30$5uN$SHH!G;PwYuw(YUGM&%j2k|emQ7y(uCIT9twmiUk! zo&@Be9zJdOyXxTsqw^dYuzNe>!8xe1b)=MfF`enHBO@wEwqY?oIlVaGG_=E$Tnz1S z><#Mr`Kn&qtcc_b;UN2(!K8aVAC;m%5j(@$Kg$vt|tXKq`{u$Lv!qhgG9oB}(c|l4$i>VyjB5#;})Mye#S- zhFW+MvIkswRxNzD7WPD-+3)8#co#Y9pkg+xs8~`V7EnI5kb$aie$kM9tc53`IHZM7 zip4rj?~#LP!GT26`&!Z(GGXY?(9tJF+#jU7#>$k~rxnEjrCr=@j)%>??Y+n8t>*ZT zhJm|j;oBl};_O=Gs4`B&<8O4Gv5%| zI-^Np>1SdrYsD12Duh}G52)QDOkGu2TWz-l3M~#ri(Ak_aJS+Fw*bN2-MuYP+}+*X zT??T|afjmW?$G}E&egf!$rIV{+OuZX%sL{^*s&JSboJBh$0O6-DXhlt@!%E_nAdQP z`@=HgA!Sx6M+x5&nWi{QwbNiYIz_6S@Hi!M`INr1qhfqe&r7!y8v%EVghIR2qT?{p z!fi7W5oOP4Y{C&)=W7*{i_Can6BDZ^5XNPN+L`>$RxYcq9JRv}1+g-aQ?Wgdoy*qr zr&RWn3hCr^UBpglU+CGdQs(s%2_O<|9~z>&#NzYLm7dtVxKY&No6se6ZQBbc4ooU) z!IsrBH%8~7gk|mww_&Fo?eY~70%n6Uz>D)n)g$T@jr{lhp%Rfh1E+p3H{+|%7OwLv zwokXItUMdtRo7T;>#y1;chOaBsT+$Ym7cr}gL?W7x_-cJWQbss9OZxDjgh}MT(DD z*HJU^0uv2m*N&0DY^2Rxz7hHTp2tJZLM!UNsGrtP5w4a+qf=#>K>{Hyl#1?PRYe4* z6hhD^FsYWI{Y2!etyLPmu{Op{Vd=o}RAa5ac|+l@OZ+EZK@{Dx5b~Xja~m7i{LX{A zvhh#Pd)7Rfy{`p^N{inhU^i9t?`5OKJM3Ugvn64lsgefH35L^~ z-(@z-GSmd~Om`5f?xVwk9+R>(`YkUj=&1}Gzc$?5-Gw6lr{jGlEh_29_Gjyx{rS7Q z`MYsVxZY%Kt#dFd$|=F)nXmC{^Z%PAJEivdn@?$jRW-I2A6&y|WJkO!byzMGaxIiil zWSdC|PUdArE+}7-$9=K3DkpB=jY}aRf-rQ(8$#p`KL~I$Gpa4;c#!8E-6D^l$!I$V6eC`n zkzYRxlt*PnmESpQi{^U3Fv2qoBgmTQK)Aeq$w-YfLbR53ryk0s8(NL#n9M&wrLXf@ zCLW@1Z_gY?#^erk3eX9=RKe!7Odw1$@tsanF)Zziz3v02OBW!9&fMN!+8C>iC63wwp= zaD=p~I({nPFIaAa1_r`mO5bHe?BX!_z zUMXB>kLaHE4`lyds!_(Q>m55x>TwOL3+|9>*J$ zvzQ}IgqEzau|e?maF%3eEx^n?mveP1yJK4kB_=ME%(mPx*^ki>kw??=4K4V1Xh;63W3*BKFl8nLG z&ZQ7@(Z+gyr1rxHiOF^oRcsvM?_mG}nB|I0^rM<4ECJ^y+*E;Q7p@ot2RMjOQKaz# zTY>T`Dp8J^!YNu^?t@%v>36=<80F5$>T|ClvXeY_7#iaJ=~H46bp5@cKuOLHmg-$Z zYRcl$OF%U-MFw**Pm$#&#mtla^C0vvJL_8q5=GnF^fQqFKGPk_6!{F`%_!1OQN~}0 zA7HFq0dR7QjGl^?V1V(fq5i+ZR_Sx_pkr%xe6Jt7UD2y9tKYg4#N&JRvR1NYxO@VB z5rQWXAyWnRZY*%ALYHys&o=h@6u$D$yKj->#}QZ>#J+Kkq8Brny9LE_SYVsYEWVGkmpL!A0mpe4dh& zp@JK?#zLsVRb6{)=fk7$fjWvxLPK-t732LcM#j&J-_okA`TNr3Mg2myuC`AV>qV9N zgV$eD9AuUSQ>*Q-Sr!d6-_vMF1{a`zzah0XHPA@FRJ?+DR!bglVT1dOBAA%r5@Idv z-GV!*pV%c0!3&_xzFj<$b`tQmjaH^}4|Bt5K0{8(j)UrdbwTyNy6{2TbhG>4n8JGC zc{OSa#yV};^>Br8(pqF=wYe%P4;K_R_3+pWqqfifJyZPKIdNQn+0-o&c|L?y@m*c! z`lvNWV@6_h?uVKcD>Jmu4RXs1lhShmnbcM~gUb^9uacX5TKs;b*x!+T#Ct@g2pib3 zvo4KZE{R9H0zFir831#~lx1?4fkq)x4;XfA%LykDiNR`O_C-1yjnHL}iw@@asH=)s zsM)_*1X!|eS)3~BviifVF_7p*sxd(SLn1I{k;1)6JKzvP1D~TW8d)c54eRG1)F&I1w-=JE#vEwd2veG(s!Y@#Lhvf?t`?luMxE94$VsM4 z4?A4e2_A=&p>sQh=E8s|S3x}^7s`A`YEmh6Xcyb{7Ca2|^^s&F3T zU5VhTT~j=aq+=VJoi*pqsWLCt7Q!kOsd^726$aa?KB~ zh>vVWsy&M@CR2IKLn@ha-Dk*8eG%-$=I9bX(m>~v&^6dE78{xjGnn#W-8tiG3y-xr zZ_H`q?N5Ds9!kr$1`eT4n+dXJ6Oj_W6qEJczgFo1xl8OH z1N!I9(oAfZirm~p-T)aok@9#NKQ!y-T4@<|PIbYJm$sBQx#3?;q@dR_PvZ$4 zJ9gvWNy*pq)yLzrtq!tvgVGbMtMV?Ki;eZspE$qdKD|7@iT-;!-Y>S}XYcLqc{0+> z+HFqI5|m>m-AIa^yy~?*stxV(eR~@}3*vq{a_E)%dnw(cmvgDOp|j^}(ED67Ib0E^dp{fOdiC*hvG-$WXysMiN9HoHNGi~S-ajiR^?6}W9jqturj5P?MeXJ z4>v@gHgEQS%A#K^)i%~wj!YlfB%!TQw8nxg?N#nX9#%+km!i$ACqC9u$QqkdU_Gsx z5(28{lxkgVvhBImQtZTLf(^D<-hvVE`<}DPk#?*9O(J*Xd;7KBcn!ny%c$Jk?&d1# zEE_h3k(?~RL+yyaC%Ex_Bj6Iq%aY_Z20wn3Lp0@)XbF`{1Q7uBxzZ80L4=A~{OWN@ z8Z(~;!Ic%S{|01X}T{yA$UeoqT6>R923(~-+ zdA}ub!XTq((*>#w`H={r1nTgm^R?&5Z0#z1sVcz^+`r>O$>NN|R+Uq9$&l?MDRf5& zo1|SnR$JFt2uV%^eE~xF`J;a|enLI^lRjRv&d*XhG9yEPY{%VRUZi+D!K4IQ0Bd|S z^E-T3{#O1x0w6Vw#ZM&Tv0^F$us^V*G_*4|<@0EDAelTVz+r@nzh8&D-KJpu>-N_D znzwg(ytb8lx3;x5rq!*X`u8%HFqCzJbo=C4Q{;-LBy(W#qW5E6PaFTB=f(5J!SnbT z*DrIPUBeofluSf^;XR9r^P94!dYPLmw{4QJt~-}uRfHa=sezw;eu`v+M`xmLg$?CI z*uhk}d&P+y=TKM|l%nY!yQCThrWIfQ!u0`~RN0`|P+=mRzs@6tRf*9Ed6}%h=-oPZ z&&Vt_jOBCH%T1me-m>9K&Bp4dD~vd6MXgU9DDfmq-md0^ZzUWa+6x1@0JUS%HeowL zV2@I_us~vKgMRdKDdldZ@2KLxTY2@tC~F#xb@%&{P!p<4T;PR}I+xcnG|DX5tS;51 zQ&*?eHB39hx_Gk3&J<|vRUdykpIED%#a|uE??z>bGRY}lvtgft_GbcboPqiFX~5u~ z-XmFO-K{&CiJ*~L0n7}<8l0`s&Jrfd%zCdK8esxt;fbU9Ew#*uY6d|Gk76|5oBFMM z)+U1==`9eW#SBCpGN|{m0<3Jhf8$OL8=SVo^oD!hIY1f&e0 zC_Wc3h=lq;)2(h%6tDv!7wYQ0%}mbrKLc`g#*XkmkKNdWH|qYxz6{2FHT}L*PQW~o zLw$^Zn`z!URW2}r@j}@rLaQdesu4BFH6g=4@NK3%lYI6|7EoL7e$$5z2~Ft6!S#|s ztQJy>z#p|>Q`pebUP%Su0OY{TMouCbFH{L3ir;$zW4=1zbqCl~WsM*-$9zY|<5;G7}AdxXKD zeKl&P$iV>akF4z)h56;w>ADZA%s-`uM>GE*exP|;y??(LHnxQq<#f>A1jXSssusEp z>_xl&Y@(;ij#QN*fztjLA$5T9)9vlSOb%Mmu0C>x=){OIe?Notd=)9P(X(QPMWRd3 z5^BGNx^fgr+7IIj1ZQvR91o=J-w?cniXhiIfEmOiI4c62(-H5Pq*xH?k1DsBw#1E* zc^+vDZ$ccigA^9&Qcp-pP8_!Gogxq+qUMHWN1vmrBXW6^<3id~^X`P^bh|a{d)BffKuoId` z81z;WA4(`?+0TtU4 zp@4R~IU$QxvA7{-fe4F40Y^`&Ue@S&b%t)HqjdLqg5gz6e$eECNgFp4l~z5BmZ?SEK(>W ztV3Pe927srW$%@mT063elm44I82`k7&N%PF#|<2gGLTxd)f>tyK!*@Tk?KBZag$t` zYn!A=o|5zC&>NWW;i6oS>0TRujCiLF@jx+Zu9fo0J_aMiR4hbvY)my+%pwW^*?*TT zTW&bFG4Lw)3_6`#m_+d?c;H)A*-n@m;rkLI4e#dBFLDKIG z4T<1&c)AnT>5k3K5#*9nFI*K2G>k-mQrHOLkE@NpuNzqZ?tlFgdVP!i_qX)l>*~Lo z)_;EwL<8PF))+pXHirCAnSlk`8y5>u=us>cj}+|M&s}^O?hMi9&1}fBrLW2$NBgYY zbm>Hgr8##0ZK1~EGYd~3fIpUz+w-EPq6}IFU>!}^Sj3yL*dM98WJ4P~`Z-{(+;E`k z#rNPQR;id9-uTB)HvjR9&gX3E2P#6G12Z!4#1clr=R{HVT@!-1#2=xs^w}bMvRo9Y zOP)4|AKkw}E@^rTs2wc0w_*;As5nxKhH`gwAyO z+fh&hnF*KX*{RE`MPpp&Nn*f*6z-dkCT1zmha#q9++2 z1NLS7*R6a$Aj4H^r8dtS(Ug|m8naI++D&VUHCkh8WWJ4n(?6yUJYj83yo;KooW&Rk zuGGH}c1~6rs{|}x*`UGU(dxG_Eugx1G@qN2Mx&}O>P6LZ+hx>+_*?+cQx|;c!GK;fw~R`XQ|r-m@@L?`B9*J?%Wj2ny1tawIip9c94T=H$wEw0Uy*S zEct)2;XaQquqXLiI=7Ym5p<3@bGe9Wkf{>Ju4%E(Xo>~9xSq0LnJH4NV1pBpq+|M@ z&d%ENR|H3X(ax`jUp|bqrss|z`I<5Z7hBgFUsHAFnbZ>88;eF{VxmU0j12v5AlCXt zy8!}*=@*&ofWr2@na4rB zbx82Jv!VC#=w-SBn+>v=s3uyVMdjy8vkbN^MiAXQMet%-a#V(KV|7&W7Ki~@hMqfQ zlH2Q3yF^8a=2bbhSoMxNu4ov-KcJJaBUuP0=1AGCsC1w0V(!RT&#XV3hAtJz5y}}baB_a%`Pz|^nXyXrv2Ez8nELq?KiDLtAHas<~%PP ztNkUo$j^z$^~AzAQ+!Y5CL8gp$Gz*I>?!A0gp56N=RB0v6^O*gK*%w24X7+5&}a}S z*1%43at*gGdlJFX%&FM--DlkY-dv<(+?+WrQiQBIpYZZyIpdiPQ4QUWnnNep&0X&< z8_7h=pW+=QrFWZiP6|(&^a}s4r640n;sP&P!Yu95uB$l&e+3{ZvFwQx_krqVe{qo) z-2LzVSpCTJCfpJOc^QtJnHfB|#7UP~vAs}zYi6x6sDejt*q^p*za&W^@#G2XIa&V& zyp30SvVQe^JQny@>EU~wncDjBigmHk)$2`RNTKFW)a&d1c25t>s;>E{Ec#oWO<0uo z6J5`qr8UFdbf?NY(5>#_K=Al(J3}rR!N?-uJ1*p$&5C*lJ&?Zv`8*2mut-Hx3xO@MQt7UD@#Wm)no zRV7{+m@_^t-$$gFn-wk~a4%cNQrt{VEQkZ@A#+#b{};uaRAOQ|HyG%QyA`#&{|jLZ$cqJ~j+V`g5a6xR6XU2aq7^&{h#q~2+)h~< zE(jq|_JSziIO*8;oPt^^$JKLafN2hp!INx6%Vz65IR%`9ra#Jrv8ei-`Fs~Tt8=B& zHaEAa|La>y4EL>+cJ+E4%Wj^K%pFqgq47CJ9MU>z1iz9TG2DdwXG7` z%Z-+xA!zB;9jS%k6_#%~%i}?i5rL#ii;`Adngn2O7XT6{H`GN!vB)uLUV@!@swDX9 z07k4R9&>bV^euTN!3Aw5ci;UJ-d!BGX~Tvdfdr!E+Q+amkkL2TmIc9KKhjmks}cMB zMS)4R)+G2?&3@Tz>=l*(^?~Er@t!5-<^S*ngUo+epKqD^@NNUr8NH~1l<(x`p z18o#K)w!bC96*!|x2e*PMA?j%$~99gNaVJDtDxgbo?Z+rZq0EJP!83(0#H6w;(ujS z{>$`>H@6H5dwhEjY@t+R!FCIOAo7;Y6f-BIeShBQ#t5k`U>A`0(!0HXepF%23EtT{ zfqwnF-RWbcZ^n-dTr4Jys8Xy6O}(>!1F>FLyZF71m)A$z%KHztc-jDu7{1#Dv8FkRJjR)h=lS2)d-M>}w~&kF2CR zu(`8jXtJc;E7XPrn>!&pb5z>lI_*ciwj4Nr&WRW{C>1@e$|vvOr5 zF{pMo;-tZ^V+?qE;3)>}HVB8_tT*y!oBW`s$V{M_(gX|7_XG_ZPx%#`f-0pX-f)D^ z8;%|c?6mgy{rTdrvMS5?+s4p78y0psl|gTofL^GZ4C{zBBo``mhtY1 zd~u<%0qY-+4F^j#*vjs>BwQ23Iy&tpDTEuUn*4+7idBty300`cq-dPi#hH!fW!TCH zE^1Ug4CI~SLitm5jW}MHIG#nL>t5=~&B6#R#k{j^0Z%-9T8x0XQsM~u7}I9G!4}uS3A}Z~dXo`iYg1BS_}$8b~X=$-8J8xB_P0!#IwC^YsWY&5;r5 zu|Rw9I$P-CrFHSbQN)tw3f40mV3cA4**KZglPcSt?5`!)(LUCAC)a7>BfB6LnsR3L zS(V{pbvGYPG@f~6Kk|n5v-@1P*?gatK55Hyk;I{GObm|L1!X%oXf2szaN9sK1QP4~o2GJM5TMBEKs)sfz9wK$~WU%+81rr(mRma@KgfI}b|G~m!R%31# z@K7VIseD6Q`M&;PgXua%lt5Y*>J&s2e$&cL)DCsE z|4#X5d{K(b9as42_ffk8W8vG>D%8I#k{uQf1HrB4w)$1pR0t`4KM%YJ;zDZ)zdq6R z{N4IGM)&Zt@fFd^$gJzBgMNz3k6h(DtWmY62KWSeP47>qh(_*QS6iAdE zt0-)&F3!7F@-B+Bb0B!h@UKBwqb-Q-9i%p^q^uI{uo;mLRD`0&x!X5=bqwt;U*icO zwQW;yT}(sCSRoJH-O_tu6a3y#`&G9$4DdDxNZup&x|msMx_xQrnA1&X2hjgJ#oeKi zAD2+22S$h}QVxmQT?nf%R)nVfPUn#d$!8J@pR7R@RiS&Hqlm^#jmikb;I>#+ty|1? zv5&w-Bc!5hGF!?>EVu;VVoBnyX9Lc~ezAwpA{yLN$q__XU@rOe z$2!m6^5Xarc8D0CPb40B^gr-oSv#2H$wbBm0~gXuGO5KY`vg(k)!j$w0n6cTPWG;J z(YNam0*~&8{sH4E%r`Hc&k_m$RN$+HR_7cqe5L3B=8e|HPSLauJ{&SW7eb_+>z$#X z&tb#6QT1(E+H(>43xN>^EO@2ED z1x>SOO6;1in&gFGNU}qCjvmqzleGlI&;`i@(P2Rh# z6(?lvl_~w{MtHOFJ%O7!ZDY%H`CJ#=cr)`wV@_2!3R4!sf6#1R6;V?N z6!S#l=4OwNPhz$UtjIt7&zyYd=S`W@a_C1+Ds5mow`OBeX{pcvIqLE_j(Aht82lh0V?)Bg>uf9K$X8M};h1MA}H_eF`Z5Xun)bQ~#@q$By zSI~r}ecEPYNsnpTN=*v$6N+G#rd|d(CXf?Tb+%o zEPJ%aL`h}X=I{8D_f;(6zx%)0Mryrn@v?V{=bu08u5BqA)-2Y3eH{3}?-ifc8}KhW z@9$SKy52L0tK}!3gJ474T2c<~7O{`FMBP6sgW14iKjp9o^8BqbacvoBlmk6uJEws( z6n8yC-v;}uw2Fg~e`;#fcY~AsQi|D%y5b)o)ah+x0eqVAurT{#YQv<6ZqcV4Q_Hcw z1ixB~I1COSm_N|RlWl^jc^f>s6cvs_;t)wla~yKM;&%Y@?Dtq^{3ONrAj~eXj2oTI zn=a&awrBZ-bnGR$c2+wKB%t^qW}tmQ+iK9M;x1XGL}crOk<~=K1F^QnNx(>HebbX@ zhGm&EHa}iV!YX_GyNZ_~f!1@pkGd|Hk!FfGtz<=Y$eyHK0fRILsERAbN`Bau5x{IpIxIb>sx6gJbycQ_NQXfIz zV_|4}&$H5f2X5kplK;ugkWzpoS3)xDQQPd29XpdHe=eo28v8-Y%SuoL=`{crJwML@t1^SM_?uXYox6ERxS+;6#j#7=`aZQn#LmE z@X9|PEqYT3vphnmZ5_Ss1u@sti5tQB8^}MfX=^5mnMl+ZfV#GC7OligBNDUrJvYo< z`k=q#%D|-N9V25B?Kn+^jy_Px}`HT*Ii6 zJXoZ)$~Dqlb-F=SlTZVW|VI9!rZ`OKr>@;Pl> zNGLBjxwlZvlV9S_$jEA9M-ft1X}cHakxT%-VC$#nXqkS(14NX4J0tw%g;SRPQONF-=vQL;4;OqHlp{%X{)mMh+7y6AVGDg85FMTlej zz5fBD7YNOrl3$M*g1}|FYcx?3TT7LYrWlZgY$~f^Suu8&g#u!u(XEG{T z6v##;Z`8Pr0CK)vuZxBs2xs(yQTZs)RQhdeG^pjw7NzVx>7Rmj#AQL$F?g_AIjTxd zY$a_n%W6erJe!B9IVWC3=@B0g&k!$4pCP~rU^5i(!ELQH!#X5!v7#fRQ$i}41=aiw z-oJc=D_4mT)~qX)eI@+itQGO~N4g-pRVyZKt4c!sdoU%7H_zAzfw`kPj+*=gg?{vY zlE$m7(Q@&&p=?v1*SG_yDXQ!CTREe5%hbU~erWgc$dF3JoJ&~dShhqt%x^ZUc4Z#h zpwE;8KiFs-6p$ShN|09%w;kUZY8DgWMxm-v7(7O`993Gh4Ko8vCt z**pO#!c`|JIs6Pk{%Ps-pm^=TxHJh)ynOMMB3X%PuY~AHYU12}Ec7Q7t=0XV-X7s; zlh-Y@9B#2Sgb`vLbCD8Kl4cPMWz9NU|6Ow_oA*x3HdxN;?w{m(6XDi&CK}{>e@SRi zFJ@CLzV8+ZtST;ZacD8Tqgz&H_GE>r*$3=xUhd-0*}>aMx4x>(9!C!bFV*Oc?)nA) z*duF}la^+wq#?(|fpWX%^w<0r80$pcWIrEW4>h|)zMoIrT*6+^Y9Tg3B*~GNYQjf^ zz96BNQE4aEp-pSuRE1nn-JdzLLbp#Q+dIp4I&%?JI`C*fi!gRV*^orF5-}RQ4>(3b z(cu_#vAVFK%ys$W6^~xDAvjep-|Jg;8!!1pl-+2yC=qGvs?ji`$l>yZ<|XMtns%^k zBsk;D`N%V4@I~_m_7Nr&f36WQro}GaFyLsdB`qT1e_@JH79PE1@jDYv;pv@0}aY>FL9heEUVqkz_ej7d)Eq=tFB4qE+y}8-?ljFH%$2m}8RN|Q_11N}E&C6N8WHFf%fm$9f;)D4@IHUfb@D!N_Uhb! z&Ad=MZ89_U0pq`GK~0k#nV@AGoKdbpWePduO9b5fZDWOUp~J32KJ43M@#?$t$q|!p zz!7K-fRZ#*=hFTTM~FY;Rwb*6v7LZ5-WfOKiq(LEZ^L3cYQ(P4g>|GNm-j57PrkJM z$wj6bkzzXlls{Z?n6xl(ccClo7m{$(-kCBu0-vQj&Zv$y4gr889Z_+(r2IJyf;1JI zYp`^>1ZwzUom)=Xz8?_V4BeYhGj!(<8?FTvCCRcdLVZFaCRl8dY&ngK%#$zYg9%|a zjCP0bqpH_Gr{^2^6G+Nh9;lwjB3A=cCN}dnJF&`WeTN%baRZ?AZM_N#eU~;3(LV6| zWVMp|v!a+;%t`Az<6endeYJ*s@@Ppg|6DHpR-5D7G8X(c#+QHKUN7Cf+GmN@3@=ZX zuRi!2uQzYDPoGH*dOD7zq8|3*YHK%Av>bPX^!fefQNDq1WfjH<$phm%l!m<8o7pcR2a*Z8GE6 z`iYr-JmzobuL7mAAt-cO#e8~(;cs5m|77D0{B>2rJOzibHJz_%a z`WKimCNAecCQewC51ZQ=x#*4~ERDM(3a45-u>ygKLDgNU0*45*eT2uOV$C~Y5QYD$ zfbD$cW=+@$$4%W>ioXKtjfynbR#9#9*1iB)DB-bbaOWO-`&H@v;=BASe6Du2MN7#$d#Cl)PkS(2#|r|Jzp* zyB@ErgUo?3rqZ?XPSLI<0ewI49{6?HGM5)r<$p1DC4XqckcqA+z6coM9$fjr!%=Bc zt=KLW?QPn~g%?Z@>iCsyP8b}Ualm)1RrfkGQ@q!@!e!iNoYa*8V4{j$dl9HdS`MpP zMl3TGgUxiR2VR;_X09D<8%%NmO8t??()WYRIWWOtba&aqWlM1y=TeOFF{XmWFELTg zVjJF{aw_Ma0QD)efH~+o`i!lGw!FMmW9sBT1owd#eh*(!%SC^gj#^6+J7jrI3X?Aw zMfmjRNOz=oT0Q#M40ghM_USHVFG>w;#V-crVfqikOs(JP9~oZh`0-KS(<|JP>_{h= zqX>Y8+PkKVIGE#BwONX7nJEGHhHza;DbO=D<6}v+PkfwY~?V33?kNv18E+B&LNFFx( z^8$8nSW>^{poF1N1osrHnN7={?$X}7`}f&|`764q;@e!~$<o zMC(1E>fe+l=|$|}w&fRZW4s6=r6TQ?6KE`m8yVUiUfpTDEcyP(>_24rh4Ylt!{^<2 zK$E(-GSpUl^zAhhEuZM1KxN5z+1z&BHHa&fi!V1x8MvStCZ9t%dA zn#o!PHL&|I>5KCiB;TVw-|R^A%9|o$GLh|c`zEOLo!bMEQL$|iAq@oV+YnP9^ z@rZ;J_NFksCZ{cO((?zjbLwKOKOq*(wqi3*>R1GYlBikv@*@2LI96f!!+(Nfq=CCRU^Dlq4 ztHIgJV@CWY*^543Avy7Bw1Lfg)=)qrhyJO}aPP^xO+SmsE6H#1XKi(?=3%h1U zP36|y`59sw;J~gm?R*$*{C(0Kw_F&V=x@k}hnl0`DEyPB@Q377iTF+NjKq>Nf(7V& z?K1$fUozKB01}he&b=JByw}fN|Mqb|K9^GX?dmOYdSX~2#0|~YteGbNYd|C}A#s4f zzx#9M#BFPq-IT95%$|^E+27`fk|BNhDjE3qYwZSwPxZFFKiR*<3(T+nzU~T|f0wmH z;nN=#+TuRF`^Zc_@}sha zwODDUiz>l7s{GWk5u>SBrPX4?9~@YNocU%^hBL`gUpc6(Ml0ePJ2MpQfYCNFyzs*h zdLG4cK+#shFf8&ztkGfmxvkm^LuxzUytV!2TaP~A?>K}~v7<8sNJhYZ6afd;w8Ekx$>&<6LS@}x;=`yxo zCspZ1a0$X4vRYCW46@~_+h%fU0pU(^6ntnp@$${s@)2abpd}TC|0DkLAB8BzdHJMv zQpaiXhh|LF!g?m74=qvRG4I0oaW9RsuSHDJmc5MLBQ1RY+RgTlUv-TO9yig9~k zhg6bZA22~>71QrD-^H&V@}C6jJ9aG*I$%RM?4{S8$^^+~CfTDUR5KD!2|`S0!1<9j z<x)rEE00CZ*U>n(%031 z1|n)l~AZp9FQmb$(~k)+XF>GmY%+M4Aj0#T&!qNyk3iv z?3WZ>(%~|?Xp$1{n;i1>cMvVc->epb+$Yss-t>NLlr&>98~emy;XIJL5k6wxdFe^A z{B+!irt8|SibS&4;g0>e5Queym}(S$cuwACQ;asS%CG#*#)cMXtx!Vp?A2+>2DPw_HgRpjfH~`kpFNR%^Z&)b~T8t0bzyq56g+QJf z=Y?O&smlqnS_N!f&NVo%{sVepp+I_^lLm>_LB51KN&AtzNVPTXsS)-ND1&->gB_QD z+V6SiXxMtGS>mhzkRDBr+`K=fd{awwNs{f?t>lY$&=*qXWXsuMKyrc*K4K--0`QAK)~#iBL9NMEl7>m0cpCxJ4B+^&1T8$fBRMjA#EkO1DCjTUpS> z^nZA9xK1?E=%yy-*SxTQL^}M5Ezsk0z0I0M^k`F>{ptZs{|J(<;+B`BdTK;S>f;R= z!ue1dhtO1VV}V9o(VNJoP~Q6=i&NQqFg?9y0U+{-jKYb!3lZ0(8=*p?qLXR>F^H4+ z(aOx*ZGNigg^BH2Uttix=C24BHW{^i(cqZ7;Ynh@$Ryo}<+Hn!8oP@c4>qx#{)`~) zU!_34`~&?YXzky}Tth$q#|PMc0pz)RiOCGqvA(&&^x}GDU-W)e3ZGq{)iy+qZcm{x zb_;bmFi&OW4$}oq{&smq*TGev!r{n{i=MG0oR}musSrW>e4-Enj{LzXix30Dilc%s z)jj#4fqsEg)q7G%s%q0nbe)5$h@eotdPStWhY&t1QDRWsA|jdJ0W&^-NHF{tDEgtm zNoWtIHCl)UcLVVj_#?10FIsX@6{}Iz9H+P1 z;fO$%#K9!+dUtuV8$dXX)#Xyc0ORTW|vnnWjSI?E0{AkwNpA_Fr~>V-rx ziF1!8OiOQ~ho7a5t?n=8=4N>{e;zMQvaoN9ozgX_wor&a6Pq7~c$Dkm7oOrN@i6nR z3n3=f#C#r4Wc$rHPDpQ}l@aTH>b}E+ZeiVL&7C?`R&J!4Qh2*p2b4AYJsqb=d9*z5 zT<)C_gR6E!+rL!2A1Yn&?xcPLMIU&LWQB;?$-Id-Oo0#fCRAN-t;U8%m+>WKz_xjO z#AhAZ269t0{*}Pgi7DQ@ompG%c(H+|bll~hlNHr7Kz^WS^_y^O{c7Hq353>g$If1U zDSF4sPx$c%kX{1Rd@Xu0}dQY5Xb~LLG?l^k$K5X?<(|#m51U8R0&v*PqzKJAd z2z7s5r@zR}-X&(3s<5C@`iVe|VS;a#=NtO`J`Da>juT?I=laQ9r5k+<#)v`uLEE?a z$#%Hv6X4Ge>Me&EVvXD8^iu>ees+K(LDb|npYwYm2V~`?z8jeBrKe(J&T+;fYps$u z^s9kk>cH4z$)B#r;kmvBul>$kUO)d3JgOt^4qE1wrJ~`%b?0MR6ifNhW?~hWJLFY> zUm3abPtRE0nHqA6*1jV}PJ^8WDk>yXKgnXncSt!A|0C%dqvLSDX41H^*_a!fjkU3D zTWzeyjgyVq*xJ~()2NMY+s?bc|NDKip-DgmIHpGLz$3 zBL~mbucl|X-u6)gI&Mw~C2BHLQcBwdOEsiG5#T>8v=`3Nh1xQAJ8-?qJsmd#?S>-n zXFIf!#f?1C*wB1RMCO{%eh(byqhly9M)Bwr$7nNW7jz($`l)U)ud%3-cKQjmCv!*U46oi~q?iL(5wY z_TJC*B597Pg7X;?l%UAYRlg+0TZ?r#XIhSwuRq7sscz)<;oEh^+#`7FdI#Lv;`?V^h4 zD51?wUqU=)*FeqQQRxqrQ~ZPAWIo!BUK8R;W>DTmkKeBGHZ9r!k(AJ1GEI=TiYm1+ z0HhwlaT<2q0IDGOG2k|S{gLe#ySe{51)%?+MR`0dM@*gBwN-1R7{A?x8*e+)Te_br ziB7PA2ZIk|X^SE`=WIC{5^lTJS5oLrLNAKG6lGq*i-6bUP1pwlhYqRA$qPr8sWY7T-e zaKNm@M*%i=@2ysEH_AfxqA|36qImOSI#q}88k&=`pVKD*gLaxqiTvRfU$QP$vf(V~ z4V%-SZCJo|$a%(5`1Dbix|{@S+=Khq2SFnz6q5ILCv{gFMuUM}t>@536BOeJ#tWYA z_L*0E7ay-L-S6-5b#C3aDO2ez{J&6qfq7}sy4>7!Gv#%Oj>d)sY9pH5Xg2a=rzS89 zDwNrwC#22UhLpnVfRW8bb|$puic0tJd?C!cfnp!rN+H|ub8%Jm3(^jOJk0+P2^9p9 z-01`Tw6E^(wqCR^jK(B7Qy?}N+DH947tlG}2|*2;LtxThs3)mH^cR~RKQNKd<``y| z77C*onw1oW8@BQ$nmcb=It_{6C;BZ9vK%C8Mgo_<<^Q6QJ`X6agHkFwZKz|=gX*P? zP<*p1MTMw7?fW6BPizco#Jw8o6?P4-PF1%2=C4aUfT6z{vMh3On(iYR<3SRx5ElVM zl6CXacxpWl+4<@P4NgpbRHassL$v`=JO`!JfypaPF1Df7nH?vB4%p#L=z<>+FJSdd z{?wr_h+Pl~YNWHYYx@EN$WuU7t*c)B&WJYR;O7&5d`Z=7rX4XnM8D?7;n!f*-I=Fd z8_~#oJ0w~%lBeFLgEne*s~L8J}Gh!OOR?;t~g z89sA;$@-WM~VGNQ`5)yu9SPhR?@%s7Ebm?iEE1Dokqt%`9LnSJ-aA{sK z@Q=!Lmc_PFW4lgQ(t-cS{qx(z!Rh7eD*8*s5;YY+=Ak=*%~+xkO*P#>hWPMS)n=c=h?`z+a%I%CUB6p2!82Azx}8Ax**y1#(#V>o@rPB^^ zBm*DfSoPX@CtpKm_37f>*eb!~E32SI%Z_2FpKzzG59z6b11eyoD7}j^hDaRKNPt9B zUM@NzZz`_D7iX-5m$|F#I-1_!vIOXQMsD4uo@L1nd_W6E6htgdPw;EGED!bt-+cz0 z_V8Rgkovs6`WxT&dOIqQ@y7bz#YU!)vr-1WJ@0{X*Cvv|tq5<1^vVRYiEU!}p}k#t z%4AiUaFH@z{YZ{qnd~TkcV{%0#v85fa>^!TD4Kdoe88uY+@2VOtd}hvP#+}U9br)y zl@KKf!0L4HOmoFPpvLmWK45u&_ltHL3KI>e{Eh&q8qi8XnjaaOEm_qaEy9L-%ln!<05H)Y>!Z3{Hc`$eQ^qE zz+aH*Tdv>;W(wR#6E7_<+IJ|W2(43f4?n)3{`tUsb9Q{eey4p;d%?`?xnJi_Lk*G= zWu*I6X_UBY_}RTKyix2YF|&2)yD%1$$DOB_5s;}r=+@1cCDiU`#VK-8Vz5)m5PW55 zGq*(5HLGJ(io}&?YJ}mdKdc|Y2~q_@ecVqVKi*C~C1?-IMzsiVLA3KZ#fa-~hJhdb zyV9pRrO!Pzz=&`)NbC{1@#puK z@yC5*f6}Eq!|t<>K;K8L)Q1q5Q|-Hn%88RHr@cb)k_ja3C(cg%!695LldtEW9E{tR3}Dnb+cpTA@Gc87JI*#Q_f_7H)L5~6+|jz{M4I;GB@%tAGq2PzhO@{2-r}=IA-xuEl<6O!06&;!XyhB3c+RzNMD$kyt zVUv<-tx=G5Wq!0kaKT`D6-_rq^w#vWF7$&~&$*5&vMdxRO zti7GADu^Z`y{-NUW#T2U`Z|5ZhJO0<*5@Khsi$Y%;6AA(E4L#4`TND*apypzCUa{$ zi?D-GsLb;f6B*szPW0caD>cxrezQOgHKPk*kC#0Y8)hi2`8ZSJ0*dxBA*+1#W zbnkjo;qDHmh<@h}#mYNs)=ak7{Ck|L>w2ZiU4^T2{|is40b`2NJznsSx^~FaA5$Gc z@4d792Cp2{75KIH#tiJI3bXIJxZ5PaYl7{wu(w1aq45C*Zis|@GW}rvoxnP(yL+2G zo7+8nX_=g2@^70`q`T;fzPSCF6k>tdP^sNi47HS;u=87l%q;3z#9Eeh(3#nVGg^p) zXt->3C$>~OwXLd}WTU=Ms?(>04znFpn#$<*tQSv(v#d~4ZC^6sFNb0Q3V)-OVPQ;| zm%zz{yP`Eedxu7ga)oOjE%LhYB| zDedE`c2biZ#M=z5o>&7fska`j58nez=V;kjt`yLNdo3&Feu9`oq;MJKhe-VuXiO|R zP0i^agt2%aAH=Wf!~8`9QF%wYC6~x{F0r^fcR{I|lEz{-1MB@gDrBHoYiKUWJ z*3OJQKv!$MT$-Z2{g5YF59+lxp>*A6fpcKK_Ce*{OXu)KN_5{S%+J)FNi84Qv!E1b zJ5T2LkJ{t-pPrM$Z(qsOf}N%!uV}bx3<;-$2cWTVWFyV~tJq%|mUKjI};B%(VM zBcnBL0KLv#8J8M2b{sd?F*nQ0lSy_d4Am<)%EAFBiDq@>KqB+3JBB9puHJfuOi%!; z+~7I!E1Nf01;1>QL)xvb_%2AD0#`Kn3ot3aP?nhy-lGV&z;VsMolvezf()`P%3Q54 zZ6bu0!G_mg^NJEYQOHaYb1{4Piu`ks_iGRlW&lhki#AFG1`+`XQMcf-eN{@*L zS@hyl9HWdzkx!jdBg~^W7E~?-1&D;n<5kAhm3UcQ0xVBT{jThz4_x@|yD!tCTn-6%^ImH%xj?lUg}2)0tC2lu7 zo^Kx>r^=rj5B^9cGRtbX+d1v1a3(`$Y>C@<1+&9Uf*+vg{imV!%N8m^5u z_#yg~uB0CZYByhFhpV1Qe?Lg2D)v}TCES+$@X(d|?Do^kSfh@7T+Lw8K*-bcdZ+w? z8tVc4oE>hZ?XO${-0VHBF{-vY5$DAE@wj-QaJ-mx3@#^^kI0sDq;m+gULtHt6ruMq zg7`yh7!P?Gugdz|G>skIRQnv3O&eDQKE8<w4(WNDn>8DmxB-Jmws4K|;>xD+t1WN%LYc(r2 zQuV3`5!0wy6I+uv2(3j1?(D(o9YM<_Zf%RG9%|Qv6@D24P*&3PWA#=-ysyFOBn32|} z-U&N=`4O|Mahg}n0H^K@7vuBqnxBbQ;o7zCmy4>bTtw-*HQqS+ZPqW z`qz{4e4AYih7kZrerz0K9ZdGacTCp;D@u%i>zkOE58`0c(GBa>97PvH#K+I-08g)n zH!v@61P;VD6k>lfA@&~lcyMxZfxd7CY1(ddgPj9WG@JuGAK#zPy3s1T-jo6^7ernI zu=D&ThyCVtd>kX0s`?MbrO@@VVKJQ#u;FoQEiAzfYQN}BmT`t6!lHnH3-=tKzkjb< z1#zF(Kgby#j)F=QL0l41#@dp2&QPTZusCfOwUffl53Xs}f5K`Ow`aZ+JfkqHE z7)!@-)8Q?!Ky_tP-ec@#yAA5}bmi^_b^zj)*TjmB|8EH^cnysng$p^ATnnq}J_!-% z1V~RimAUgkawKZcNo#aHs7Kpc28~Qb$BfbrZ}tJ}vYOdaTYcr%Oz04sEazsDrC4g4 z^&1AW8(Pna&m6BUFz3GN#pg%aRfH>5>*XBw_VsPO)g0Pog)x7aV)u_0dNoK$i^$>C zA}BzZs)j{Mi5dw}H<&ITn=T@b;Eq_-o}M9u?(SCd3XSRvb-b*6cl zn86AbkNApfA(G*`F>C{aitBGMGf+h1lmFaatICR?N-g#PpJlh{>tf0m4;>thv<<>k zs49izw^d`eU}FvnQ%p0oQXRn$G`i2n+SZ-BW&r%9o*$_9Y%8~2&x;MGcC%WkHWn$y zpQ%dhQkt(!xE|C*`-*%hZP0PEIOdQs_!G>`qw22j)hmU?_3yF>Z1-%*mixq`836SZ>fvLTB)2z1$Qc0RKsS>O- zeJUwjZm@h0Dr9{pS+wXxrZ3>9A(i2?y#L3uM_P3>(>LSF7p?ARvMWbc_V+#f4wq~f zbB3I|+{U26)`9d!YGu@y=~cYFr%*pniXoh)A+JCajV&f6<(BEpHiGqVSVBho7~QC* z-DZf}+?(g}@Ab?s%9G4&?L^CMZQpjotbg-m<7ek?Z-?d3#nan1KpY2SA4q+|>R8zIRmxo8nqY}ZIZR$1C*UgI@-f$|4bKAALI50rrU9xKU znwUN?RHlL3j*B+LT?bzAkzj{(sHIRudkBqZCUSypciU#$TBr zaK_K>$WzJ8i;;Q~s#cdgXgT^X1H;76Is1aC_UU}$DfYZe(|f#O5b3uLazQgzr2Vv*CMMu za(t|0pFSiKtHj_7TR$XGwTv*X$e8NU>)YGaJ$nhE@cno;cgB$3K_{{kYhcB^>7XM&6)n3B#)rE39a96|aqTDwh7lk)DN zVzRoUY9%9VXGpjtHloc@N-{>RCe%`0g-~$ep7Pu64^B;8un@cst|2P-e_ zO|bE2PA2bB=^=Sw4Td`TDIk_7HZ5yZV^@^3hNnX^nvr0C0d?uzWggjuX?6=B%svvYFEt+|D*Kg_?w3xmnJi20EUVg9#s2d-% zUGjH}S|8GcTTsD)jG3t5knvup@E-1X=GboM1YTD3*0gz^NQ87WK+CcaA#rnr3=ntj za%#qO%2+$jBqI6D%~;V#()AKNFbwM4}o!9Oh5MhU5!?7 z<@=vf1&V*se^h~zX1f_!IDfHdX3AUNRS1;(*mzN|4k5dRZCw_jR+^aP{A<>!l~~_S zejPVRCGqU6-VKC6)r-D-%t^*E^zSF3FwF3IW8b%e;q z^eAq2g(O;JFrYFI_bP6jp(OH2g$_a5=mYAQ=D2)>JXp-smz`xRZ?wfQ6V`v5<@sP; z^1L1b;@co^bmSfUPorg@cN|4AesK0OO*DLG(_z=!b2#ZGfVZg%ZW@4fNQl4NHlYEtq(#?5WzjXleXu5(TlXRIy8#h1{B7@8L(<9v8{ z=%6p@qUZX&9gCctcXlYY`@OyQPu#UHJRo*XLa~Tcz+#AI$^%+Zb*~H1 zFGP9dg<6@otMPk4ZV{49V^0MD%gsrX>af0`1HaX*RSt#fgg*=4X#G6a)xe>KSv&xy zEtU9QIA0qbykUA^|GEwBfq(bn+b?=J6I%1<5_KN9x-wk8EIincU(%AR8Cx@?@D}>b zeag}%fKIpN*M>EE1b65VVY_nH=&lC6ji%oH=cqD3>vDUC-Dtw|reU){J4w_A$`p2S=FUx3ua>1++c`_ba2Zx{o*V;K z*;n>^`TWudsOF*S>32OSbDiE{0^8(5s1DFY7`5@=I!A59ih8j%@e(c>FD4sCFUe)< z%jMV{=G|^}=z7!>p`=&2YJrEQUnf7gvUjsWW4OFmowb9^B3tJL+_ayplnVz0-nG6P`fpppVBHR>xgE3@AjvBeA^rUAr%A&F zU3gSsCL;P*fNowjTg}LFOaeg&Y2@a6&x!rk$9)qoR=`KsI_i4TaJMfNnfKbZr}M_! z<1=`Uyj|Il7R~={yqa`fmRLWKx70fjgNDJg_BwFPXBgy|l8Z=979aQNIKVwkYiV8u zL%Gibb6^SwiQ2Kjr516Uh~^5Ym&aQ7u45)f$+uL^7i4!)XL|&@%+m_(IEHBPqgnGeT!Awhebi%Bctb zmJ>*Z6d6b94bD+{Lm;5KZ!afkSf2vvhks4+T25p;fdW%wIi7=7!m~U5uvFur|D}#%*H$}bY1VIVK^IpYv4`KG}PNY7~!r%m}^)% zjlcH*`)u2#+{xMWN+~OyR%a&_kgGSk(w+@p@P-=Bl^sB~U1^_`=1IsL?jQ4qT@d}3 zCcA&PU0b0VV4hNb3v?ve#R>g*dlMoZq-pBAL8$bBaIBAMZl?H_$n6~ z)VcAq7eUn?YdQ`>wru}Z4Y@D?A7AWsRg_vOm{E1! z+4J{-9&RPtgKR_~j|B}dPOLA^LjNy_J|!9bX$we6TJ&}aZ|5Sb*rLaq{P^s@)>$Cf@xcAOb7?F?Q*Jb0V ztxy(e6u@2p!w_60B@AGSyWqZ(OUKc`JP$I4N|EQc8hi3L*$msmX+fn-!mn z20vq28OEUAA&vnTv^P>*ZZF?RVj~mN&$9G5cym%p3-2MOdh$|ur&SxR_jDTajrn2b zzWdYKBTh)Q(mJuTc`tde#PrKF|2)?BoooeQ!ly>d6g$Ridu2ik%fI1TRxYKn|2fGF z4I^wfG+s&b^|-Olc97j=`jt`yM^U$9A@T$GnQIR5KB=)+kph^qi+4<&{WREE*8jr* z4mCE@EOP{@+;?J8L#c(iC2s6LROcz($ff{!<8%G%URVQ2bY2>GQ=^byGGKRE#rwE2 z%w7Cs0Km0GUJ5|XFU4`!5MIWyr~Yz$EaXQYXN*W)0*K>vGTx2hh2}c_$GBG4cpY0B zR%{V@39=b|PBggt6*c3&rVvOU2iYl1aq;aTS&@9}h_cf`Boyb(xXf4bh)5|XX&O*= zTDy6k9G=(7BR|Hsj!j+v+bOPot0NB%>1sVZu?{^5C-)_DJa&`_y12vsHcpgCp%QA9 z@bWtR)_P&x6464D!vz|IWVm@b5CB`Se(JP?z6OWPv#>Fm{!r%QHJ$gU-F;s{Sf3vI zpfK*;49hNd&s<$65$PyTMmmL>f*z*x2wbXGyUZiVE<8oj&Q-_nU-`xMNAy&dHA+eQ z;=FBx+APwbLJMW29PhJ#oiwUv_cMAF#6}J+a;v}$b6jNiC7`4A-RtF7{VC~-@W>R6inC-{8uasAP`6+8JAtJXyZb-Azc!+R~Ekwrh zD)aVgs8LP};C7h0q_O#pGdZPEs?O2uI2!|3{xO5w`g2W`UHJWD7@J%9y_Y>&@e7x0 z=PJ}azgydhRRs+(f}$Q!*hyphj}3U-%734$Vfepzqv7GTp2-2yohGC*Bl%rlk&z|e zek7kpy!7k>d6wj0=JFvk1_^OvEe{v^c)BM(`uKRcVFv9l&Q!rd_SXTww-TB4&iB62 zn}&Uotj4k}P_sa#QAIl;RF^P@BnB2}d?8CoU#NZu%OSoLug|WbyW=|_Pkp^AsoTC< z$mG^ohx3?BFG@DNKKui(A%_(!D*Gm&aaZ0lBqmr)q79r?L01;P3$_1KcCzItJ0gzt zW6dp#SKu=CISbyLCd*Yif!+Z(HJv6U=y;wE-ds>#0C}FtG-v*&`|j{A)Z?B!PqWhNZSwiROVtgtBd9M(u>S zPJRpPm!aEk=)B+&ScF}n+Iq_qm1BoLhz9WrkN!(|<==PVHK!;}PM0w->?ZyXGNR3* zk|jk)Kl(e76Y+rHYCXpPOkmZ}>?DIH?*7>qxDI}wkxx)xzU$w`gqoFY~HR>*B=wKyW z&&=gW`;-X(mguTDijmHMNjkN<;xpj#Q{YotdU1m3%Qbh5MSuCz0&5-{+BBAXQQ$K| z@6=k3QkW4&vi9ufO&>s)=#?qHwGkIfW_EMqf&FnY?BmNDaej72<{`4WwC1)3cfq^R zPHXH==l8)^O7tEac=_k)-_UqA+&GXXVq1rYDL5cD$d1)ncB}-;{lXJ#`FPc|^e5ew zZ{ObGEbbK#wZ(-iZNl1cLytcxXKjUS;!7A%EFVYZFx_2;LaV)NM?_-)QYJ8w3)AAJ zX$?*#$zcEJ#Dh(vb(%J4gazFBm|iMkU8#hW*YR*;PcM3jl3t9y#0;}$TSY7lOM^C! zgxR6YSREIH!LU5$Q4@Fvfnmd{VlO4}*)2k7`ivul7GcXW(=oGdG198%{PZf)>5Ab8ci!8OM80 zKdD+{%5P)G&kGDsqC^JbMeb`<==fYT?(0={UE9eJ{@&3QMoZr*`0F~h|EuYY41)`k z**^+1%PLM>QdSR|6FiVde_#p6u6015b>k+p?Unjdri?%sz+L_Re%!sbv>xB={*ZR^ z>iBl~?BV(1-%-~7x_|Z%`1-PT^Bh^K?Fl#V?PEljYC-;fny-3=itnr0l)H;X#)0h0ls|q1*BP`@ z3aOy*?B{zoN}&y2)krmcTr+sCL)4MFzE-T=)I|WEQD96?Sx#rm;mR)s&I)(l6NV}} zKwNXL=wW3&?2BbNyuD&v?Sp+19Y$r1$q3^`!4wd5MSza;WvY&iclZ2IG_#3sy+ut{ z^KPX2L5dfd zuw8n4YTeWnqfJr#1%DHCu|8zGsy=1p2?bCjWR?r99|nJ_FM@gju*fruF(?A1oh)Y# zr9x?RQ@&3hotr(SN929Y-ZM4(v!?1L+P zqN53@a8le6MuK^Uw8Tj0z+H$RR?)K;jG)s9n!%d_<;U5?%F5cx%0sot>3es4Gnt3$ zLu>`@(}W)BN4)a&V;<{Q`vH`-#@v>RTG`JdGjZ&uVj-KYN0bBIOZaNnfOUq=?MT zOtpxI19WKp^Xb^s9x@rFj@J;OoSa|PUctvaf*5_dF6^y*%YTM~OASxG+qa75uY0Q?!G5uOTm?Gr7l_Nv z%n&P7f=RE3m{*`ouh(ddY?t!6;foI|%lTk2jipQ#mkol|>csU`!~CQD)4uaJzmMO% z@2~yV6VlabmnP>3LR9Qbv?*rXpL_B_7)5E9 ziLl(7RD}|QLrFgjJFYk_`|J?$Mp@0hD;Mfubqf@Z7EJVx6{yt|edF1OVNYt)&7C0? zMUu~s{L41oAPbb~Wk3#J?HtAO`wtpgEev^9h6lYcSOLB@m5e*vLBuxGDTj|i^%K8Q zTG%PMcaY`6xS~`%aBlVQ+K|5EEAC=g#d|cTPGdE* zBu!2Me#6r6hPE@d+ukI4g{RG(8<)SrUR1=PkV#0rwihV{5X5PP`5rCdlkDvex$O7@ zBE3>aO$GMZ-hU246(Nx8N(w)-Z%}=mLg#3jtXj29C3fXj5 z!|`%Rit4uG^V;8wRdoOyb?WHQO7^tZATyC>2zz$@uGx_a<`ol0gyW^_e`mgz7<$IP zykoa$T+#S;7A1cSbU{C@qJfg9{o8s0mQ=>GTNC{V5~+-Kyty;fnR6T#xD>UWmcwT+ zTETuTnPmu-C>2aB-tBzyT_ns(Dn%??jwZ`J$})=tH3cH2i~kGSF2(2!xJ!F}j}K{e zACEBR6ZFv6bF?_1xP6(309j71gE#f6>p2vQ0D)%T32WvR92=WZEH9`9lv`>t+fLWQ zL&Z)oD+Y*OvSoDk&RC@3R(#ELS@{Y#lS{~_27j&N-yi=tg*cxioPGu1;V-=;FM7)d z1@pXgl(teEw3g~1`(P-jjzTmlsZfow6+37tA875y5gTmflRSo8w+!C1FxSE(oHURi zy-gFhn%%IC;msOCiIij^hhZVHUk$eb+DSnT8od)%Ya+V>HX-Sy$iS8yKyPO5g5P0jhAmX6D(cb@0Z2vr(J>gffc;n zB({`XiR6M^EEoS#grw7p+5r9_|p3 zv}TVHl-@I~mF6yaZ6oWx#C@NwFkH`@O59YplT0)Gch>|+sms^ zSQmYBP8+(Wn*=hN``~&r&Mj;1JVOXVxLsSzD{rpoMZ}1C3chQf9NO_>OgBlDChe;r z>%-2`q{2~gg(OkJ`A^o=QPx{t@A;4aYYoV^Kbv>1%>~Y8kOg|FJ0G{{4$$epf{ndC z{q-U?ep{z`_+XmrM>RkZ)7^1r{de7|8LHXTm;l78!qB##8X=t8c6S|uP{l9JEkW0fym;r<>b1vi+PxWyrBW*rbN%%yLS>v?4FmzuF8N43HmkxqpG|Uqc*xxg zYmgfkF3#uH%_J@@>@QO|3ONLR>GI;pO6%#0aQ)2X!8~Vg=vYy{D93yq_;6^E{KxFEm6fL*@=(6loxMPKsEB7i%x) zfr(;Hcqn{1mwn`+Oe&b*dnXIkcgIsX7G`~H?E`!XMYF3D*y^d1F5p>{x#VI{T0Esho?j!3Km4eG7 z83h2KjxRO_?8qC~EV?CC+087nAjG4d2G;DFNxWFX-3evYHB>vLu&nEu5|njdOFf5x z`JGTkgXhMxhR*Bdz5i1`OJ^rT^Mk?bYsdjAJh9^GD61zilh0YF_GB89$ziSv{oo7fsf`Fsd!nN>RN~ z0ZG3YI^K#dAvIE>4sa&ukmd?cvoe5=YQFABL4TTDv!H1y>{1xS;vjHF%aT>7bKy_) zx_2Q!oOdH5?)vkMhXlqd@>^a&lo!=-_P3|MCw}x#n#@y|l4j{~`y8v}QcPc)QStP@s5Q=13nW zqoVZs*h=FufHpcA@DHUcKj_gAD$fz-D~gWGJd35?+aC%u)#7|j6Locl8Z9Y$Q}g`D zD^ZwaUE%C|*=_Y4YmijzTZR-TeFEPT!qqMf-^zKQ~; zR4JxYw73Hk4P?u{?b-et{Kim=9D^hK&x}A{Zs|cv_Cbz(bjXKBMeVo44azTn{Xq?h z!*KtP{kdE!vi^9r>@VWO^Yw=NV!Yl9`bt`ZDq`7@7yU#D789~6G`|>nz`h#& z^*;uyQX@j3xoFpc=+lM$bJLLj*VT>VB)7FjRHyGx#JQZ<^5fPZIuxbCk#%#v6 zraEXV)$8i9(4ckh#D%t2jiQAs()8;Q*33}DudIHK+%g?t!WtHe`L#4TxyxooOy0}) z$vo{GM5qI@-J)8iZf!yBlIgqt%KzITeUL;8|1vxRGs%zSip?xI?#8C3J{DDiVp8l^;T9ln375ow1w?cX;csfPJH$A16M1d7p#p_anc+!qj+)+)nzY zMSWJul&qf>T;fqHtw*XdRcaUmhs(ew@qOJA|8^_`OPuzLG?tv>G~z4HihimM*e)jy z@y*E@kgQ4lPoaT7+2u091S@K%brXr{_yGjX%Ds2tA=2@7DQ$Et{i%3mgF2k-0?wEx zp@J7LUv9u*%`Ik0oE>;Cs`>R{l0aG|Ii5j1DW3jB+d2QLhK6(!HkXxj*1L9~TM&8q z-U#OKp6*xck=l<=(9afQ((@BF`fJ3Rr35DUS;jYx*#Stc$_2qP{l}X=#93i+Hve4N_@=`)eW9u3a$@q}zs>9ADG-7Ne$))T39vBjxq;FrE>jyzdrfBK_ zXg^qdjNlvjK_9uc_(HYOCE>5EHD;#Lwy||?TwnhAQ0}N;DMJcX&|}GHW`Wt=Ka2qf zo@`}7(G!vjiOt0ox&3yMR#uX)no*6p;)Uh)z}aX3Dc(SmiBKcCFv`@&&CdCY*Nf?b zoxdj|c%<1K-*cn0Gg0UWtli$-Synf)+SNLKwYzb0FYzz{sbFJ;W|YUb$*Rty{_He& zp1w}3Ts&vI8#>Rt8wGD=7&QgFRf#lfy1twUUcJ8fAEa$i1?)IO%^y_lg~j^9WtTH6aAXiR3A-dN{$%-tOA-Ntd`?T8-7>vC6x^6S zL$p|}SoiJDN>$5r<_!uDD3v_CXA%*Q|NT%{pUp67TI~2P zmIJbC(R9dBOj|rB;4?*AGCy~k)&fXIz?U>G!u?*gwdL^i06yPUE13RXeu2&0|Bm7= zn`j-pzN}Kq*?Ex1(|WAMMsm4SPpyPFR?z2_E$q8f9PZ$suxQy`Rz%d8NQ10SmKs-E zHZlqTj0XvnOZY$CSjBiM8GZe|6DX8=!#QW8g`n>eh1@UGW^3Hv#vX4(`)hiwgIeWXN~`w-hir-QC|JEU`wW zsc}`@Y6+VC(B-bi2hyKU@DT>!J&fK_-9rbi;(xVgo3VHE5@}?7G3Y$Iv5f_OrZ!Y( zhg_GZGqnDxEQLGE2FM17er&re{Hux1UQ7mgX7%(N2$YgqN2&i z86Y-PE5L%kO0J#6_+Yy<7}1~>##l`X+aOJ&$IxU&?3lv&Yp}3m19ejZVC;OO8gozvHB}MjbfjXu;U}V(S!W$S?93 zb`YCjCEuh>w??K`NS~p=B`0_s#&09CCsWBorXE+dKSwdBBCbsNUFH91y5^|LzPCR$ z*{;d9C)>8|CflBD+qUhRCflBDcXQqF-tTX%_y2S5+UGv!?ET;a5h6}Ffqaf#JX9yB z8n+fP5*^*54GTOMyI#dA<)wB)`0Zcoo?{{E+k7o^$szcc;QneN-l2D^0p5PV#iB-= zo9$zVi|MMF*T8x%854v$ypUU zigLQJwmarM5t~*a^pKi;TPeJ2U9p(|JPp`r^woB z-HGR1C2}BAMG*WCSMAIH!MQxbXkwgH{X z5Ab^o(Q*MrzN@QZ?>jtZI7-f_pBO#;8kUW639!;9Mj6#9<;1Ai4$=gP4kyeWq#177 z4T3B%+P{E7lAWnIEcAwp1|7g8)Yc%6!NEy)sc}<->#9Vsgm@Qhj_~12x(tSQc698W zK$*-L+%X#<(a?t;`&C!5*_fru7?fHn8$({nr-!*6fro>Bd+4C+&mg_QzuOM|9%C`T zfI-?3N}JTSiIbS5vhu1mA(cqxGi#AK`(;*J>Tp9C6l`uj4xit>5I@rCJo4nCJ3Zv= z6aq=KNeUW@5>(7?d;!oKR&w8+)VTQ?b@dN#O+){F5dXV+#+eE=N#iB<0W8t&(?Mzci8=Q-?t$05f}97&|@4q#sT%3965R_e!=CApU+O`*mz z*ZKmRclg`6aWLQb8hRaXxqU)AiSSI*y9pD&Q{!72zfI_x4;z^-rZgcWZjIQFm^M1{ z5pa+J5EsOBK~&cm02^x zSSp5wi;2W9G@j&=il+Y8$b>CXL_60X2~>^3tAfA2fJQAs+fb6)o!X- z>n0e}d^8C0s5Prjmga;7mUckaqv4Qupz{aj5On?sLoIC6U$FrZU8^usY|7eGeA3ia-?b^I);IJ zVMPprzjkylixUgNiL7Xy1UGi9av@TmZv*1FlY*ow#)Nj9bKIK-rO11DQgCq(r9+T# z4~xNFv0Oelpoupo;n4pHSgiPgT&Z_XV2YCjF~wQ5F#TH8d845;xbNr46#oLKuNdOs z<}Nh9+&%!wwy)>a`IQITjr;eCd7P5;-Dr(&zvMrmqs{pIdvGpJ!^qtxKv+xtS zZKtLU`8IA$qVm5%-K+(#x5F$!;RbTj9&Y0_urIpUr^V2Dc*Uq0EwejUL{S-cRP0+Q zhKr5j%)OO@)sC}M<))rhayk;H)=Yb}qh;Oa{HeLSDWuH{J1B}`nqT^0Jpzl60+s@P zW7D$OqzbnyCa0^oRy2Jlk{w2wu%5-O0(m^;>mVAa0d7$yp&b%_W7h_!q2Yzr-Y1ZU zD~?DbELJF5+2oumH6MUND~^f0SW66>J})b5G|iBiq8`fVEH^2W=b*w7Y7(eFc>y*o zs>~NXD2|a2A>@&pAg`5F)E8`I=Lb=719?$O6E{rjr4cb7c*#N+`txBZ8G^r-N+4fj z437+j8B2e+;X#E{z$d|BNiug_^-Pu64H3=_et=w6MvFiLSsx@wH@kzG-d?M2yf>&> zUnhV*T&aPD<(_7Eu2(0#0i@Ue}g%IwhEM{gg(Tcx!_Om>oO z?B=`kH*KcLcUD0WVx_kcN~FXVPI8F5u&4RX`i$T&ag04X>4Jfvvwo{bk+e&wgxXod zXH=jP3$GRsDu-nKT_O$GwFRmqdU$| z0+iW@(n$OI5-aGUIRp}*};&q$>3rxD7jqS%HCfoSLg zc7GHK$0(^#3Hw~jlQheOCGG#C$6!z#s2ABtq{tiDYoHLg{^iy<6yH4jP{nv+6>wQn zDJ_SdTUF{&gm{Rdxo(5&6vx=PFgrukGSmz~&;sHcobXjea$a-HK%2nHTC`<=d`++* zQS@$@Hhfwr)CftO;gXC_)W>(mP-a2ju|5sQH?~XRs6A_a`S)`D>c=gM(jg!t#s%n0 z7F+Q$&3qb9nO(MODlw6}QxbWI!u3)oXC}BlliNpfbl)kUhzkHf*C;7It|_DM16cJcppz6cgUFjv=sUyg+k)TdNr7go@suK7`j z3sUd`m8@SREFi&F#xW zF^Crp%=x9*!&X0IOOU+;?`CchSY=%B+E(Nm&bKF+1Ehtem(;xJ7ZTs?z0ap z+oQ}_aCXTyoBl_Wy(7^Q#qUDvJh6Rg_50ERz`f)mF5(ALoB?BT`=JY* zhW2jBpGo(L(`K>D&h=e5iU28IvFws;>;ZedoNPG#7(7sx2)#@Clr zVUyRPbg-$}-6~)!iY{q`7gOi7X_iyGDY%l7C?seuLbGyBiT6LmuKRz8-764cmui_}n_bl)%WN8aSp9oLx01Z@Z1=dANCBrP7fRQW4Fs3Jedl{hf;)X#fC|k6<3>EBmuE@q{~!^QmBYPV?g@ zW@$799LT_hR^aGf=LAk~d89aOQ&X=bh3!AwV@ssB0~O}m(>AQ-e`KA2VBW)g|AT1? zMD7Vbh+PA}4wjiDFFrsiI-+Vl@S=A!jR1}%5ne%L?Kp-nZ#xr9R6VCEwow|RTL4s# z?@MRpIXZPx??Ycj-^eo?ao-`tRSi+`B6Z%HaotCEHMU2RFYe8=_;Wwgn?Y06 z+H_eaKQnfXQ;;Z?Q!eF)a`_z{Ul>XJg$*B7RhZSmYpS?JgR$YFDtGgxNs`HE5=H4m zk_t=VJ8bSGgD`wGqRnX-m2rmi;3x>Axpm9IW0q|!`A3$QYJuT3L;b!@)9=gx5jX37 z7-AIyC0&!EP?Vhyadgo7zrC_^h{mf{z+TB7Ebe7N;X z=r^Y-Yfn6skBMB^Z!I@gbGDEtKFAXo*-2tyYR>Z&Ff8AcQ(umioInOc;aj)=Z5Vj| zC0c8E2~($i!g_^DS$uSi{QL^An3KsVr&Pz(z!hO3x==^EDUc287 z9%Ffy`CPg;EEt7<&q$FW@vF7Gp9ySWv*|ewHHF8NFhLDaYI)YUiU0C{+Ul{~q}RI7 zLTtoC`g@mmj_BRC|!UOcm7&8&YTrdK3idRM|=NN@boiEmi(RAUa<| zp5yX=bUvqAaMBlD4!|6YUt=zMxLfcrz# z*zU>Br&6vYpEF#FtC`T4kX4<(Hbo^pmys|z&iaZoxKam@|7%2|`ml@}Y?itqQD^4c zNtB*Tb4PV*WcSE2j{xj%H<=s}s0+$LMOn$3_1;FyJe_|MK&V$?)sy ztLwyepKdmbWPNI`uuXQjl8JtxUPDUV*`5ewW$Z=4pG+`|9Y0=k4hfz0I?U`EmF2~Y zoK&NQ)Kh;1Xmb;|)UOQzuMkH~UvQX)umKm>qdNaS&KEx@1|3su@32Mim8B|x8u|`1 z5dS=Nclz;(@wXHvNL)3EO?D$M_L4g`=ujq5+5$yO!_O5O&I>nT@Pi>PG8}^HM&QD} z@pDdFRG5b=fvU}dbj11)D5mZbfRfW26-iE;CJBCshpR=Pj?@BRLuVm!fOZn4bQ~T6 zkwdmNpNY<=H!re5P(A&BAGgO>)7?bdeN4|OeDC5G)3G5Xhx5D6+eUgEGiKUyQSfl! z8U7BOl^LQeKYZJI-~^y_JaKcV^raOv;T9q7B$9h@L2I zvkXQ;)r=k=gI5%FYSNOzk2sr^^< zNnV3?%bSdPJY z&1(_P)3Vw*r;sc!WN$wrUyuN-$5^%@hKr6mP~PqC^Mri8nJ+`F`cG1guXb!@4bvSG z0f3DFTk=1^o^;CUp;7HNl?9JPwn@^7L)6gP_P9T$v%@7+lY=&rRJHJ_sPz93dwrm( zMa#Vs?6{vGVLwsGc2TqVS&A9EY=!y)1?`FLt|dar|E7eo^B}6IWe|Q$zIhb8CZCZ=O0(wz=vxCEE{oe%4N^b`ykh@~S$EgAJhmsr+ zU?ILrOLSkf$}#MR8cuGk+$|tMYdv~^OK8vJAu`fKmaA1o$Mv#y?Up0`qgkuU3cJ)h80vvD32X97 z>W{YdFO%|gK&cJ(o2FW|H976))3`y?Wi9 zj=9!%AXlsYK5ubBlYUeI)VxE7P2kT;9v<}66J5nyUTQU?-yV*|jBnzz`o`JAzYLxN{rEuM++*%;|>T2uL8{#(=6ScXQDUQeL^aAz!FwG~nfn!T0p@iSq%+J+E`~az9VE4bHz1)VN z0ZvO{X_kLckf^9XLj~|Fn^YKhnOOe7_3Gx)Cptfp7Rb|J%704ez0xzP@A>c5-l zc9>JQ$GVzwX=JxMa$D@&cezX>*MHD4OtA?J+;?)cX=Yst60o`uaX5OgEI#L`H(IQL58O0|9Ug6dw1BE;L!L%vX(qIIKlR$@?i9SX-fArw=ZAWC2T$CDbw z?BZ%;%Y)c&DFtwFMcD2FVV9QK=xl;MX{@ZJtI6{gwqBHsMyxScB_OVCOd7XTRX^7dxfDQ-J(@ByC{Plpq4&NC+Qt1WdYfOFs!A0J05JG*Kfymy&s|uW=MpPhXu`JP8`g59A0Ze2 zDyyy5sKXAo7B&X`Gm|ZUG@^{7pK89C3>%ndVQf+=l49q^bo1<%fohGSY=M~JVR=Cs z_ZYE5zU_Fj70NXebxN2Z0<~0XiDl^7k!?@LZc&QqLCT%uXi0!wL7e2$mU=->N6t1( zFw%cvM-lW z#}zD6J@`O&{1)0S4YfL93*)H~cPT}X1dd*-C(a1y>XzOaOIHaKqV5!EOlEoPBR?kN z=@44($aYcZuJPpPJfzksPZE^es{HMaDq^4S?uHC$N#!uOsVlv9P*}AlPa2(i6t6Nk zgMoW~_gwhuii)<57DeUldjkjxCI>)`PxS@L>Rf9Q9>~oAF79cZn;Up<`j#n*Ce}{r&r20`d>IuQ3e6yLwfS1L?KuTSXD2aU zdGE1MeJ8-<)wO);(H_xbo6nYhyyZ?$@73M~u&cTqt=XL>$6@~}oAI|`<=)n`n_jEI z_7kbabS`oUzjR-pAm$#fIcgHl+GH6deI(9>o*KIV9E{OmSBif{0#&Ea-(e8%=T3s$ zjCVofZ|X-W9=576+#PjNS_GDCK88t(JPEFl+z(`q$qcjo2&h+P%;(N~vL|!@|K^m8 z(g`VR-rQ^Tt(*x_+T)`AHYsy-g5HYhSZhsS79Ul2rX?BA-~7XlZn!&cY%%Xg9LIyP z(Ecq5i>uVlly7p$~<71Lkh1STs7(-W%ixn_2wq8q2OyiQGbU zE&;SDrqDuF%qct%PP^QjkApP!(AcwFl((3iZZE&69=kjIB98fVn9Mptwy8xvJ%sz4 zzu`MLA7j?SX^w_qX?F7zuoif7-=}+GvUgk!|utkFnS_{~+DhhFs1*xc+K@a*6=?@ew5Hiakx;)rDy*4K-4EV z9G{z}zI?B20IXr5NZOjpqPVLpQ<)2*;1GplwZQbdnEyF4g`y?k|5%WnSNgDDmQRBg z*XmJ`K55vQ%EqP*zUol3LwJ%#~EIyh~WperQxnl z)gshd1y(kM=G`f#a3bPVdrW1$@}rRGi8e;uWtoK+mmOy>H?Qc@$bBCNA&i|>D-CiZ z4KWzm${}Vbcw|)^q{bO=P99`yP0z^>HUiq0c+qM(1{$1zZWFJU6rSLzYfp?(tC*7ACHc@I z)J8=f7gxkU`t&?0YPP&u?r3{&3L+}kMVtM7i-7l6DaIVUQ1=hlQ)Ugg^;8o$EX3$$ zv1EzYt{I%7YKmd6@H%m_UbGlh+_Pbui}z*`2UR#+G zB@hh*CPrXv7;LjADROcB7*nm}Ex7Ln*uHw>AW&-mxfIWD!y%15`3<97{_|LcNnNhJ zcnUt2R4By@W8K!z_Q_h!&8gqPphgHOzcG~f9xcm+DX-T-APy2Nwz4+v!T-#y|H0v^=LE2a+(k>%+c9)pJoVwVf^2VK4j8;EfB|ojV+B5vNgFeCD+?T-)M1_Mua*X2V;M2?*#rb228nOCf1V;1^3V)@k(BOUz_ZIwCekM>Hs zyoSL&D7#*{1c*-yT)t&!)?S~WN9clCtzQE4mEAu2} z3$-o`vk>jPL?B-dIM13l$)fE2sSYRMUR*o~9zUjs9x-&7iin@ClERNpym%VQVr@iey zy|%i;e0AtRLWv8Z_%Od&9;Z`ZWj_(?=3|*?@BgB0u)SZ|%^nTYD_-{D-s`Y{7w| zKn?B?nunW_Zy@o|o(=}eOkJ#VrOF!w4*yCf!V8~a9l@#H*%3CMoR_vpcE+MW9hT~3 zSXB|Z!m^8iR-mh=0F+QVLdImvf11haw~(R*ZTC`W|~D9-E%H4@-} zJK&E~vxWDe6o#@Q7}q?^AImzi(?*AAw$tz9)$9W}c{-o&@5Ql*7tB%U6FplS&0+VA z(vLAZNJ(QMJwH!DK#%1K-To2RiC0eIv`e0PA1E?qv*+`N#!7V@I>$iF(Osu9qSHdZ z6XA8JxKx9UhSFv&?6;OTwYxjIgEB>Z=)Nnh7bI4;i~tfZSJPKT!k;Za#&q>Z2QLdc3=$u$IL3IpaSg%5uMaW)IUb*nluPyP@>5S?CXeCR+FM>8okmkWjK_YnWTv$1{A6;m zNZMd}-u9#g+i@MXaXM)b zL8l}0P>~}OR$G6ZT+T@`iJIeA@)%Zd?jNb>X~zXeU1;^1>|9D+wsA#>q7&<+cnFaL z-G~`Qew#oS$^}kZkem|F4kC0LC3Zv%KcykE>!U8>5NHkH#C$xsHe<~@K2dFumvizG zf+5DEsMwOpGzBoC%ASnZoa1z0URudDU=tvw*Ws(I1!Aa$gLHZr7kBo2cu4_ls$@86 zHiC;y88s(NsHuS3g9!tAdCFLL=F8g$FTvN-@booLf7koo9mtI&y{loX2e0;3qV_OJ zf&!i(`sw_t|CdFA;3rcayWu5!R<63KjP#mCW7%ONb>b{#H#jA8IAKpZ6!e5%&5_Oh zP&@`K&ZfrpovYtJ@gi#*e6E-Ip+>71mF&hOA2-}OPhNPnG=6{#HHV^a+Zv412m{ws@~_d~Md&29oP zbN)Ac!pQr|sNa~f_#{~~8M1M>!CY6-rqfD6H=%{8`s}BQ@i{17#yt#C<3pD5?nDlm zR}MQW7`LRjNjOK99aj}A;AiJP7HhK&SD$fZ(g+}o{E8yNizJcy_FzvdosqRTr6+e) z7js3A>oL8qrHS*?<1gQ4lNQD>oiJbR0q@j4Wt8B$?XhyFBMp6kl|BaZp`4ilf&rH9X0Gs3#Q&No-HLj0M5*y>DCNc$T zz5lz3)C6~yQS`-$uYZ_klI?m6rTaXZJVAsGj^zoE3xC(c%YA`BEOoLnZt(5&NR^fI{26!G$qz`-GeLEd#>pF$-&3sc~IJTPy|o`ongTvP*r7$4A87(dvvU5xFd8wH}0Az{&Kh)%yvhkH!p2(=Z~3q9>YDt(R0NICSr7u^A< z99XdtA$U(wyT~S&FIg+WvF}FmO3v{IWau|)>&bs#Zt$R;Or9-))gD+DUQ9T@h%9T&>p>c=$* z7X2*vbyfYE290`7Z zkhub)d6U6{yhz^XKIzkZ-YDXiV zxxTLcvr#L3-(rW`Mr>r*u0C>}+*!t)mnSZr8RiG4T8Iu?Y62ZkzN=kl#|~OO`QdKk zelptKmD{U@&-3tfU9TT-FJ=1?8I<W(nltT70upErnJK*lVdW+fR# z>qHnudFT`$70h{Q%KitE;$==Y|4NGCn!BdVbkk+cmb{N7P&Cu$CF(JIpMN0CWuhQh`)(}O6lFzBl7jTmh)kXK$ zRoXg^8n7bmCiiH*k(P`%fBOe(PR(QC2}ypQ!@?sgYs16L5l*i@(%2sjY{%CCziZG% zYUhO$v_5XOdHel-es_FyRPRo7{Z-fuHTwO9xeD`UbM)}I_;E()+;^t&u8Elkg>P3ud}Dt$!|+i{DR5e9k&%! zhPMDX@pTz@j@{O(5$5sf!Q+! zbR{GUBN}%fT3hx9`rG=JYkGL##r?~F!9WJ}PX}yxh;m(go{JaL6;vvswWKwgy=>f2 zzt6GPqIBZBC^V1xMo#hv_V3;m^Lh~u94(|0G`a#VIqBnaO7MCAX#X^JhHWaJH{uDP z7S4jeh%IsACU;<$@9yyEH(`J;->%n!9lGDH=R!iVSVxCf)Ff|03T851!mEYS?YA>4 z-IEW)%Jsw^lmjx@Y1V`vm~CQ)cdoV35#mKSZrSkG zUCPRFAos#DWdhwn0cZh#V~#oL)OR9hWQ+Sw%iyC&{Y~v+4dNs^E@AO8*6oRQYkAF! zjWg@Yp5aQ94^uDi#$TKdE%LM&s&!s|Jp%(gm-S&>p_#>&a#<(FZo6<~aOq_DIsJ)F zgUo5+BMNhJJ@Zl%A3nn6^vFJ5m9>*g#x8Jd?I6XzWVG%#7o&7{>mn~=uobF|ea zs?RzMY4R~*^+bC<_WN)k=%YR139u-q7q?NJeLZh#(3PD5AElv>mi&% zN%?4^4Zn_dJPg0i0yp0^Y9UYIk0)wVS~cbL*`9qa37)&*Na_ zOZnnnmdv<9OeC%Xsxp10n{`j41zscn-08tL5pjE+-qIj984lwns>x5vci2e`y1QB) z&POmU*~=E1Aderm^5LhAm+Ozsh*1)aLd!TZBeCAhGJm&N;2y$|^~Xn_rgRZj^-f(V zbk5!Z*LNMKd*wP!QpEepQ|`<;hc0B_d$|c9%*ip$ zKEM%F{7PRN=f(HBlVYHAxbnJh`B^_*QO4uSYJlk3>=@a0EPys;PfZ@@s)>;5ET-_0 z!s%)qCb*qcC496#s$tS)q6fd7{$Brpdm3c)fb&rSJFZ;*ry`=?lnWim?hq>VN?DEn zFlW>TU|?~G9wb8>hI|VSy9_VCfnFE+6UqQVUIbIRKaoR~b-$-m$O>lEDyp%Q@p2=2 zA`4Yc$J+$@Y5FV!H2*fN?~E#jyM4M}I0sNb4Si3nGuRI0dW!4mJLL{Pmt_7YHk;rxr zGfH2C1bYaN(aZ!?Y2W%RBTVT<*drKxxfE(-@lB@HhEAe^k2mOnN15k4#j7lS6+_JI zWZ}EY&8{4!k#WK)CSo$|eb9(rn0ax~=e6}vCine{UKTt*UkgIFKocpA#TxyhrDfI2bT^zd7^rUjr4F*Nh727oTg_+37yeb@n={| z#lQEUC5E&A3Gn_nUViM?>0U2wxAX8SB`Wkk=ftgD@!Cof6?EUe9XcI)>qa~as&hOt zDykEOB8Y)k;4x`!-^Ne*{TKULc0cvjHtD62m4s^}VO)JXPKxH=_l1_Su6&eYGfF^x2gESzFB3c z*V&l3WKUA4D(`-(kZs&cUkA>BWG=&#Pwut^g8rGKS5B@~BVL=dT*Ij|48CZ_RR9yu z{<3S%6ey9xFr{p`J)Vb)}>1w5IC|8i{A03ViZ7BHiOJ7-a28 z2hfdP)~isgs1GOHtu@-H~YdDMEy{gOD(VU;%SeYf9SyQfAsjv|uS zx}x8U*MF+03z1qCsQOhR7P4jNXX&~Am$8 zq&86&_t!513=!J$fWv+fqsLqKm%x9IB6bQ!m40#^5pNb0h{_;;rN-aBoxv{TriI{6 zN13{jinJpeQQMqfnQkuGgBFF(vky80;$8rQKZ5b-w$*fZ#_i@4ta;)+VTyldO7b&0 z)+UA=8qXY~Wknw~0g8dt_E9g*ifT?~vsvi#u7^>kaT(JQQLZp08EjS0EbG5mMmO$l zgIz!i2{8u6G!H3K_$yM?xb4t(nxH6<1EVozUR^5qU}1REw$VJtTp>EjlN~>s6x98M z6$3}!ZrpO{lwG3lm0^pbiYJz_pn)F1D4erxVd(aB>L)RP1*Mz)E^I@iOjc(63YeCv zG%FUc63G^^4!@I(=K#|3_|jAsdrHdx#omQ|NV3l4PjOv@i%0ncd(-p`M!iyjU4iKC zP(#UfN~+Q3CEQC9vBBgZWkmirqOLaLz$4}@40;(<-V6OZ)c-l6{hhVW(R64%P*8;0Hdds_*LCipV$-NZEMWylCI`@X8liay zcp(6I)Pw5GcjxE-uTictPpShhxBFiQqj~cT-Z${So_2u1t8e-2j`Y9t7!;sM@p<8l z5G@G3Rx5b%e1Cd993cdSo8O)c9{1y6$NS2ji-WNEgQt;zq{G zJ*ouyxUbA)|6_nVN|ocQQ0kjZatMee^V#@_v&dn08({giJuNy;a;zm$9rmGtYkJSh--mh5q()ILQ@|6F}GV?2nLbWF^4k!{oldnlN>XU(1V%q z-I~r>cG8w;!x*giE<~#bsH*HZ>=-Kd%fTnhqOgN={s>q%@e^!<$>y1IZpWL`Q)9p; zOyS@Z{>$FIeEOF}YcM@%tnRy!dMT&Y$g6@G59g!d$-}FfR6a7^vKA#=J)WR4FL&Ab zT_o86nXO(IeoPp2HOxyessSxKKyC(=2s#YHqISPy-7NYHk(|$ zc&AA1LEF8hBx2PWq>#Uso05wi5CHJ=d6aQl-_q;1zcE0X2d3-y_PyN8);19~nxbGLYT+t{^_U zg-$d&WLXM}`$w+5&^eM?|EpfneF<_|dF~QV-rbPW`K6pib4dp6uLMAe4QcX^_0yWv9IyiAm zh{X1^pw)SI7odZq@p`z34(Rc_OLYCll<21?=0H4=n_tX~il=TpY1@ZzkgeS_G`%+v*1XQz` z&+AQ!!!8eIIWZI2FFy~mzup$}^JLYd$V^fFevu;sE5(1>MBq+kF(wF*D@|p} zx21tgJMt5%4APx>{qZta9ek!*R=7t;ZcwZ$?Lfnm9Ml>!Y8iGk%{5}>%!*G-NBFn0M38~ zo`K0mxEio#OEuKpMX$$D=IfI{9Di`%Z!*N;U{B~0`~RY`IfmIe?SV;&+tC0_^k-a??B_y5jKTlf z<1Fv*@jr;5p^9Ugkvevi?_|WG{PIsn!U7+=5*j8a#O1|VyEyuPwV#G)Is;yEZ|%e* zqw`mDI$Zv?@AyGcg~iL)X}ekj+yxsUR)^Oi%2J#LN-A zm4y;9pquE6t>x=9^q%%}v2v6vZ&4=h<>Z{nV-w5vh4bCuv{{B~vH}V;UdpF5(RUOp zLj?h&WzrOO=iDnhM(_W^Y2XQ8{wq4IgX=o+#$$b4c`T5f zX42`<(klh86^?S9%U(DlcQRL;r6=jXaAxCtzKF|vXEJ4thF#A9!J^dJ*@#6iypoSc z;f2qjQt`1aN1x!wJ%edM=~DXWU*}1KkJw2gV9$mEmXdv|wjUD2D*<_&f_Pp^^lxqV zGX2nY|GIwv>B`?uYHT$g{|e7Vc|v5)`#@$#x(|EPcX>W>${<&%HU z!=8bD#v{w;XfTYPrc1xp<;v{5As+R%Twon)PbT{;1z9w~pH(MV)XyvN-1PHfWg<8N z8z4@lb2K21tt$@L$K5C?hKthSJ1}{WnCCUvmi_ZeC?3>5w>O$kPg?kuP89E6>Z9Ij z5O(vs)bpo%;8_Dn!Vz@p*>{7e&S#9p8fbMK*74c!SjZat1YpTFH?N?wgyUkN?eNj< z@iyuF`4=nzL3FZ*A%{#fPHx3=d)(Akot#QHEhXzBG$=CL99xvmD`D8A^P{ID!e~hr zd2jlsKbYV-S zIvpPgK$+OnOfoJ?=O+TobCu3V0)Y}dVf0fK?1DO-jCUdZf`n+K0h`*!rJ9tQ!`bol zMeDp4h|M}b1wdFCunbd5bnZMkZs?)}SmUwH4cxcb;7pa+h=5OA= z-K96z`dePMn~UEP$Upn3%?y)cMixKy;NeA(dF0e> z6t~foDfTKc`a)qgRV=yT^>l1*c#EPY5+k_~te=|OL-JI-V*?b18kTC33uKCg=&429 z(*ZTS7Q~0PeVZEo=q^T#<4F3{<26->-j-&{?UI(-I7gPjM1a__P_c*VR6G?{HZ#0j z;|AomR>fWnrxrjg4X=U*U9lz!X+9?0n})p7=)iI0)jVus_zCaCPRxU=9)Vns8g{PkVkPI`5D)#2*(!jLw0=E>IbVYo|TCPXoD*imi7$X6Kp|$v6Q;cRy^WwU>O&&j2F+|4j(&7 zc}lg<~#KATnXGbO$?eIz%R@vdx6Y;$5@R2hG^Ek0d z(`L620|Oe3cD$}&bURZ71HIIcYjo*Qv5NI@+%Jbu%Ecy!9~+2ZT@(*~>a%DwXkx^g zm~|N!&U-K^GMb`qUZ690n8i|yc6cR;D~#VsVLV4Wd~8zhB9a@2oqh^%Dndyqnp#E| zGyR@PK{K*K0169ao8!g(diaUJ@?7=su|bX-9ftf=$Cz5m9Bnt9qGsnL<0=ejxWi6L zs}Kcd`ft$>uLa_;A3p6;b|!xKI6%<3U4;b|nMWzwN|bv?igi|sc2N
{ + setCanvas(canvas || undefined) + }} id="clap-timeline" // must be active when playing back a video @@ -103,7 +103,7 @@ export function ClapTimeline({ onCreated={handleIsCreated} onWheel={(wheelEvent) => { - const rect = ref.current?.getBoundingClientRect() + const rect = canvas?.getBoundingClientRect() if (!rect) { return } const clientY = wheelEvent.clientY diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 76250c3b..ca41d9ea 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -14,6 +14,8 @@ import { leftBarTrackScaleWidth, topBarTimeScaleHeight } from "@/constants/theme import { useThree } from "@react-three/fiber" export function TopBarTimeScale() { + const containerRef = useRef(null); + const { size } = useThree() const jumpAt = useTimeline(s => s.jumpAt) @@ -60,13 +62,15 @@ export function TopBarTimeScale() { isDraggingCursor, timelineCursor, topBarTimeScale, - timelineCamera + timelineCamera, + canvas } = useTimeline.getState() - if (!timelineCursor || !isDraggingCursor || !topBarTimeScale || !timelineCamera) { return } + if (!timelineCursor || !isDraggingCursor || !topBarTimeScale || !timelineCamera || !canvas) { return } // if we are actualling pressing a button if (evt.buttons) { - const mouseX = evt.x + let canvasRect = canvas.getBoundingClientRect() + const mouseX = evt.pageX - canvasRect.left const newPositionOfTheCursorX = mouseX //- leftBarTrackScaleWidth // TODO: take the left column into account for the calculation diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts index 1eda4dbf..a90bc920 100644 --- a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts +++ b/packages/aitube-timeline/src/hooks/useSegmentLoader.ts @@ -209,7 +209,7 @@ export const useSegmentLoader = ({ // force a re-render when cell width or height change useEffect(() => { - console.log("Re-rendering the whole segment timeline (this is an expensive operation, should be rare)") + console.log("Re-rendering the timeline (this is an expensive operation, please optimize the code to make this rare!)") const fn = async () => { try { await sync(true) } catch (err) {} } fn() }, [cellHeight, cellWidth, allSegmentsChanged]) diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 3e361059..8d6cbb07 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -15,6 +15,9 @@ import { computeContentSizeMetrics } from "@/compute/computeContentSizeMetrics" export const useTimeline = create((set, get) => ({ ...getDefaultState(), + setCanvas: (canvas?: HTMLCanvasElement) => { + set({ canvas }) + }, clear: () => { // this re-initialize everything that is related to the current .clap project diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index d8c61bf5..f86acb27 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -169,11 +169,7 @@ export type TimelineStoreProjectState = { maxHorizontalZoomLevel: number originalHorizontalZoomLevel: number - position: THREE.Vector3 - scale: THREE.Vector3 initialized: boolean - beforeSteps: number - afterSteps: number timeout: NodeJS.Timeout typicalSegmentDurationInSteps: number @@ -216,6 +212,8 @@ export type TimelineStoreProjectState = { export type TimelineStorePreferencesState = { + canvas?: HTMLCanvasElement + // used to track the timeline state // this helps informing parent app user // that the timeline has been recreated inside the React tree for instance @@ -258,6 +256,7 @@ export type TimelineStoreState = TimelineStoreProjectState & TimelineStorePrefer export type TimelineStoreModifiers = { + setCanvas: (canvas?: HTMLCanvasElement) => void clear: () => void setClap: (clap?: ClapProject) => Promise setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 8b4cd428..760e2e1e 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -8,6 +8,7 @@ import { newClap } from "@aitube/clap" // those settings will change between .clap project reloads export function getDefaultProjectState(): TimelineStoreProjectState { return { + clap: newClap(), segments: [], totalDurationInMs: 0, @@ -22,11 +23,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { isEmpty: true, isLoading: false, - position: new THREE.Vector3(), - scale: new THREE.Vector3(), initialized: false, - beforeSteps: 0, - afterSteps: 0, timeout: 0 as unknown as NodeJS.Timeout, minHorizontalZoomLevel: 6, @@ -78,6 +75,7 @@ export function getDefaultProjectState(): TimelineStoreProjectState { // those settings will NOT changes between .clap project reloads export function getDefaultPreferencesState(): TimelineStorePreferencesState { return { + canvas: undefined, isReady: false, width: 1800, height: 800, From c82235a300218e1d13eda213e0d6de164e8eeb90 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 13:37:47 +0200 Subject: [PATCH 261/346] 0.1.2-8 --- packages/aitube-clapper-services/bun.lockb | Bin 89187 -> 89694 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 97023127956bdacf79aef80882355025df4d8075..721db115fcc54d2e2f7278e0d14640522772870a 100755 GIT binary patch delta 3999 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 Date: Mon, 29 Jul 2024 20:58:13 +0200 Subject: [PATCH 262/346] 0.1.2-9 --- packages/aitube-clapper-services/package.json | 2 +- .../src/entity-editor.ts | 4 +- .../aitube-clapper-services/src/filters.ts | 23 ++++++++ packages/aitube-clapper-services/src/index.ts | 15 +++++- .../src/project-editor.ts | 4 +- .../src/script-editor.ts | 4 +- .../src/segment-editor.ts | 4 +- .../aitube-clapper-services/src/services.ts | 3 ++ packages/aitube-clapper-services/src/types.ts | 4 ++ .../src/version-control.ts | 52 ++++++++++++++++++- .../src/workflow-editor.ts | 4 +- 11 files changed, 104 insertions(+), 15 deletions(-) create mode 100644 packages/aitube-clapper-services/src/filters.ts diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 6678c921..4ef0e751 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-8", + "version": "0.1.2-9", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/entity-editor.ts b/packages/aitube-clapper-services/src/entity-editor.ts index 5fe7968e..63bd1070 100644 --- a/packages/aitube-clapper-services/src/entity-editor.ts +++ b/packages/aitube-clapper-services/src/entity-editor.ts @@ -1,11 +1,11 @@ import { ClapEntity } from "@aitube/clap" -import { VersionControls, VersionedState } from "./version-control" +import { VersionControls, VersionState } from "./version-control" export type EntityEditorState = { draft?: ClapEntity showEntityList: boolean -} & VersionedState +} & VersionState export type EntityEditorControls = { setDraft: (draft?: ClapEntity) => void diff --git a/packages/aitube-clapper-services/src/filters.ts b/packages/aitube-clapper-services/src/filters.ts new file mode 100644 index 00000000..af3aaa39 --- /dev/null +++ b/packages/aitube-clapper-services/src/filters.ts @@ -0,0 +1,23 @@ +import { ClapInputField } from "@aitube/clap/dist/types" + +import { VersionControls, VersionState } from "./version-control" + +export type Filter = { + id: string + label: string + parameters: Array + shader: string // WGSL shader code for the filter +} + +export type FiltersState = { + availableFilters: Filter[] +}& VersionState + +export type FiltersControls = { + applyFilters: (input: string) => Promise + + // later we can have functions like addFilter() + // which could be used by the plugin engine to add filters +} & VersionControls + +export type FiltersStore = FiltersState & FiltersControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 5687f0ac..ea259f8a 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -52,6 +52,7 @@ export { ScriptEditorService, WorkflowEditorService, EditorsService, + FiltersService, MonitorService, RendererService, ResolverService, @@ -106,6 +107,13 @@ export { EditorsStore } from "./editors" +export { + Filter, + FiltersState, + FiltersControls, + FiltersStore, +} from "./filters" + export { MonitoringMode, MonitorState, @@ -203,6 +211,9 @@ export { } from "./io" export { - VersionedState, - VersionControls + VersionHistory, + VersionState, + VersionControls, + undo, + redo, } from "./version-control" \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/project-editor.ts b/packages/aitube-clapper-services/src/project-editor.ts index 1f9e8e15..c3d83c6d 100644 --- a/packages/aitube-clapper-services/src/project-editor.ts +++ b/packages/aitube-clapper-services/src/project-editor.ts @@ -1,10 +1,10 @@ import { ClapMeta } from "@aitube/clap" -import { VersionControls, VersionedState } from "./version-control" +import { VersionControls, VersionState } from "./version-control" export type ProjectEditorState = { -} & VersionedState +} & VersionState export type ProjectEditorControls = { diff --git a/packages/aitube-clapper-services/src/script-editor.ts b/packages/aitube-clapper-services/src/script-editor.ts index 4a068760..4d3d7d99 100644 --- a/packages/aitube-clapper-services/src/script-editor.ts +++ b/packages/aitube-clapper-services/src/script-editor.ts @@ -3,7 +3,7 @@ import { TimelineSegment } from "@aitube/timeline" import { Monaco } from "@monaco-editor/react" import MonacoEditor from "monaco-editor" -import { VersionControls, VersionedState } from "./version-control" +import { VersionControls, VersionState } from "./version-control" export type ScrollData = { scrollHeight: number @@ -37,7 +37,7 @@ export type ScriptEditorState = { * (the topmost visible timeline step in the current timeline) */ scrollTopInMs: number -} & ScrollData & VersionedState +} & ScrollData & VersionState export type ScriptEditorControls = { setMonaco: (monaco?: Monaco) => void diff --git a/packages/aitube-clapper-services/src/segment-editor.ts b/packages/aitube-clapper-services/src/segment-editor.ts index 2a03a7d4..aebef6e1 100644 --- a/packages/aitube-clapper-services/src/segment-editor.ts +++ b/packages/aitube-clapper-services/src/segment-editor.ts @@ -1,10 +1,10 @@ import { TimelineSegment } from "@aitube/timeline" -import { VersionControls, VersionedState } from "./version-control" +import { VersionControls, VersionState } from "./version-control" export type SegmentEditorState = { -} & VersionedState +} & VersionState export type SegmentEditorControls = { diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index a67aaafa..e5d925e5 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -20,6 +20,7 @@ import { SimulatorStore } from "./simulator" import { TasksStore } from "./tasks" import { UIStore } from "./ui" import { IOStore } from "./io" +import { FiltersStore } from "./filters" export type AssistantService = UseBoundStore> export type MicService = UseBoundStore> @@ -31,6 +32,7 @@ export type ProjectEditorService = UseBoundStore> export type ScriptEditorService = UseBoundStore> export type WorkflowEditorService = UseBoundStore> export type EditorsService = UseBoundStore> +export type FiltersService = UseBoundStore> export type MonitorService = UseBoundStore> export type RendererService = UseBoundStore> export type ResolverService = UseBoundStore> @@ -60,6 +62,7 @@ export type PublicServices = { scriptEditor: ScriptEditorService workflowEditor: WorkflowEditorService editors: EditorsService + filters: FiltersService monitor: MonitorService timeline: TimelineService renderer: RendererService diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index 3b58b7eb..1b6fd051 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -1,4 +1,8 @@ import { ClapEntity, ClapMeta } from "@aitube/clap" + +// TODO: export this one in a more proper way +import { ClapInputField } from "@aitube/clap/dist/types" + import { TimelineSegment } from "@aitube/timeline" import { SettingsState } from "./settings" diff --git a/packages/aitube-clapper-services/src/version-control.ts b/packages/aitube-clapper-services/src/version-control.ts index 698b29a5..4205f9ab 100644 --- a/packages/aitube-clapper-services/src/version-control.ts +++ b/packages/aitube-clapper-services/src/version-control.ts @@ -1,7 +1,11 @@ -export type VersionedState = { +export type VersionHistory = { + before: T[] current?: T + after: T[] +} + +export type VersionState = VersionHistory & { version: number - history: T[] } export type VersionControls = { @@ -9,3 +13,47 @@ export type VersionControls = { undo: () => void redo: () => void } + +export function undo(state: VersionState) { + let before: T[] = state?.before || [] + let current: T | undefined = typeof state?.current !== 'undefined' && state?.current !== null ? state?.current : undefined + let after: T[] = state?.after || [] + let version: number = state?.version || 0 + + // we add the current value to the redo + if (current) { + after.unshift(current) + } + if (before.length) { + current = before.pop() + } + + return { + before, + current, + after, + version: version + 1 + } +} + +export function redo(state: VersionState) { + let before: T[] = state?.before || [] + let current: T | undefined = typeof state?.current !== 'undefined' && state?.current !== null ? state?.current : undefined + let after: T[] = state?.after || [] + let version: number = state?.version || 0 + + // we add the current value to the undo + if (current) { + before.push(current) + } + if (after.length) { + current = after.shift() + } + + return { + before, + current, + after, + version: version + 1 + } +} diff --git a/packages/aitube-clapper-services/src/workflow-editor.ts b/packages/aitube-clapper-services/src/workflow-editor.ts index 62cf7f9a..e4f3510a 100644 --- a/packages/aitube-clapper-services/src/workflow-editor.ts +++ b/packages/aitube-clapper-services/src/workflow-editor.ts @@ -1,6 +1,6 @@ import { ClapWorkflow } from "@aitube/clap" -import { VersionControls, VersionedState } from "./version-control" +import { VersionControls, VersionState } from "./version-control" export type WorkflowEditorTheme = { bgColor?: string; @@ -19,7 +19,7 @@ export type WorkflowEditorTheme = { export type WorkflowEditorState = { -} & VersionedState +} & VersionState export type WorkflowEditorControls = { From ac53fb06208d545785815daad176e3475e69b413 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 21:10:40 +0200 Subject: [PATCH 263/346] 0.1.2-10 --- packages/aitube-clapper-services/package.json | 2 +- .../src/{filters.ts => filter-editor.ts} | 6 +++--- packages/aitube-clapper-services/src/index.ts | 16 ++++++++-------- packages/aitube-clapper-services/src/services.ts | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) rename packages/aitube-clapper-services/src/{filters.ts => filter-editor.ts} (78%) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 4ef0e751..162ce279 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-9", + "version": "0.1.2-10", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/filters.ts b/packages/aitube-clapper-services/src/filter-editor.ts similarity index 78% rename from packages/aitube-clapper-services/src/filters.ts rename to packages/aitube-clapper-services/src/filter-editor.ts index af3aaa39..feeb034e 100644 --- a/packages/aitube-clapper-services/src/filters.ts +++ b/packages/aitube-clapper-services/src/filter-editor.ts @@ -9,15 +9,15 @@ export type Filter = { shader: string // WGSL shader code for the filter } -export type FiltersState = { +export type FilterEditorState = { availableFilters: Filter[] }& VersionState -export type FiltersControls = { +export type FilterEditorControls = { applyFilters: (input: string) => Promise // later we can have functions like addFilter() // which could be used by the plugin engine to add filters } & VersionControls -export type FiltersStore = FiltersState & FiltersControls \ No newline at end of file +export type FilterEditorStore = FilterEditorState & FilterEditorControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index ea259f8a..96974b26 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -49,10 +49,10 @@ export { ProjectEditorService, SegmentEditorService, EntityEditorService, + FilterEditorService, ScriptEditorService, WorkflowEditorService, EditorsService, - FiltersService, MonitorService, RendererService, ResolverService, @@ -87,6 +87,13 @@ export { EntityEditorStore } from "./entity-editor" +export { + Filter, + FilterEditorState, + FilterEditorControls, + FilterEditorStore, +} from "./filter-editor" + export { SegmentEditorState, SegmentEditorControls, @@ -107,13 +114,6 @@ export { EditorsStore } from "./editors" -export { - Filter, - FiltersState, - FiltersControls, - FiltersStore, -} from "./filters" - export { MonitoringMode, MonitorState, diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index e5d925e5..35bdf715 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -6,6 +6,7 @@ import { MicStore } from "./mic" import { BroadcastStore } from "./broadcast" import { SegmentEditorStore } from "./segment-editor" import { EntityEditorStore } from "./entity-editor" +import { FilterEditorStore } from "./filter-editor" import { ProjectEditorStore } from "./project-editor" import { ScriptEditorStore } from "./script-editor" import { WorkflowEditorStore } from "./workflow-editor" @@ -20,7 +21,6 @@ import { SimulatorStore } from "./simulator" import { TasksStore } from "./tasks" import { UIStore } from "./ui" import { IOStore } from "./io" -import { FiltersStore } from "./filters" export type AssistantService = UseBoundStore> export type MicService = UseBoundStore> @@ -28,11 +28,11 @@ export type AudioService = UseBoundStore> export type BroadcastService = UseBoundStore> export type SegmentEditorService = UseBoundStore> export type EntityEditorService = UseBoundStore> +export type FilterEditorService = UseBoundStore> export type ProjectEditorService = UseBoundStore> export type ScriptEditorService = UseBoundStore> export type WorkflowEditorService = UseBoundStore> export type EditorsService = UseBoundStore> -export type FiltersService = UseBoundStore> export type MonitorService = UseBoundStore> export type RendererService = UseBoundStore> export type ResolverService = UseBoundStore> @@ -58,11 +58,11 @@ export type PublicServices = { tasks: TasksService segmentEditor: SegmentEditorService entityEditor: EntityEditorService + filterEditor: FilterEditorService projectEditor: ProjectEditorService scriptEditor: ScriptEditorService workflowEditor: WorkflowEditorService editors: EditorsService - filters: FiltersService monitor: MonitorService timeline: TimelineService renderer: RendererService From 16c087660e28a84f881d289da1d530a0c7e23811 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 21:41:33 +0200 Subject: [PATCH 264/346] 0.1.2-11 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/filter-editor.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 162ce279..9feeb783 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-10", + "version": "0.1.2-11", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/filter-editor.ts b/packages/aitube-clapper-services/src/filter-editor.ts index feeb034e..fa740208 100644 --- a/packages/aitube-clapper-services/src/filter-editor.ts +++ b/packages/aitube-clapper-services/src/filter-editor.ts @@ -11,6 +11,7 @@ export type Filter = { export type FilterEditorState = { availableFilters: Filter[] + activeFilters: Filter[] }& VersionState export type FilterEditorControls = { From 3b5a904f07b9e3322c8442b39d79050c5bca5972 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 21:54:58 +0200 Subject: [PATCH 265/346] 0.1.2-12 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/filter-editor.ts | 16 +++++++++++++--- packages/aitube-clapper-services/src/index.ts | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 9feeb783..90be4381 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-11", + "version": "0.1.2-12", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/filter-editor.ts b/packages/aitube-clapper-services/src/filter-editor.ts index fa740208..a032e381 100644 --- a/packages/aitube-clapper-services/src/filter-editor.ts +++ b/packages/aitube-clapper-services/src/filter-editor.ts @@ -9,16 +9,26 @@ export type Filter = { shader: string // WGSL shader code for the filter } +export type FilterParams = Record + +export type FilterWithParams = { + filter: Filter + parameters: FilterParams +} + export type FilterEditorState = { + isEnabled: boolean availableFilters: Filter[] - activeFilters: Filter[] + activeFilters: FilterWithParams[] }& VersionState export type FilterEditorControls = { - applyFilters: (input: string) => Promise + runFilterPipeline: (input: string) => Promise + setEnabled: (isEnabled: boolean) => void + // later we can have functions like addFilter() // which could be used by the plugin engine to add filters -} & VersionControls +} & VersionControls export type FilterEditorStore = FilterEditorState & FilterEditorControls \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 96974b26..655601d6 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -89,6 +89,8 @@ export { export { Filter, + FilterParams, + FilterWithParams, FilterEditorState, FilterEditorControls, FilterEditorStore, From fe054c240bce448a06d3cfef785a4e92706d5efe Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 21:59:39 +0200 Subject: [PATCH 266/346] 0.1.2-13 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/filter-editor.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 90be4381..5424da9a 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-12", + "version": "0.1.2-13", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/filter-editor.ts b/packages/aitube-clapper-services/src/filter-editor.ts index a032e381..3513528b 100644 --- a/packages/aitube-clapper-services/src/filter-editor.ts +++ b/packages/aitube-clapper-services/src/filter-editor.ts @@ -20,13 +20,13 @@ export type FilterEditorState = { isEnabled: boolean availableFilters: Filter[] activeFilters: FilterWithParams[] -}& VersionState +}& VersionState export type FilterEditorControls = { runFilterPipeline: (input: string) => Promise setEnabled: (isEnabled: boolean) => void - + // later we can have functions like addFilter() // which could be used by the plugin engine to add filters } & VersionControls From e12fae1b98c6f045a408c97c2f2cb65775a406c5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 22:37:29 +0200 Subject: [PATCH 267/346] 0.1.2-3 --- packages/aitube-timeline/package.json | 2 +- .../src/components/slider/TimelineSlider.tsx | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index dfda4062..d4054884 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-2", + "version": "0.1.2-3", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx b/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx index 1c713351..4f16206f 100644 --- a/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx +++ b/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx @@ -1,3 +1,4 @@ +import { useTimeline } from '@/index'; import React, { useRef, useEffect, useState, useCallback, useMemo } from 'react'; export interface TimelineSliderEvent { @@ -109,8 +110,10 @@ const TimelineSlider: React.FC = ({ const handleMouseDown = (e: React.MouseEvent) => { const rect = containerRef.current?.getBoundingClientRect(); - if (!rect) return; + if (!rect) { return; } + if (useTimeline.getState().isEmpty) { return } + const x = e.clientX - rect.left; const cursorX = ((playbackCursor - minTimeInMs) / (maxTimeInMs - minTimeInMs)) * rect.width; @@ -162,7 +165,8 @@ const TimelineSlider: React.FC = ({ const handleMouseMove = useCallback((e: MouseEvent) => { if (!isDraggingWindow && !isDraggingCursor) return; - + if (useTimeline.getState().isEmpty) { return } + const containerWidth = containerRef.current?.clientWidth || 1; const deltaX = e.clientX - dragStartX; @@ -232,6 +236,7 @@ const TimelineSlider: React.FC = ({ const handleWheel = (e: React.WheelEvent) => { if (!allowSlidingWindowRangeThumbResizeOnMouseWheel) return; + if (useTimeline.getState().isEmpty) { return } const delta = e.deltaY * mouseWheelSensibility; const windowWidth = windowEnd - windowStart; @@ -256,7 +261,8 @@ const TimelineSlider: React.FC = ({ const handleDoubleClick = (e: React.MouseEvent) => { const rect = containerRef.current?.getBoundingClientRect(); if (!rect) return; - + if (useTimeline.getState().isEmpty) { return } + const x = e.clientX - rect.left; const clickedTime = minTimeInMs + (x / rect.width) * (maxTimeInMs - minTimeInMs); From fc0ceb069e47f039108e3019483af494f0c43536 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 29 Jul 2024 22:38:24 +0200 Subject: [PATCH 268/346] 0.1.2-14 --- packages/aitube-clapper-services/bun.lockb | Bin 89694 -> 89694 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 721db115fcc54d2e2f7278e0d14640522772870a..37c333edf3149e144357c92c5b06478594dfbc7b 100755 GIT binary patch delta 156 zcmV;N0Av5&yanF81&}Tvp+1~RrfBQyEJ8ptQh1SD7FuaDldvo5-(QI@+Y$?%u}&f# z5HkP(000000DkNt^0khcE|Y*O8MB!k%uGNF^U6K|d6TZd*q~~!e#8`M*(Yeyo~m#9 z0(5+fr3}+I(%3_%*TEwP1_&}2Xsel*tC@y{sK+AYJkFxK+hKFFrE2wr0W-6k?~*zJ KGq)}(0WdVSSVc$x delta 156 zcmV;N0Av5&yanF81&}Tv6ubrvf;nsM_>>$H6d6r5U&o~|@3Hc_&F0fqU`~x!u}&f# z5HbJ&0000002x{Ev^n7nB9nkC8MB!k%uGPx>U-P`0`D;lt>iY2kgp}Mi6qn@L6BI* zG%6-)B4!RlJ|Y(vISx$b2qx%HyNnrM^fluH;HM?#7j+5O9qx>?rE2wr0W!0j?~*zJ KGPf=&0WdUsJ3lc1 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 5424da9a..13205c67 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-13", + "version": "0.1.2-14", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.1.2", - "@aitube/timeline": "0.1.2-2", + "@aitube/timeline": "0.1.2-3", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From 063cb5729ea92fd782fa4239c0e645ef30b90ccc Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 3 Aug 2024 16:58:43 +0200 Subject: [PATCH 269/346] 0.1.2-15 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/script-editor.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 13205c67..a461bb05 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-14", + "version": "0.1.2-15", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/script-editor.ts b/packages/aitube-clapper-services/src/script-editor.ts index 4d3d7d99..fdf85584 100644 --- a/packages/aitube-clapper-services/src/script-editor.ts +++ b/packages/aitube-clapper-services/src/script-editor.ts @@ -45,8 +45,9 @@ export type ScriptEditorControls = { setStandaloneCodeEditor: (standaloneCodeEditor?: MonacoEditor.editor.IStandaloneCodeEditor) => void setMouseIsInside: (mouseIsInside: boolean) => void loadDraftFromClap: (clap: ClapProject) => void - setDraft: (draft: string) => void - publishDraftToTimeline: () => Promise + setDraft: (draft: string) => boolean + setPublished: (published: string) => boolean + publishToTimeline: () => Promise onDidScrollChange: (scrollData: ScrollData) => void jumpCursorOnLineClick: (line?: number) => void highlightElements: () => void From 02b46edcb2cef26d81e5cd604bac11fc9611dcb8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 3 Aug 2024 17:06:32 +0200 Subject: [PATCH 270/346] 0.1.2-16 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/script-editor.ts | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index a461bb05..ab7fd655 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-15", + "version": "0.1.2-16", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/script-editor.ts b/packages/aitube-clapper-services/src/script-editor.ts index fdf85584..025fb008 100644 --- a/packages/aitube-clapper-services/src/script-editor.ts +++ b/packages/aitube-clapper-services/src/script-editor.ts @@ -23,16 +23,16 @@ export type ScriptEditorState = { // used to know if the user is actually inside the editor or not mouseIsInside: boolean - // the full-text of the screenplay - draft: string + // the last version of the prompt that was published + lastPublished: string - // map screenplay lines to dialogue segments + // map prompt lines to dialogue segments // (note: some lines point to nothing, eg. when we have empty spaces) lineNumberToMentionedSegments: Record /** - * the index of the first step visible in the current screenplay + * the index of the first step visible in the current prompt * * (the topmost visible timeline step in the current timeline) */ @@ -45,9 +45,7 @@ export type ScriptEditorControls = { setStandaloneCodeEditor: (standaloneCodeEditor?: MonacoEditor.editor.IStandaloneCodeEditor) => void setMouseIsInside: (mouseIsInside: boolean) => void loadDraftFromClap: (clap: ClapProject) => void - setDraft: (draft: string) => boolean - setPublished: (published: string) => boolean - publishToTimeline: () => Promise + publish: () => Promise onDidScrollChange: (scrollData: ScrollData) => void jumpCursorOnLineClick: (line?: number) => void highlightElements: () => void From ce570fec008bf8597c90a6cbcef71ede2c7268ef Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 3 Aug 2024 23:44:16 +0200 Subject: [PATCH 271/346] 0.1.2-17 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 1 + packages/aitube-clapper-services/src/types.ts | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index ab7fd655..58b3b6cf 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-16", + "version": "0.1.2-17", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 655601d6..14009103 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -192,6 +192,7 @@ export { ResolveRequest, AssistantRequest, ProjectCreationWizardStep, + SimplifiedSegmentData } from "./types" export { diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index 1b6fd051..4fed4216 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -57,3 +57,16 @@ export enum ProjectCreationWizardStep { CHOOSE_CATEGORY = "CHOOSE_CATEGORY", CREATE_FROM_PROMPT = "CREATE_FROM_PROMPT", } + +/** + * We use a simplified representation of what is a segment + * + * This is used for LLM interactions + */ +export type SimplifiedSegmentData = { + // id: string + prompt: string + startTimeInMs: number + endTimeInMs: number + category: string +} \ No newline at end of file From 0a6d0a8685f34eeeb71a1e55d7afc85bf3813b81 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 3 Aug 2024 23:51:24 +0200 Subject: [PATCH 272/346] 0.1.2-18 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 6 ------ packages/aitube-clapper-services/src/index.ts | 4 ++-- packages/aitube-clapper-services/src/types.ts | 7 ++++++- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 58b3b6cf..075f593c 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-17", + "version": "0.1.2-18", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index b8af1642..48cb5b12 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -99,12 +99,6 @@ export type ResolveRequestPrompts = { } } -export type AssistantResponse = { - prompt: string - categoryName: ClapSegmentCategory - llmOutput: string -} - export type ComfyParameter = | string | number diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 14009103..a4bd183d 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -25,7 +25,6 @@ export { ComputeProvider, ComfyIcuAccelerator, ResolveRequestPrompts, - AssistantResponse, ComfyParameter, ComfyNode, FalAiImageSize, @@ -192,7 +191,8 @@ export { ResolveRequest, AssistantRequest, ProjectCreationWizardStep, - SimplifiedSegmentData + SimplifiedSegmentData, + AssistantResponse } from "./types" export { diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index 4fed4216..59d213fc 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -69,4 +69,9 @@ export type SimplifiedSegmentData = { startTimeInMs: number endTimeInMs: number category: string -} \ No newline at end of file +} + +export type AssistantResponse = { + rawUnstructuredOutput: string; + segments: SimplifiedSegmentData[]; +}; \ No newline at end of file From f9750bbd7822de0917bb2b239abb10e85b3b177a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 00:24:27 +0200 Subject: [PATCH 273/346] 0.1.2-4 --- packages/aitube-timeline/package.json | 2 +- .../aitube-timeline/src/hooks/useTimeline.ts | 32 +++++++++++++++++-- .../aitube-timeline/src/types/timeline.ts | 15 +++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index d4054884..cc1cee32 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-3", + "version": "0.1.2-4", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 8d6cbb07..d10087ee 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -1,11 +1,11 @@ import { create } from "zustand" import * as THREE from "three" -import { ClapOutputType, ClapProject, ClapSceneEvent, ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode, filterSegments, isValidNumber, newClap, serializeClap, ClapTrack, ClapTracks, ClapEntity } from "@aitube/clap" +import { ClapProject, ClapSegment, ClapSegmentCategory, isValidNumber, newClap, serializeClap, ClapTracks, ClapEntity } from "@aitube/clap" import { TimelineSegment, SegmentEditionStatus, SegmentVisibility, TimelineStore, SegmentArea } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS } from "@/constants" -import { hslToHex, findFreeTrack, getAudioBuffer, getFinalVideo, removeFinalVideosAndConvertToTimelineSegments, clapSegmentToTimelineSegment } from "@/utils" +import { hslToHex, findFreeTrack, removeFinalVideosAndConvertToTimelineSegments, clapSegmentToTimelineSegment } from "@/utils" import { ClapSegmentCategoryColors, ClapSegmentColorScheme, ClapTimelineTheme, SegmentResolver } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" @@ -887,7 +887,7 @@ export const useTimeline = create((set, get) => ({ return findFreeTrack({ segments, startTimeInMs, endTimeInMs }) }, - // resize and move the end of a segmrnt, as well as the segment after it + // resize and move the end of a segment, as well as the segment after it fitSegmentToAssetDuration: async (segment: TimelineSegment, requestedDurationInMs?: number): Promise => { const { @@ -1039,6 +1039,32 @@ export const useTimeline = create((set, get) => ({ }) }) }, + deleteSegments: (ids: string[]): void => { + const { + segments: previousSegments, + allSegmentsChanged, + atLeastOneSegmentChanged, + silentChangesInSegment, + clap + } = get() + + const deletables = new Set(ids) + + const newSegments = previousSegments.filter(({ id }) => { + silentChangesInSegment[id] = 1 + (silentChangesInSegment[id] || 0) + return !deletables.has(id) + }) + + // not sure we need to do this, but let's do it anyway for consistency + clap.segments = newSegments + + set({ + segments: newSegments, + allSegmentsChanged: 1 + allSegmentsChanged, + atLeastOneSegmentChanged: 1 + atLeastOneSegmentChanged, + silentChangesInSegment, + }) + }, addEntities: async (newEntities: ClapEntity[]) => { const { entities: previousEntities, diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index f86acb27..66d0a0c9 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -341,10 +341,25 @@ export type TimelineStoreModifiers = { startTimeInMs?: number track?: number }) => Promise + + /** + * Find an available free track + * + * @param params + * @returns + */ findFreeTrack: (params: { startTimeInMs?: number; endTimeInMs?: number }) => number + fitSegmentToAssetDuration: (segment: TimelineSegment, durationInMs?: number) => Promise + /** + * Delete segments from the + * @param ids + * @returns + */ + deleteSegments: (ids: string[]) => void + addEntities: (entities: ClapEntity[]) => Promise updateEntities: (entities: ClapEntity[]) => Promise deleteEntities: (entities: (ClapEntity|string)[]) => Promise From c2f66c82c118d15822dfdecb32f7a241747fd082 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 00:25:29 +0200 Subject: [PATCH 274/346] 0.1.2-19 --- packages/aitube-clapper-services/bun.lockb | Bin 89694 -> 89187 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 37c333edf3149e144357c92c5b06478594dfbc7b..403ee46daed0ce2fcdfef2bc4a7bb31b918ba231 100755 GIT binary patch delta 3610 zcmeHKYfzNe89ryjCoa0M++>$a5mC!UR|RDi*hNqe;=JA5Fb+%hJ1w9PDuA|XbNRU`(Drg#Yoq6tRSIJIiW$=K)J{dT3clYjl!Gd%me z&wJi;-gD0Po%0F?V-aY>p#6dZy2Zuled zS9$^l&+7o#2u2by99-?%;@_n-78#7j$?ky*vG7+#sapyUw^3=b*;O4gBUV98sie3G zR%KM05SbMBZYrHh)l;=COTQbQJa>I>uvHn4WlX19V}^W*mf5rPA3|fur2*6%Y1JFC zXc(AB$$4bX%2H0imq#&K8Hy20o5PlF)|t~iMfHhRWh2z{ zRGW~Y|2r&;+us{*)hA)~;XqVxvQ@tlDicaay%AQW4r&h7W@hLHGAJ^~F2|8MCrep_ z2xQO6Q1-$?T37=W$azQQeDLs~9 zl}{1W^FDP4Y5^1m7-ZEi#xwP-DEC#}n&6`$G!waBL~L(TN5_!*v+ z_q5B0!m^hN$`7&X8=!cxB=u%kbzjY(ZL{ohwd?$>hf0Y+iI@EAVKzr=nwiZp8jl6* zpcB}su|IeM^i$vzji+e!gIPg+I{e%|Q)9anCGG@ST7w^APLzi@PBdGKXZC}htN9mz zgP>Pv`sZLyxKiT+&0nbL)zT>hkE}?mDAp=|t?_R)UI!kExH2%8!ORI>*Zj<^H@GIv z@A&`X{;w8y*^=R5(?6|z;jQ|$lUt1Qnm@?RTr+!T^Y)c3qtc2$?r2EcHU9g+v%e^x zGcJCy^<-Gt+ReF9PnTO;qq9GlTeSPeq`OMqo6)X!RvDAYQ0b5@w5-xeODhf32GvS> z)k#BD1HGa;WE-_W?T3n~a>#>JSmmUbs|<7!>JXW$on)#u&}-EWd4$@bjzf*#=8#8e z-8Lt^y3Ih{P{$~-#z_e^2HI5PknMCH>Kv49yF+%+Tic!V=5_*OxnVT@bCd{wN zA^TkIO^*V%?)7u^xIVE2n6B_f5aLuHUA$ta=)MKv?H-Rf3+4^MJFAn*`a*4Pw*bfC9w8C|j=ur0FC0h$*f#*M&z%g^%$=bGWYWFSb)#_ zc>2fJt{6U{Z9oKSO#p5p!USywBI)Qi4r!<0ey4$-N+Q5dBAM3pM=5;fr%-MGtbiVE z@ON+0t^QH6#}#}%ONR5>a?T#$3*aR1nd`-Gow~RVn12O60X_!WfR6xvEG@u(>K@ov zvKJOU@S+v)*X)DfiNI0d2yhrU1h9`|Hv(Qi`##n5V0&O>guzeZ&62NaFzsdZTUIh4k=e@x@=S$!WoxT++&rbc0?v#Q4pGD+`0)uSuahX$D{>(sI!X_n3ELZb{*{~RP^)%AgL zp5|At2FggeNPQG2=X&VBwU7mBXOK(|C`{ zGSM;xZ$76p%L;WhlY0zdYPC_mf+YUI$fX55u8CE@3&v3X!*M_z79!2j-s^Gx8%G?w zez{_VPEN8+vhZSc+tleH(xkg@Q|E+BlMGeok3h~Obrae}dGFy<-VYd-I%;j2PNral z-0nH`5CUYmx+N5G-h2FnKjeOHUA*ay$Ne8vgF@vBU6)-g3Y8{(7w*RvT*ln(a@k!G zCR4oZt1eb&g-Ktv&z-Hdhdu5rz}uN;>@&T+JjqYQdFS{8ll%8PzVy|q5`j_KX1eDR zVw>ri%Y$(2dXxtv)ZawN9QDHp`9=D7X`cUFbjcf5RPGu+;D`4Nr)+7^`KsSPtn6qD qg^q+4181+D=(J5ti12jMv3%cQlUyAvC-1W)$s?opjhio1g8l_W?fR(z delta 3894 zcmd^CYfx0@8UDUCs~liqxd}q47mR@DDxfY1EQlc06(*X|jX}k9f})K!(^Q9K2#^^y zqC*n(h`dBIdiO7hO%TElt|I&efFD5j1v|ij;14x_ zd7=>h&<*f2zckzxuNo^v81x(S^PSDjOcFwY9t`#bCn7Hx?5@Y%j#ht3>GKu4J1`dw zb4MOqga`rGg9n1If`0*4!9&2i(u5cQE{5(0E*j_RSe%xZulaMp+>sD)C|C~;z_0Y% z6d{ZpK>vAiF51ibT-JLi-tRpA()8~3>Ny6Z5%cD}iti14_~i!`Ci|P=Gy5wTVkx_8 zXo@k0(xMfQF+z-jQkG_6jHPm8lH5v) zB~|%5bQ+?b)Dmh|te9u?(4}MBmLRi|4}}o2T4Kz~W~gK+9km3T^$w`XRGyrq zi%h1*aTeV?C+TaDg6791>F>ZoYp^0QjV>!67P>huN!bZ&5^9sQI@qkFr3#VbR8x#* zQEqFF~P)zGmekDA$y7otL0`Y8jU9%9L0hvr+^# zxx1FrP*b~A=y)MAy47qbo_bfgjZj#NQbAMv&B_%ho-Ii&NoHMe22IMc$nEyBtRM9y zdLcxV#NTtwu4v8A%;r#yW57D-;q2774|o)GFR)qTv0D6D=JrzI=knvEC~+F&;o#g1 zt-#MQH)KT~H3LvoaK6UB(fo_#99Q5?IJjqvwLqbk_>RU! z8W)2-khdJn*R#wGtkC?-tXE3={;bCT`&rKWAJ4M=hiTq{X&$e6zSPZ2fVUtQU@{ZQJkXDy#5D=s^J8Q1zSXID`3 z@Wow+r+yzA?o<9n-I9l89Zw$SRef8`x1tnJe4l{pXyO_hJz8U++BH^rfPR45vDQGd z)>>sfeY)00uc!txs8)HHW~esuSZAPmsH3E;v(Y}Nh3l;H7}Y@)R2V3{!YWVD{0bX| ztT#|I)G6w>-bSaP-d%5%4b%WtxWPcfH&|s8y}iLkQ5y|(1*(~%H`=Hbs(hnWo~1UZ z6_o}`skF)#Dyy_n!X^WCL0zE4O*Xm>Rk_J3zot7->oyxGd$Uzuri#rr`qdT#{R^s% zCT_v_plY{RrGtKe+EIn^RaxZ~`m_q;+lujRwaRNWV=Km2jqyRXlTwZGK`pGd$_}cl zw#iPr-zQIf=$ucW-Dp2VaYy8kQ(0kVd zQqF3TOIn2YiG0m>S@ZFuJ6H3yYCgR8#XM@c9#Ha@7Wqbtc!7C~i9>|g4{(7S09T0P zi--WYz)gU67aV=Wivas>1DuEBkB9`=cL(75f`DNF*KrTvyuLs*!1-N(3|J*1(*T63giMa0Y1*n2J!&j)H8tz zbfWWa_1c;={n^rlV?%cHb z@e-K;UY3zS5M|#AQ}~_3@1Y1;=7JwgwW`HYoH*ik#vF1E?4(n&_ zze4k^$+xTn;M7W_M4M;P42xv0}0 z%F8?f;6_IQ1rP9t>y2P~(lvyNz6+)F`yn#ko_jwxTz%bBmiCGhm(;ypGSl<6*>ysX zO;CG#%b`j-PB#jUG!1H^w~Ut#^{_$qlMmE3gN#@Ad&?Znr4BO4P+6{~7-Y7Ko=cWh zs=-Ibcpk(7$rBY0PEyl-WL%j0li;7L=DyIBH?mGAi{nirO{0Z)pnm8h`-Qo`DYiZK z+SGOAd?FGOO=c4Y=1^;W(TneV(2H_4(-$qf%Aik(WNS3WeTEM+zWiwE=hZ88GS(Dp z;@NQ>^F`@vOOIJ=ewWv`ClX>&i;XfQ%>AK|mD?_sH7)|2FEM z8Sa0!+})vz>i8h^voOOsI{(59*XZ^IW9z`RFGT$!NT#cgg5y^A**&!&vL9pb9wr1nwknY=i`G9Z?W_e1tZ2FnS4 iGJfx(D0ytKS~^(vQI|}T{?e>Y$&>^4#%9Yn-+u!i21$Sb diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 075f593c..8599ae6b 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-18", + "version": "0.1.2-19", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.1.2", - "@aitube/timeline": "0.1.2-3", + "@aitube/timeline": "0.1.2-4", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From 7bd72babdbd1d7218a2256904b9b49f4a25aad38 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 00:44:27 +0200 Subject: [PATCH 275/346] 0.1.2-20 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 8599ae6b..33a3752b 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-19", + "version": "0.1.2-20", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 48cb5b12..1f2b1029 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -1,4 +1,3 @@ -import { ClapSegmentCategory } from "@aitube/clap" export type ChatEvent = { eventId: string @@ -9,6 +8,12 @@ export type ChatEvent = { sentAt: string message: string isCurrentUser: boolean + + /** + * Some message are only used for purely technical reasons, + * and should be hidden (eg. JSON responses) + */ + isHidden: boolean } export type ChatHistory = ChatEvent[] From 5bde25eaac5db6dadecff6f8f44e27cef23ef80a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 12:05:59 +0200 Subject: [PATCH 276/346] 0.1.3 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/assistant.ts | 20 +++++------ .../aitube-clapper-services/src/base-types.ts | 33 +++++++++++++++++++ packages/aitube-clapper-services/src/index.ts | 6 ++-- packages/aitube-clapper-services/src/types.ts | 18 ---------- 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 33a3752b..71b458b2 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-20", + "version": "0.1.3", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/assistant.ts b/packages/aitube-clapper-services/src/assistant.ts index 59e4f618..ceb63f93 100644 --- a/packages/aitube-clapper-services/src/assistant.ts +++ b/packages/aitube-clapper-services/src/assistant.ts @@ -1,4 +1,8 @@ -import { ChatEvent, ChatHistory } from "./base-types" +import { + ChatEvent, + ChatHistory, + AssistantMessage, +} from "./base-types" /** * Assistant @@ -10,14 +14,10 @@ export type AssistantState = { history: ChatHistory } export type AssistantControls = { - /** - * Run a prompt command (which can come from a transcript or somewhere else) - * - * This returns true in case of success (if something happened, and we don't need to do anything anymore) - * @param prompt - * @returns - */ - runCommand: (prompt: string) => boolean + + processAssistantMessage: (assistantMessage: AssistantMessage) => void + + processUserMessage: (userMessage: string) => void /** * Add a chat event to the history @@ -28,8 +28,6 @@ export type AssistantControls = { addEventToHistory: (event: Partial) => ChatEvent clearHistory: () => void - - processMessage: (input: string) => void } export type AssistantStore = diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 1f2b1029..f1716b9c 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -166,3 +166,36 @@ export interface ImageSegment { label: string; score: number; } + +export type AssistantSceneSegment = { + segmentId: number + prompt: string + startTimeInMs: number + endTimeInMs: number + category: string +} + +export type AssistantStorySentence = { + sentenceId: number + sentence: string +} + +export enum AssistantAction { + UPDATE_STORY = 'UPDATE_STORY', + UPDATE_SCENE = 'UPDATE_SCENE', + PLAY_VIDEO = 'PLAY_VIDEO', + PAUSE_VIDEO = 'PAUSE_VIDEO', + MUTE_AUDIO = 'MUTE_AUDIO', + UNMUTE_AUDIO = 'UNMUTE_AUDIO', + GO_BACK = 'GO_BACK', + GO_FORWARD = 'GO_FORWARD', + UNDO = 'UNDO', + REDO = 'REDO', +} + +export type AssistantMessage = { + comment: string; + action: AssistantAction; + updatedStorySentences: AssistantStorySentence; + updatedSceneSegments: AssistantSceneSegment[]; +}; diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index a4bd183d..530a56d7 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -19,6 +19,10 @@ export { } from "./audio" export { + AssistantSceneSegment, + AssistantStorySentence, + AssistantAction, + AssistantMessage, ChatEvent, ChatHistory, SettingsCategory, @@ -191,8 +195,6 @@ export { ResolveRequest, AssistantRequest, ProjectCreationWizardStep, - SimplifiedSegmentData, - AssistantResponse } from "./types" export { diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index 59d213fc..1b6fd051 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -57,21 +57,3 @@ export enum ProjectCreationWizardStep { CHOOSE_CATEGORY = "CHOOSE_CATEGORY", CREATE_FROM_PROMPT = "CREATE_FROM_PROMPT", } - -/** - * We use a simplified representation of what is a segment - * - * This is used for LLM interactions - */ -export type SimplifiedSegmentData = { - // id: string - prompt: string - startTimeInMs: number - endTimeInMs: number - category: string -} - -export type AssistantResponse = { - rawUnstructuredOutput: string; - segments: SimplifiedSegmentData[]; -}; \ No newline at end of file From 5440200c7cf2aa8a5d6c4b9c6f838b43d6e2c995 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 13:36:56 +0200 Subject: [PATCH 277/346] 0.1.3-1 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 71b458b2..90dc17fb 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3", + "version": "0.1.3-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index f1716b9c..32aae467 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -181,6 +181,7 @@ export type AssistantStorySentence = { } export enum AssistantAction { + NONE = 'NONE', UPDATE_STORY = 'UPDATE_STORY', UPDATE_SCENE = 'UPDATE_SCENE', PLAY_VIDEO = 'PLAY_VIDEO', From e0a10b96480f3e2db75e0875dd0e02b045f03d15 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 13:38:42 +0200 Subject: [PATCH 278/346] 0.1.3-2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 90dc17fb..e2d174a3 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3-1", + "version": "0.1.3-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 32aae467..4443cbc9 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -197,6 +197,6 @@ export enum AssistantAction { export type AssistantMessage = { comment: string; action: AssistantAction; - updatedStorySentences: AssistantStorySentence; + updatedStorySentences: AssistantStorySentence[]; updatedSceneSegments: AssistantSceneSegment[]; }; From 4da5fe4146b19e96e7ff021ccc77c19f8f1215b6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 13:59:29 +0200 Subject: [PATCH 279/346] 0.1.3-3 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index e2d174a3..e399b105 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3-2", + "version": "0.1.3-3", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 4443cbc9..39a3ba38 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -182,8 +182,7 @@ export type AssistantStorySentence = { export enum AssistantAction { NONE = 'NONE', - UPDATE_STORY = 'UPDATE_STORY', - UPDATE_SCENE = 'UPDATE_SCENE', + UPDATE_STORY_AND_SCENE = 'UPDATE_STORY_AND_SCENE', PLAY_VIDEO = 'PLAY_VIDEO', PAUSE_VIDEO = 'PAUSE_VIDEO', MUTE_AUDIO = 'MUTE_AUDIO', From 5f9f9856d821881da2cc3f3918b0df5fb0f96bed Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 14:05:53 +0200 Subject: [PATCH 280/346] 0.1.3-5 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/assistant.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index e399b105..c4393266 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3-3", + "version": "0.1.3-5", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/assistant.ts b/packages/aitube-clapper-services/src/assistant.ts index ceb63f93..1e897ade 100644 --- a/packages/aitube-clapper-services/src/assistant.ts +++ b/packages/aitube-clapper-services/src/assistant.ts @@ -2,6 +2,7 @@ import { ChatEvent, ChatHistory, AssistantMessage, + AssistantAction, } from "./base-types" /** @@ -19,6 +20,14 @@ export type AssistantControls = { processUserMessage: (userMessage: string) => void + /** + * Run an action + * + * @param action + * @returns + */ + executeAction: (action: AssistantAction) => Promise + /** * Add a chat event to the history * From bef60bd9d097c0730aa853d298a189a4a80abd0e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 18:34:23 +0200 Subject: [PATCH 281/346] 0.1.3-6 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 6 ++++++ packages/aitube-clapper-services/src/index.ts | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index c4393266..3964e3c8 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3-5", + "version": "0.1.3-6", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 39a3ba38..406e188b 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -167,6 +167,12 @@ export interface ImageSegment { score: number; } +export type AssistantInput = { + directorRequest: string + storySentences: AssistantStorySentence[] + sceneSegments: AssistantSceneSegment[] +} + export type AssistantSceneSegment = { segmentId: number prompt: string diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 530a56d7..21776237 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -19,6 +19,7 @@ export { } from "./audio" export { + AssistantInput, AssistantSceneSegment, AssistantStorySentence, AssistantAction, From 2ac1e1d23191a8e789ba3a0586b47b54b3e5b8d6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 19:19:28 +0200 Subject: [PATCH 282/346] 0.1.4 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/assistant.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 3964e3c8..0851a736 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3-6", + "version": "0.1.4", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/assistant.ts b/packages/aitube-clapper-services/src/assistant.ts index 1e897ade..b3d3d7ad 100644 --- a/packages/aitube-clapper-services/src/assistant.ts +++ b/packages/aitube-clapper-services/src/assistant.ts @@ -21,12 +21,12 @@ export type AssistantControls = { processUserMessage: (userMessage: string) => void /** - * Run an action - * - * @param action + * Process an action of a message + * + * @param actionOrAssistantMessage * @returns */ - executeAction: (action: AssistantAction) => Promise + processActionOrMessage: (actionOrAssistantMessage: AssistantAction | AssistantMessage) => Promise /** * Add a chat event to the history From ec5c3d487f62887df274ee225311df4907de129c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 20:28:17 +0200 Subject: [PATCH 283/346] 0.1.4-1 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/assistant.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 0851a736..00918201 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.4", + "version": "0.1.4-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/assistant.ts b/packages/aitube-clapper-services/src/assistant.ts index b3d3d7ad..8ce3348d 100644 --- a/packages/aitube-clapper-services/src/assistant.ts +++ b/packages/aitube-clapper-services/src/assistant.ts @@ -16,12 +16,10 @@ export type AssistantState = { } export type AssistantControls = { - processAssistantMessage: (assistantMessage: AssistantMessage) => void - processUserMessage: (userMessage: string) => void /** - * Process an action of a message + * Process an action or a message * * @param actionOrAssistantMessage * @returns From f7a52966687d25cb90165d15bd7591ef37915ff6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 20:33:03 +0200 Subject: [PATCH 284/346] hm --- packages/aitube-clapper-services/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 00918201..62b1858c 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.4-1", + "version": "0.1.4-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", From 8ad9475e0049ea3dd31da5fe959d58ea681cf85d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 22:23:48 +0200 Subject: [PATCH 285/346] 0.1.5 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 1 - packages/aitube-clapper-services/src/monitor.ts | 10 ---------- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 62b1858c..94d30b5a 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.4-2", + "version": "0.1.5", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 21776237..2c1c9481 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -121,7 +121,6 @@ export { } from "./editors" export { - MonitoringMode, MonitorState, MonitorControls, MonitorStore diff --git a/packages/aitube-clapper-services/src/monitor.ts b/packages/aitube-clapper-services/src/monitor.ts index 0dc48227..15945c33 100644 --- a/packages/aitube-clapper-services/src/monitor.ts +++ b/packages/aitube-clapper-services/src/monitor.ts @@ -1,23 +1,13 @@ -export enum MonitoringMode { - NONE = "NONE", - STATIC = "STATIC", - DYNAMIC = "DYNAMIC" -} - export type MonitorState = { shortcutsAreBound: boolean - mode: MonitoringMode lastTimelineUpdateAtInMs: number isPlaying: boolean staticVideoRef?: HTMLVideoElement } export type MonitorControls = { - bindShortcuts: () => void - setMonitoringMode: (mode: MonitoringMode) => void - setStaticVideoRef: (staticVideoRef: HTMLVideoElement) => void checkIfPlaying: () => boolean From 906c5c1d736683a07a665654b1f4f7afa83e2887 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 4 Aug 2024 22:36:16 +0200 Subject: [PATCH 286/346] 0.1.3 --- packages/broadway/package.json | 2 +- packages/broadway/src/analysis/loadAgeAndGenderDataset.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index c5ea27b4..f6bcbf37 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2", + "version": "0.1.3", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts index 1ae2c5ff..c20efec6 100644 --- a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -29,6 +29,11 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promi if (typeof window !== "undefined") { try { const { default: fs } = await import("indexeddb-fs") + + if (!await fs.isDirectory(dirName)) { + await fs.createDirectory(dirName) + } + const rawCacheContent = await fs.readFile(storageFilePath) as string const cacheObject = JSON.parse(rawCacheContent) as NameToStats if (Object.keys(cacheObject).length === 0) { @@ -79,6 +84,7 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promi try { const { default: fs } = await import("indexeddb-fs") + if (!await fs.isDirectory(dirName)) { await fs.createDirectory(dirName) } From 85d5c68c03af27b891f5e45ffbc72c16c391f132 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 5 Aug 2024 01:18:41 +0200 Subject: [PATCH 287/346] 0.1.5-1 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 7 ++++++- packages/aitube-clapper-services/src/index.ts | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 94d30b5a..6214b1f7 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.5", + "version": "0.1.5-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 406e188b..5aba3eaf 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -1,3 +1,8 @@ +export enum ChatEventVisibility { + TO_ASSISTANT_ONLY = 'TO_ASSISTANT_ONLY', + TO_USER_ONLY = 'TO_USER_ONLY', + TO_BOTH = 'TO_BOTH', +} export type ChatEvent = { eventId: string @@ -13,7 +18,7 @@ export type ChatEvent = { * Some message are only used for purely technical reasons, * and should be hidden (eg. JSON responses) */ - isHidden: boolean + visibility: ChatEventVisibility } export type ChatHistory = ChatEvent[] diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 2c1c9481..e123303b 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -25,6 +25,7 @@ export { AssistantAction, AssistantMessage, ChatEvent, + ChatEventVisibility, ChatHistory, SettingsCategory, ComputeProvider, From 7291275bc6f56e66dbc6a0875a66996deea42f37 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 5 Aug 2024 01:33:29 +0200 Subject: [PATCH 288/346] trying a workaround.. --- packages/broadway/package.json | 2 +- .../src/analysis/loadAgeAndGenderDataset.ts | 28 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/broadway/package.json b/packages/broadway/package.json index f6bcbf37..32c310bd 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3", + "version": "0.1.3-1", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", diff --git a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts index c20efec6..67b5aa6e 100644 --- a/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts +++ b/packages/broadway/src/analysis/loadAgeAndGenderDataset.ts @@ -15,9 +15,10 @@ export const state: { nameToStats: {}, } -const dirName = 'detection-of-age-and-gender' const fileName = 'baby-names-us-year-of-birth-full.csv' -const storageFilePath = `${dirName}/${fileName}` +//const dirName = 'detection-of-age-and-gender' +//const storageFilePath = `${dirName}/${fileName}` +const storageFilePath = `${fileName}` const DEFAULT_DOWNLOAD_URL = `https://clapper.app/datasets/${fileName}` @@ -29,11 +30,16 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promi if (typeof window !== "undefined") { try { const { default: fs } = await import("indexeddb-fs") - - if (!await fs.isDirectory(dirName)) { - await fs.createDirectory(dirName) + /* + try { + if (!(await fs.isDirectory(dirName))) { + await fs.createDirectory(dirName) + } + } catch (err) { + console.log(`failed to create directory "${dirName}"`) } - + */ + const rawCacheContent = await fs.readFile(storageFilePath) as string const cacheObject = JSON.parse(rawCacheContent) as NameToStats if (Object.keys(cacheObject).length === 0) { @@ -85,9 +91,15 @@ export async function loadAgeGenderNameStats(url = DEFAULT_DOWNLOAD_URL) : Promi try { const { default: fs } = await import("indexeddb-fs") - if (!await fs.isDirectory(dirName)) { - await fs.createDirectory(dirName) + /* + try { + if (!(await fs.isDirectory(dirName))) { + await fs.createDirectory(dirName) + } + } catch (err) { + console.log(`failed to create directory "${dirName}"`) } + */ await fs.writeFile(storageFilePath, JSON.stringify(nameToStats)) } catch (err) { From e4fecc24af6b21935bcd727a90b039296322c8b5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 5 Aug 2024 13:32:04 +0200 Subject: [PATCH 289/346] 0.1.5-2 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/base-types.ts | 20 +++++++++---------- packages/aitube-clapper-services/src/index.ts | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 6214b1f7..8b26a554 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.5-1", + "version": "0.1.5-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 5aba3eaf..5e44529c 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -172,12 +172,6 @@ export interface ImageSegment { score: number; } -export type AssistantInput = { - directorRequest: string - storySentences: AssistantStorySentence[] - sceneSegments: AssistantSceneSegment[] -} - export type AssistantSceneSegment = { segmentId: number prompt: string @@ -186,9 +180,15 @@ export type AssistantSceneSegment = { category: string } -export type AssistantStorySentence = { - sentenceId: number - sentence: string +export type AssistantStoryBlock = { + blockId: number + block: string +} + +export type AssistantInput = { + directorRequest: string + storyBlocks: AssistantStoryBlock[] + sceneSegments: AssistantSceneSegment[] } export enum AssistantAction { @@ -207,6 +207,6 @@ export enum AssistantAction { export type AssistantMessage = { comment: string; action: AssistantAction; - updatedStorySentences: AssistantStorySentence[]; + updatedStoryBlocks: AssistantStoryBlock[]; updatedSceneSegments: AssistantSceneSegment[]; }; diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index e123303b..dcbb5ae6 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -21,7 +21,7 @@ export { export { AssistantInput, AssistantSceneSegment, - AssistantStorySentence, + AssistantStoryBlock, AssistantAction, AssistantMessage, ChatEvent, From e9875f2b9e82228da8b33b5e0dc811ff9f108bf8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 6 Aug 2024 16:14:10 +0200 Subject: [PATCH 290/346] 0.1.3 --- packages/aitube-timeline/package.json | 2 +- .../src/components/cells/Cell.tsx | 13 ++++- .../src/components/icons/SegmentIcon.tsx | 33 +++++++++++++ .../src/components/icons/SvgIcon.tsx | 25 ++++++++++ .../src/components/icons/SvgShapeMesh.tsx | 35 ++++++++++++++ .../src/components/icons/icons.ts | 47 +++++++++++++++++++ .../src/components/icons/loadSvgShapes.ts | 18 +++++++ .../src/components/icons/segmentIcons.ts | 35 ++++++++++++++ .../src/components/icons/types.ts | 10 ++++ .../src/components/icons/useSvgShapes.ts | 12 +++++ 10 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 packages/aitube-timeline/src/components/icons/SegmentIcon.tsx create mode 100644 packages/aitube-timeline/src/components/icons/SvgIcon.tsx create mode 100644 packages/aitube-timeline/src/components/icons/SvgShapeMesh.tsx create mode 100644 packages/aitube-timeline/src/components/icons/icons.ts create mode 100644 packages/aitube-timeline/src/components/icons/loadSvgShapes.ts create mode 100644 packages/aitube-timeline/src/components/icons/segmentIcons.ts create mode 100644 packages/aitube-timeline/src/components/icons/types.ts create mode 100644 packages/aitube-timeline/src/components/icons/useSvgShapes.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index cc1cee32..0d415611 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-4", + "version": "0.1.3", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/aitube-timeline/src/components/cells/Cell.tsx index e995a0ef..6d6eb12b 100644 --- a/packages/aitube-timeline/src/components/cells/Cell.tsx +++ b/packages/aitube-timeline/src/components/cells/Cell.tsx @@ -16,6 +16,7 @@ import { RedrawButton } from "./RedrawButton" import { AudioCell } from "./AudioCell" import { useThree } from "@react-three/fiber" import { SegmentArea } from "@/types/timeline" +import { SegmentIcon } from "../icons/SegmentIcon" export function Cell({ segment: s @@ -240,7 +241,17 @@ export function Cell({ isResizing={isResizing} track={tracks[s.track]} /> - + + + {/* + if you manage to make this component work, + let me know.. + + (s.category !== ClapSegmentCategory.STORYBOARD && + s.category !== ClapSegmentCategory.VIDEO) + && + */} + { // TODO also add the buttons to Dialogue, Sound, Music etc.. // also maybe fix the display, as when zoomed out it doesn't look good diff --git a/packages/aitube-timeline/src/components/icons/SegmentIcon.tsx b/packages/aitube-timeline/src/components/icons/SegmentIcon.tsx new file mode 100644 index 00000000..9a8bdcc7 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/SegmentIcon.tsx @@ -0,0 +1,33 @@ +import { GroupProps } from "@react-three/fiber"; +import { ClapSegmentCategory } from "@aitube/clap"; + +import { useSvgShapes } from "./useSvgShapes"; +import { SvgShapeMesh } from "./SvgShapeMesh"; +import { segmentCategoryToIconPath } from "./segmentIcons"; + +export function SegmentIcon({ + category = ClapSegmentCategory.GENERIC, + groupProps = {} +}: { + category?: ClapSegmentCategory + groupProps?: GroupProps +}) { + const iconUrl = segmentCategoryToIconPath[category] + const shapes = useSvgShapes(iconUrl) + + return ( + + {shapes.map(item => + + )} + + ); +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/icons/SvgIcon.tsx b/packages/aitube-timeline/src/components/icons/SvgIcon.tsx new file mode 100644 index 00000000..1374c330 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/SvgIcon.tsx @@ -0,0 +1,25 @@ +import { GroupProps } from "@react-three/fiber"; + +import { useSvgShapes } from "./useSvgShapes"; +import { SvgShapeMesh } from "./SvgShapeMesh"; +import { IconType } from "./types"; +import { icons } from "./icons"; + +export function SvgIcon({ + icon = "misc", + groupProps = {} +}: { + icon?: IconType + groupProps?: GroupProps +}) { + const iconUrl = icons[icon] + const shapes = useSvgShapes(iconUrl) + + return ( + + {shapes.map(item => + + )} + + ); +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/icons/SvgShapeMesh.tsx b/packages/aitube-timeline/src/components/icons/SvgShapeMesh.tsx new file mode 100644 index 00000000..cd60351f --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/SvgShapeMesh.tsx @@ -0,0 +1,35 @@ +import * as THREE from 'three'; + +import { SvgShape } from './types'; +import { degToRad } from 'three/src/math/MathUtils.js'; + +export function SvgShapeMesh({ + shape, + color, + index +}: SvgShape) { + return ( + + + + + ); +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/icons/icons.ts b/packages/aitube-timeline/src/components/icons/icons.ts new file mode 100644 index 00000000..529e25c0 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/icons.ts @@ -0,0 +1,47 @@ +// one issue with icons is that they need to be downloaded from somewhere +// so we assume to host application will put them in /images/icons +// but maybe there is a way to put them here, in this project? + +const path = `/images/icons/interface/` + +// those icons can be used by the timeline +// but for the moment this isn't the case +export const icons = { + mute: `${path}mute.svg`, + unmute: `${path}unmute.svg`, + visible: `${path}visible.svg`, + hidden: `${path}hidden.svg`, + project: `${path}project.svg`, + team: `${path}team.svg`, + computer: `${path}computer.svg`, + cloud: `${path}cloud.svg`, + downloads: `${path}downloads.svg`, + soundfile: `${path}soundfile.svg`, + imagefile: `${path}imagefile.svg`, + videofile: `${path}videofile.svg`, + textfile: `${path}textfile.svg`, + screenplay: `${path}screenplay.svg`, + community: `${path}community.svg`, + vendor: `${path}vendor.svg`, + textprompt: `${path}textprompt.svg`, + characters: `${path}characters.svg`, + character: `${path}character.svg`, + transition: `${path}transition.svg`, + cut: `${path}cut.svg`, + location: `${path}location.svg`, + misc: `${path}misc.svg`, + lora: `${path}lora.svg`, + sound: `${path}sound.svg`, + film: `${path}film.svg`, + speech: `${path}speech.svg`, + image: `${path}image.svg`, + transfer: `${path}transfer.svg`, + interpolate: `${path}interpolate.svg`, + upscale: `${path}upscale.svg`, + textToVideo: `${path}text-to-video.svg`, + imageToImage: `${path}image-to-image.svg`, + videoToVideo: `${path}video-to-video.svg`, + textToMusic: `${path}text-to-music.svg`, + videoFolder: `${path}video-folder.svg`, +} + diff --git a/packages/aitube-timeline/src/components/icons/loadSvgShapes.ts b/packages/aitube-timeline/src/components/icons/loadSvgShapes.ts new file mode 100644 index 00000000..763e8bf9 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/loadSvgShapes.ts @@ -0,0 +1,18 @@ +import { SVGLoader } from "three/examples/jsm/Addons.js" + +import { SvgShape } from "./types"; + +// with which the threejs engine will make shapes +export async function loadSvgShapes(url: string): Promise { + return new Promise(resolve => + new SVGLoader().load(url, shapes => ( + resolve(shapes.paths.map((group, index) => ( + group.toShapes(true).map(shape => ({ + shape, + color: group.userData?.style.fill || '#ffffff', + index + })) + )).flat()) + )) + ) +} \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/icons/segmentIcons.ts b/packages/aitube-timeline/src/components/icons/segmentIcons.ts new file mode 100644 index 00000000..01b1fdd6 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/segmentIcons.ts @@ -0,0 +1,35 @@ +// one issue with icons is that they need to be downloaded from somewhere +// so we assume to host application will put them in /images/icons +// but maybe there is a way to put them here, in this project? + +import { ClapSegmentCategory } from "@aitube/clap" + +const path = `/images/icons/segments/` + +// those icons are specially used for the segments + +export const segmentCategoryToIconPath: Record = { + [ClapSegmentCategory.SPLAT]: `${path}splat.svg`, + [ClapSegmentCategory.MESH]: `${path}mesh.svg`, + [ClapSegmentCategory.DEPTH]: `${path}depth.svg`, + [ClapSegmentCategory.EVENT]: `${path}event.svg`, + [ClapSegmentCategory.EFFECT]: `${path}effect.svg`, + [ClapSegmentCategory.INTERFACE]: `${path}interface.svg`, + [ClapSegmentCategory.PHENOMENON]: `${path}phenomenon.svg`, + [ClapSegmentCategory.VIDEO]: `${path}video.svg`, + [ClapSegmentCategory.STORYBOARD]: `${path}storyboard.svg`, + [ClapSegmentCategory.TRANSITION]: `${path}transition.svg`, + [ClapSegmentCategory.CHARACTER]: `${path}character.svg`, + [ClapSegmentCategory.LOCATION]: `${path}location.svg`, + [ClapSegmentCategory.TIME]: `${path}time.svg`, + [ClapSegmentCategory.ERA]: `${path}era.svg`, + [ClapSegmentCategory.LIGHTING]: `${path}lighting.svg`, + [ClapSegmentCategory.WEATHER]: `${path}weather.svg`, + [ClapSegmentCategory.ACTION]: `${path}action.svg`, + [ClapSegmentCategory.MUSIC]: `${path}music.svg`, + [ClapSegmentCategory.SOUND]: `${path}sound.svg`, + [ClapSegmentCategory.DIALOGUE]: `${path}dialogue.svg`, + [ClapSegmentCategory.STYLE]: `${path}style.svg`, + [ClapSegmentCategory.CAMERA]: `${path}camera.svg`, + [ClapSegmentCategory.GENERIC]: `${path}generic.svg`, +} diff --git a/packages/aitube-timeline/src/components/icons/types.ts b/packages/aitube-timeline/src/components/icons/types.ts new file mode 100644 index 00000000..8348a962 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/types.ts @@ -0,0 +1,10 @@ +import { Shape } from "three"; + +import { icons } from "./icons"; + +export type SvgShape = { + shape: Shape; + color: any; + index: number; +} +export type IconType = keyof typeof icons \ No newline at end of file diff --git a/packages/aitube-timeline/src/components/icons/useSvgShapes.ts b/packages/aitube-timeline/src/components/icons/useSvgShapes.ts new file mode 100644 index 00000000..21ca3fb4 --- /dev/null +++ b/packages/aitube-timeline/src/components/icons/useSvgShapes.ts @@ -0,0 +1,12 @@ +import { useEffect, useState } from "react"; + +import { loadSvgShapes } from "./loadSvgShapes"; +import { SvgShape } from "./types"; + +export function useSvgShapes(url: string): SvgShape[] { + const [shapes, set] = useState([]); + useEffect(() => { + loadSvgShapes(url).then(set) + }, [url]); + return shapes +} \ No newline at end of file From ed6492233567102f7028f4462ceb02f8c218d3d5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 6 Aug 2024 16:15:18 +0200 Subject: [PATCH 291/346] 0.1.6 --- packages/aitube-clapper-services/bun.lockb | Bin 89187 -> 89185 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 403ee46daed0ce2fcdfef2bc4a7bb31b918ba231..929583f6b729c0cb3f5950c926f203f4fa8a4551 100755 GIT binary patch delta 5856 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 8b26a554..a6d39b66 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.5-2", + "version": "0.1.6", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.1.2", - "@aitube/timeline": "0.1.2-4", + "@aitube/timeline": "0.1.3", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From 65b8b6105953473c1d0b6d00d9745d0744ce2d18 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 15:36:36 +0200 Subject: [PATCH 292/346] 0.1.7 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/base-types.ts | 40 +++++++++++++++++++ packages/aitube-clapper-services/src/index.ts | 4 +- packages/aitube-clapper-services/src/types.ts | 9 ----- packages/aitube-clapper-services/src/ui.ts | 3 +- 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index a6d39b66..52650f07 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.6", + "version": "0.1.7", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 5e44529c..9f5a3eeb 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -1,3 +1,5 @@ +import { ClapWorkflow } from "@aitube/clap" + export enum ChatEventVisibility { TO_ASSISTANT_ONLY = 'TO_ASSISTANT_ONLY', TO_USER_ONLY = 'TO_USER_ONLY', @@ -210,3 +212,41 @@ export type AssistantMessage = { updatedStoryBlocks: AssistantStoryBlock[]; updatedSceneSegments: AssistantSceneSegment[]; }; + + +export enum ProjectCreationWizardStep { + NONE = "NONE", + CHOOSE_CATEGORY = "CHOOSE_CATEGORY", + CREATE_FROM_PROMPT = "CREATE_FROM_PROMPT", +} + + +// note: it could be argued that image filtering and upscaling +// are both subsets of the same general concept of "image to image" +// and.. yes, that's true! +// there are only separated for convenient, to add some semantic +// to those abstract image-to-image models. +export enum WorkflowCategory { + IMAGE_GENERATION = "IMAGE_GENERATION", + IMAGE_FILTERING = "IMAGE_FILTERING", + IMAGE_UPSCALING = "IMAGE_UPSCALING", + IMAGE_DEPTH_MAPPING = "IMAGE_DEPTH_MAPPING", + IMAGE_SEGMENTATION = "IMAGE_SEGMENTATION", + MUSIC_GENERATION = "MUSIC_GENERATION", + SOUND_GENERATION = "SOUND_GENERATION", + VOICE_GENERATION = "VOICE_GENERATION", + VIDEO_GENERATION = "VIDEO_GENERATION", + VIDEO_FILTERING = "VIDEO_FILTERING", + VIDEO_UPSCALING = "VIDEO_UPSCALING", + VIDEO_DEPTH_MAPPING = "VIDEO_DEPTH_MAPPING", + VIDEO_SEGMENTATION = "VIDEO_SEGMENTATION", +} + +export type Workflow = { + provider: ComputeProvider + category: WorkflowCategory + workflow: ClapWorkflow + + // used in the UI, to determine if a workflow is current active or not + isActive?: boolean +} \ No newline at end of file diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index dcbb5ae6..7a828834 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -37,6 +37,9 @@ export { StabilityAiImageSize, StabilityAiGenerationMode, ImageSegment, + ProjectCreationWizardStep, + WorkflowCategory, + Workflow, } from "./base-types" export { @@ -195,7 +198,6 @@ export { export { ResolveRequest, AssistantRequest, - ProjectCreationWizardStep, } from "./types" export { diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index 1b6fd051..e47c55f7 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -1,8 +1,5 @@ import { ClapEntity, ClapMeta } from "@aitube/clap" -// TODO: export this one in a more proper way -import { ClapInputField } from "@aitube/clap/dist/types" - import { TimelineSegment } from "@aitube/timeline" import { SettingsState } from "./settings" @@ -51,9 +48,3 @@ export type AssistantRequest = { history: ChatEvent[] } - -export enum ProjectCreationWizardStep { - NONE = "NONE", - CHOOSE_CATEGORY = "CHOOSE_CATEGORY", - CREATE_FROM_PROMPT = "CREATE_FROM_PROMPT", -} diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 5359bbfe..8b5b9fce 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -1,6 +1,5 @@ import { ClapTimelineTheme } from "@aitube/timeline" -import { SettingsCategory } from "./base-types" -import { ProjectCreationWizardStep } from "./types" +import { ProjectCreationWizardStep, SettingsCategory } from "./base-types" import { WorkflowEditorTheme } from "./workflow-editor" export type UIThemeName = From c8d74539910aafd67513f2bd66852045d45bb9e1 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 15:39:44 +0200 Subject: [PATCH 293/346] 0.1.8 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/workflow-editor.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 52650f07..ba55650a 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.7", + "version": "0.1.8", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/workflow-editor.ts b/packages/aitube-clapper-services/src/workflow-editor.ts index e4f3510a..67d72650 100644 --- a/packages/aitube-clapper-services/src/workflow-editor.ts +++ b/packages/aitube-clapper-services/src/workflow-editor.ts @@ -1,6 +1,7 @@ import { ClapWorkflow } from "@aitube/clap" import { VersionControls, VersionState } from "./version-control" +import { Workflow } from "./base-types"; export type WorkflowEditorTheme = { bgColor?: string; @@ -18,11 +19,11 @@ export type WorkflowEditorTheme = { } export type WorkflowEditorState = { - + availableWorkflows: Workflow[] } & VersionState export type WorkflowEditorControls = { - + updateAvailableWorkflows: () => Promise } & VersionControls export type WorkflowEditorStore = WorkflowEditorState & WorkflowEditorControls From e3006e6111562823318a9dbe84c4d64c1401bd1c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 16:37:53 +0200 Subject: [PATCH 294/346] 0.1.8-1 --- packages/aitube-clapper-services/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index ba55650a..c9b2e75a 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.8", + "version": "0.1.8-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", From 684713de3ce91a0cfaedf406b6d882ddefdf6da7 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 17:34:11 +0200 Subject: [PATCH 295/346] 0.1.3 --- packages/aitube-clap/README.md | 2 + packages/aitube-clap/package.json | 2 +- .../aitube-clap/src/factories/newWorkflow.ts | 6 +- packages/aitube-clap/src/index.ts | 6 +- .../src/sanitizers/sanitizeWorkflow.ts | 8 ++- packages/aitube-clap/src/types.ts | 63 +++++++++++++++++++ packages/aitube-clap/src/utils/index.ts | 2 + .../src/utils/parseWorkflowCategory.ts | 15 +++++ .../src/utils/parseWorkflowProvider.ts | 15 +++++ 9 files changed, 113 insertions(+), 6 deletions(-) create mode 100644 packages/aitube-clap/src/utils/parseWorkflowCategory.ts create mode 100644 packages/aitube-clap/src/utils/parseWorkflowProvider.ts diff --git a/packages/aitube-clap/README.md b/packages/aitube-clap/README.md index a6dbc01b..3b130f8c 100644 --- a/packages/aitube-clap/README.md +++ b/packages/aitube-clap/README.md @@ -50,6 +50,8 @@ import { ClapInputValue, ClapInputValues, ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, ClapWorkflow, // defaults diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index b9cfdcd1..640d20f2 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2", + "version": "0.1.3", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/factories/newWorkflow.ts b/packages/aitube-clap/src/factories/newWorkflow.ts index 081bbc38..24cbbac4 100644 --- a/packages/aitube-clap/src/factories/newWorkflow.ts +++ b/packages/aitube-clap/src/factories/newWorkflow.ts @@ -1,5 +1,5 @@ -import { ClapWorkflow, ClapWorkflowEngine } from "@/types" -import { parseWorkflowEngine } from "@/utils" +import { ClapWorkflow, ClapWorkflowCategory, ClapWorkflowEngine, ClapWorkflowProvider } from "@/types" +import { parseWorkflowCategory, parseWorkflowEngine, parseWorkflowProvider } from "@/utils" import { UUID } from "@/utils/uuid" export function newWorkflow(maybeWorkflow?: Partial) { @@ -12,6 +12,8 @@ export function newWorkflow(maybeWorkflow?: Partial) { author: typeof maybeWorkflow?.author === "string" ? maybeWorkflow.author : "", thumbnailUrl: typeof maybeWorkflow?.thumbnailUrl === "string" ? maybeWorkflow.thumbnailUrl : "", engine: parseWorkflowEngine(maybeWorkflow?.engine, ClapWorkflowEngine.DEFAULT), + category: parseWorkflowCategory(maybeWorkflow?.category, ClapWorkflowCategory.IMAGE_GENERATION), + provider: parseWorkflowProvider(maybeWorkflow?.provider, ClapWorkflowProvider.NONE), data: typeof maybeWorkflow?.data === "string" ? maybeWorkflow.data : "", inputFields: Array.isArray(maybeWorkflow?.inputFields) ? maybeWorkflow.inputFields : [], inputValues: typeof maybeWorkflow?.inputValues === "object" ? maybeWorkflow.inputValues : {}, diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index cb889a58..882c8170 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -24,7 +24,7 @@ export { ClapTracks, ClapVoice, ClapCompletionMode, - + ClapInputField, ClapInputFieldNumber, ClapInputFieldString, ClapInputFieldBoolean, @@ -33,6 +33,8 @@ export { ClapInputValue, ClapInputValues, ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, ClapWorkflow } from './types' export { @@ -60,6 +62,8 @@ export { parseMediaOrientation, parseOutputType, parseWorkflowEngine, + parseWorkflowCategory, + parseWorkflowProvider, parseSegmentCategory, parseSegmentStatus, UUID diff --git a/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts b/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts index fcf2984c..6bdc8355 100644 --- a/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts +++ b/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts @@ -1,5 +1,5 @@ -import { ClapWorkflow, ClapWorkflowEngine } from "@/types"; -import { parseWorkflowEngine, UUID } from "@/utils"; +import { ClapWorkflow, ClapWorkflowCategory, ClapWorkflowEngine, ClapWorkflowProvider } from "@/types"; +import { parseWorkflowCategory, parseWorkflowEngine, parseWorkflowProvider, UUID } from "@/utils"; export function sanitizeWorkflow({ id, @@ -9,6 +9,8 @@ export function sanitizeWorkflow({ author, thumbnailUrl, engine, + category, + provider, data, inputFields, inputValues, @@ -21,6 +23,8 @@ export function sanitizeWorkflow({ author: typeof author === "string" ? author : "", thumbnailUrl: typeof thumbnailUrl === "string" ? thumbnailUrl : "", engine: parseWorkflowEngine(engine, ClapWorkflowEngine.DEFAULT), + category: parseWorkflowCategory(category, ClapWorkflowCategory.IMAGE_GENERATION), + provider: parseWorkflowProvider(provider, ClapWorkflowProvider.NONE), data: typeof data === "string" ? data : "", inputFields: Array.isArray(inputFields) ? inputFields : [], inputValues: typeof inputValues === "object" ? inputValues : {}, diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 3aefc7ff..e1077602 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -487,10 +487,69 @@ export type ClapInputValue = export type ClapInputValues = Record + +export enum ClapWorkflowProvider { + NONE = "NONE", + BUILTIN = "BUILTIN", + CUSTOM = "CUSTOM", + HUGGINGFACE = "HUGGINGFACE", // https://huggingface.co + COMFY_HUGGINGFACE = "COMFY_HUGGINGFACE", // https://huggingface.co + REPLICATE = "REPLICATE", // https://replicate.com + COMFY_REPLICATE = "COMFY_REPLICATE", // https://replicate.com + COMFY_COMFYICU = "COMFY_COMFYICU", // https://comfy.icu + ELEVENLABS = "ELEVENLABS", // https://elevenlabs.io + KITSAI = "KITSAI", // https://kits.ai + OPENAI = "OPENAI", // https://openai.com + STABILITYAI = "STABILITYAI", // https://stability.ai + FIREWORKSAI = "FIREWORKSAI", // https://fireworks.ai + GROQ = "GROQ", // https://groq.com + ANTHROPIC = "ANTHROPIC", // https://anthropic.com + GOOGLE = "GOOGLE", // https://google.com (in case you didn't know) + MISTRALAI = "MISTRALAI", // https://mistral.ai + COHERE = "COHERE", // https://cohere.com + FALAI = "FALAI", // https://fal.ai + MODELSLAB = "MODELSLAB", // https://modelslab.com + MIDJOURNEY = "MIDJOURNEY", + SUNO = "SUNO", + UDIO = "UDIO", + LUMALABS = "LUMALABS", + KUAISHOU = "KUAISHOU", + RUNWAYML = "RUNWAYML", + HEDRA = "HEDRA", + LEONARDOAI = "LEONARDOAI", + EVERARTAI = "EVERARTAI", +} + + +// note: it could be argued that image filtering and upscaling +// are both subsets of the same general concept of "image to image" +// and.. yes, that's true! +// there are only separated for convenient, to add some semantic +// to those abstract image-to-image models. +export enum ClapWorkflowCategory { + IMAGE_GENERATION = "IMAGE_GENERATION", + IMAGE_FILTERING = "IMAGE_FILTERING", + IMAGE_UPSCALING = "IMAGE_UPSCALING", + IMAGE_DEPTH_MAPPING = "IMAGE_DEPTH_MAPPING", + IMAGE_SEGMENTATION = "IMAGE_SEGMENTATION", + MUSIC_GENERATION = "MUSIC_GENERATION", + SOUND_GENERATION = "SOUND_GENERATION", + VOICE_GENERATION = "VOICE_GENERATION", + VIDEO_GENERATION = "VIDEO_GENERATION", + VIDEO_FILTERING = "VIDEO_FILTERING", + VIDEO_UPSCALING = "VIDEO_UPSCALING", + VIDEO_DEPTH_MAPPING = "VIDEO_DEPTH_MAPPING", + VIDEO_SEGMENTATION = "VIDEO_SEGMENTATION", +} + export enum ClapWorkflowEngine { // the default pipeline (can be anything, this is left to the app developer) DEFAULT = "DEFAULT", + REST_API = "REST_API", + + GRADIO_API = "GRADIO_API", + // the JSON format used by ComfyUI COMFYUI_WORKFLOW = "COMFYUI_WORKFLOW", @@ -546,6 +605,10 @@ export type ClapWorkflow = { engine: ClapWorkflowEngine + category: ClapWorkflowCategory + + provider: ClapWorkflowProvider + /** * The workflow data itself * diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/aitube-clap/src/utils/index.ts index aacc3939..124e8dd5 100644 --- a/packages/aitube-clap/src/utils/index.ts +++ b/packages/aitube-clap/src/utils/index.ts @@ -9,4 +9,6 @@ export { parseOutputType } from './parseOutputType' export { parseSegmentCategory } from './parseSegmentCategory' export { parseSegmentStatus } from './parseSegmentStatus' export { parseWorkflowEngine } from './parseWorkflowEngine' +export { parseWorkflowCategory } from './parseWorkflowCategory' +export { parseWorkflowProvider } from './parseWorkflowProvider' export { UUID } from './uuid' \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseWorkflowCategory.ts b/packages/aitube-clap/src/utils/parseWorkflowCategory.ts new file mode 100644 index 00000000..62ec9e87 --- /dev/null +++ b/packages/aitube-clap/src/utils/parseWorkflowCategory.ts @@ -0,0 +1,15 @@ +import { ClapWorkflowCategory } from "@/types" + +export function parseWorkflowCategory(input: any, defaultToUse?: ClapWorkflowCategory): ClapWorkflowCategory { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(ClapWorkflowCategory).includes(unknownString as ClapWorkflowCategory)) { + return unknownString as ClapWorkflowCategory + } + + let category: ClapWorkflowCategory = defaultToUse || ClapWorkflowCategory.IMAGE_GENERATION + + return category +} \ No newline at end of file diff --git a/packages/aitube-clap/src/utils/parseWorkflowProvider.ts b/packages/aitube-clap/src/utils/parseWorkflowProvider.ts new file mode 100644 index 00000000..4603777b --- /dev/null +++ b/packages/aitube-clap/src/utils/parseWorkflowProvider.ts @@ -0,0 +1,15 @@ +import { ClapWorkflowProvider } from "@/types" + +export function parseWorkflowProvider(input: any, defaultToUse?: ClapWorkflowProvider): ClapWorkflowProvider { + + let unknownString = `${input || ""}`.trim() + + // the "normal" case + if (Object.values(ClapWorkflowProvider).includes(unknownString as ClapWorkflowProvider)) { + return unknownString as ClapWorkflowProvider + } + + let provider: ClapWorkflowProvider = defaultToUse || ClapWorkflowProvider.NONE + + return provider +} \ No newline at end of file From ace61251f2b42713db1d296a2de170f45c7f7dcd Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 17:36:16 +0200 Subject: [PATCH 296/346] 0.1.3 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index cac769aa2dee64910af1d533eaa8ce1cd459a521..82d21d5d6a8447810df866d27d31136b5727eb30 100755 GIT binary patch delta 418 zcmV;T0bTyni2>7z0gx^r>Fs0SID8wrGmC!rn5NJ@@ksDX&hu})?L zlXMC+v*-j+2muz8VFM?VU=5f743l94CzBu!7?X4gD6?P=Ed@X=-JtTiz{ti0To^>C z%=}~l!Ha@;xh-P+EJiRnD;*=fxRhcKr777|W52&?7#J&Heq=^`$A^MmXF=(0mmSjZt*=)Su61L7^ zeI6p0cW;}H)mns}x#OxUXp?;($ba6`(USc{wm|95STZXjJfv#|WC4#6rQW+h&X17D z+mc%MR^0)IU0`;=4HgxxlM!w8zSdq?!F59_h(jdQF_8fP009905B>oF04o3h00000 z0000000hZ&(H~(r;Cwa?KqrU(es*Af8A3yUKEWEsa%5?{WA z`!+}C?ck{yAzTiBUtNDZJ;6e=-5@~_0W-57G2;gVGcGW*1v$3~0Wy=lLe7)%IUtj( MLl^-wv&2IW0iGkY`v3p{ delta 416 zcmV;R0bl;pi2>7z0gx^rUN1u8gQf$oMCAA?d7!h$QrIbi66;5h-G|z#0hZC+u})?L zle7#pv*-j+2mut6VFM?VU=5g)bOKs|L7$hxaXWx`m1pTDc5 zrjz~Z$3?+r%@TLSGT!4h!V-+jFKDx3oB_=ZjIWa=K1q?b1vHyalVcm}*|Jy0OtZ}s za0@`%?>HUEgGX^YQOzyT0Ulg=kO61CyEIBqJ$BGN?21weISE@Bg9$L0hG@?i$GOD3 z%%4|6-$~g78g~2a19 Date: Thu, 8 Aug 2024 17:37:14 +0200 Subject: [PATCH 297/346] 0.1.3 --- packages/aitube-engine/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-engine/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 38769008567343970a7700a70dcfbb8b7224890b..d068f4521898fb1acbc96c60bc2f00461881d75b 100755 GIT binary patch delta 418 zcmV;T0bTyni2>7z0gx^r>Fs0SID8wrGmC!rn5NJ@@ksDX&hu})?L zlXMC+v*-j+2muz8VFM?VU=5f743l94CzBu!7?X4gD6?P=Ed@X=-JtTiz{ti0To^>C z%=}~l!Ha@;xh-P+EJiRnD;*=fxRhcKr777|W52&?7#J&Heq=^`$A^MmXF=(0mmSjZt*=)Su61L7^ zeI6p0cW;}H)mns}x#OxUXp?;($ba6`(USc{wm|95STZXjJfv#|WC4#6rQW+h&X17D z+mc%MR^0)IU0`;=4HgxxlM!w8zSdq?!F59_h(jdQF_8fP009905B>oF04o3h00000 z0000000hZ&(H~(r;Cwa?KqrU(es*Af8A3yUKEWEsa%5?{WA z`!+}C?ck{yAzTiBUtNDZJ;6e=-5@~_0W-57G2;gVGcGW*1v$3~0Wy=lLe7)%IUtj( MLl^-wv&2IW0iGkY`v3p{ delta 416 zcmV;R0bl;pi2>7z0gx^rUN1u8gQf$oMCAA?d7!h$QrIbi66;5h-G|z#0hZC+u})?L zle7#pv*-j+2mut6VFM?VU=5g)bOKs|L7$hxaXWx`m1pTDc5 zrjz~Z$3?+r%@TLSGT!4h!V-+jFKDx3oB_=ZjIWa=K1q?b1vHyalVcm}*|Jy0OtZ}s za0@`%?>HUEgGX^YQOzyT0Ulg=kO61CyEIBqJ$BGN?21weISE@Bg9$L0hG@?i$GOD3 z%%4|6-$~g78g~2a19 Date: Thu, 8 Aug 2024 17:38:37 +0200 Subject: [PATCH 298/346] 0.1.4-1 --- packages/broadway/bun.lockb | Bin 33915 -> 33915 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 3fad03e9740953d62939c6a7fe38576f368d24cf..98d999f91ad96c979ee7ad469b9ef2434ba0b130 100755 GIT binary patch delta 528 zcmV+r0`L9%hyweF0+22ssRJGRL?{P@3Y6{^pY6A$j2d1;V}(UKzu8dagWl}Ku}+2w zlN1Ovvj_@M2muz80R|_NfD)Ji43hx{C$m5k7zmRT2q=?)8yJ%m2q=?41_-mr8}$l6 zE#08ZB1zZ?JsLcFi0l|xcc)2ZN{47Q=IpfGxopi;^Rlw=fokL~&zPG=cZ?&)K zBPyk7vJ{BwKEtC zKm-BEO}u+j$g2ZP7Q_hnR=y|XiC{GNmWi@0KhUIs;ccRc3hp#xA^{2EJuKGlBlMa5 z-??yICB4d46i9C>50ec)7(mH%(H~(r;Cwa?KqrU(es*Af8A z3yUKEWXDkwU%rI{};HeoQTn>L1cFvQLeIc{cccTjdGm}An SAd{Da7XdSqp>!XU&V#M~&E*dO delta 518 zcmV+h0{Q*>hyweF0+22s3!_6IknW#xY0B}Nf|@v;YlWd6atr-<{_z?{BE=#Qu}+2w zlhhG3vj_@M2mut60R|_NfD)LKlnp4eKob}UlNbyzlZYD-lNbyzv&b9u3P3$|6v(=( zM`glTfSc>UFX3Y|J#4_IFHo_8&%P(lNVw?fZ4UDgoB|b@!wgohsPm^OC z>)Enb#!R#QCU6Tt+V40W$b(05J5kLo&;cG?d5{5Ty}L9@Pd#?fJ?x572{{Q{7=sBg zn1*Q27{|H9yv(0hLf=W*1R8ex>;riKldUqyK;!DWKbUt)l5uDk?a(~wZoZ|M#;S)x zYueV~C7P+OnDr`;lg$^|`?Iw(7z;pp2cQ~o z@yVC*mc#|Z?BH7KzZ~b|-apAfw+6WsBG_3B$FM2sD0|M#`7Z4lR()IHn?+=s28;X$ z2O>y6^d6Rz4L=w_P<<8GK*XzfCFBdUDFQ*jMU49UC$L000~S000gE0Dx06Po0B>M1T+h zFfK7JGP8kPsR{uyvnyx*1p_iJF|#afw+R6-ljL^JlObs#v(tB@3zH&tAd{AZ7?UD) IAd}96t#u^k6#xJL diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 32c310bd..af209e8f 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3-1", + "version": "0.1.4-1", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.1.2", - "@aitube/colors": "0.1.2" + "@aitube/clap": "0.1.3", + "@aitube/colors": "0.1.3" }, "repository": { "type": "git", From 5d7061efc9c0e4c62666a7db25a03548d5d49781 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 17:40:06 +0200 Subject: [PATCH 299/346] 0.1.4-1 --- packages/aitube-timeline/bun.lockb | Bin 162062 -> 160824 bytes packages/aitube-timeline/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 1fe3372cba6536dfe5708d339e27ab1654464530..33063aa9d34858a77ba2e1e56f113ea8cda030d2 100755 GIT binary patch delta 34491 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 diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 0d415611..7e5e7702 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3", + "version": "0.1.4-1", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -31,7 +31,7 @@ "vite": "^5.3.4" }, "peerDependencies": { - "@aitube/clap": "0.1.2", + "@aitube/clap": "0.1.3", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", From 552e39d622b9f37c5bff55b86b21ad8b64929be4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 17:42:42 +0200 Subject: [PATCH 300/346] 0.1.9 --- packages/aitube-clapper-services/bun.lockb | Bin 89185 -> 89187 bytes packages/aitube-clapper-services/package.json | 6 +- .../aitube-clapper-services/src/base-types.ts | 62 ------------------ packages/aitube-clapper-services/src/index.ts | 3 - .../aitube-clapper-services/src/settings.ts | 53 +++++++-------- .../src/workflow-editor.ts | 3 +- 6 files changed, 31 insertions(+), 96 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 929583f6b729c0cb3f5950c926f203f4fa8a4551..de72351c49045c3954b4b0e6916730f046136fc9 100755 GIT binary patch delta 9400 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 F`xnzj4cY(z delta 9375 zcmeHNd0Z4%wyxXINCC~FEX}^Tpa=pDG>CMIN?aOLqKG?TX|xq+>;?fh8pQ>-L~pc$ zj$0hJQBfd@IuaA3Ml{CY#4T|qlbGlvlSC&I6^-KiZdaE{X7c9!-v3iSzB={Y^_+9h zy>+SEw~xs`KPG=IIyC!OJipFAz30lt*}G0EFZ++}bhx<8D|k=Z{TsJ0n(Z!hG>!3) z)pU4poHNH+9(3n8AISV39OnvIU^eT`1swMU(vf5-Gn&hh##MT9oC16i(w!hn^Gc0| zLXOJ==fSJ}a(uzsyin%^I!(hYps#wg$IAG6UAzq`@3Dqu7|wMf!>Du0T3#{~$P1yxhi< z{F%Zvu-KGWpf_{eAtbPZ4X=W|Kazu+U&C`w|72 zBD+I44x?nrE3GccD=(O7t|&0&nf2WHP|*`*22)-+EGU`B{KIj3!bFdh&(xPP1zxrB zO_0n3t*FP^V{W2v$$Hi_B7s>XK(ZLP+l%Ai1j~nzzK}b6i|NO~y})M~$_=ce!s5A1 zaCxQ~R{0)UWeOJ*o2ytt6F8h@xf>zYzXr)VF4X56D@qIW=fDvo11(G852nB|B(MgK z^%GsTADn5t4U)NTBP1(lC^ttH8A|ncX|g;xYdhLx%~n*fK;*dFQDUu|kZeHDL$dsU z0b;AXO+Jbi)yp>&8lq;Ixrs4i{zu&FW~)S~ z1*t^cY9U!KCP+5CdPoIiQBg5QhvT-}>R+az4t;7if-&7z+hjwcSZfJ5v#=bJwUQ6X zT==6}Y<(WO=mFlGBx<)6lFf!Sw)C;dV)@lbXZ1#-KFcp0C=O|{0jglyalt8KM|Y9I z6j7rf8+)lCsUxX_e{EP&pb#B1H??UvP6=s&L>O6iKw<(}CPN~8EOQ2PTnJe}dSyB@2@jkx)P{i1}1F^}Ina?(D36RmOziKq%NeDwK>=|99jacRrh&@??j z)jg@#M?JSp+8_RnV(HwIF~-Xc>wFd_&(}gyk~EjSk4 zKMXn?Xt9Hr>}f|(Buerw@ZSU^I?xUeHD3lc42;kYcQyYuSUjshJKWU#4`8FgP}N;6 z8|+C}_R{cm2%sU>3hR8-{5h~eR+iqB$s7IKZ zZv?|wTjZ2gzX!&8cd#-QLMI)}jb@?09p2O_T*JFz_=}JT1>My03a~*`5tt%t@}U>P zHS&i@h^Lp_Q+PFEK~#+OS`8*D#w2D7@%>VZ}p zgRfBU0T^Z`s|S{Vcw{}utbUwhWA+q|;7@=tU0`$XB*zz79)W5;4QuH@v6`QnpARNF zoHcnIj5XQK+N528sF<93_#`=kuxiLc`zyg%K{$mCf-O&G^&1yRo%(BJlLP6f{u+L5 zplFYrjfL!kKzadrK|$0hN+Zh(qN5;|2ho*L8vaHQ$FTq+R*ggZ^YBvhC16@G z*b}Pe4}c|s+0k_Yh!Pt^?@Be_FXWeb`C!bqR?YZUuu)s(nXET;3e(8O z_ok!5H2euHT}*#5uI>B0@Q_k1%kD#+A~pOnB;rK^Ct?=zZ`qjK8a`iuiO%rwSM$B` z_7X!9>XHexK2}S5()L&_U*1=86PuuKgE40l>Y-GVhqOLUOSH5d_j#08X~{)8Ql;hn zB1PlH**}%GBWEM!EQy!-v5{&$Gcsv#CptQ$9({$HYpx9qwvUMC+5ZWHW8Yy@T?}S`tb};+{+E zaX(1glePSvIMFwlg8kK`A00VR%dc07p761*gCEoOfm-58`4lb5p(9hY{3=X0HVRmP z&@l8{w?sqsP1G9Syv1tTVAY;WYBhvR(>97FVRby6uE0MbZ1Yp z{A7ATqmjRf1dTQ8uhJ7AgeYa**|E7OuLqk>Gow=E|G-l;RbVBIz}uXKGUjKHn$HJg z!vrV!sO4M1GU%E?De`adG?-o*GKdVK7t%EHStx|g(^BLI@PuCR^v#Q>2)uBiWLgSe ziYGP;#C5_BAtMfW7Up0U*eljN#+tw;ykOnng;_7yI-+M2E6g z8o+*TuhqpO;Sj9{X$y%wyrG zfM#39FC}y25r9=ZYLl&y?D{R~fb=$iDR>HC7n7|1I{-^R4Y2Dp8!bEfl}=4vGTZ^j zmVk`I_Wuo%{|3o_43a_P*4YnEt?)d5V*hac>4}zYr}qDTH+}Za`|0l%UFu$WChjk{ z6Hj+veR06dmi*t5ON!NpXfMskbw}m#o5#=s|G(dC&N-LSqL^6bJb0&e){Px+9(R~p zpBrJ{J2-O?ADbulvZPY6KW9H_I;_s?IhG*b5`p6lPH>9fi*4tX_{+)H_7V`uW2y}RE2e$OkD zKOd9muwuRM@R_b{H|8EoHD#ph9(p%-W`0(3F82LtwWE)x1^lsh<&f|8=7m)mH(-Vl zuFI_pGL`}8yQk9NmQQztunq*SYh1EJTj)u<5p??Fr3YJa3UYJAQFe_;KLLK%K z>%c~oE9hDDK8bpuzfQ2F^K@hi?LfV~6$+X#Uq`0V+WD|=u7Z9AmP=z7z`jZa^;)bW zd9)tv7+B^a9VwsuUbJ5*67F#`WWmy*ffid80bC=?3<^cidr3+ zO()gDzWMM3+AN{R7sEcVz$H3jq=qH1ZvpHBn?rr!rKE+ZH(N){bkc0t2i68wLHT0X zw+O8i>qsR%4mP3&t(53UH8qsLKCnw*^Qmts?6bg2r8=^Zwu4QqRnRD-j?~aLsPfaOcV{*q|)+`Bz4C-vS_->tBr;-9Sz;T@k`E$*4U z>*+`8zp9VkAo?q}`^Ro>*|Mt2XYkmCUe^bo*>;cKQ{Q*P+$RoFARq^6?JK7aImVI@`QpciqgE?46h8G{irIe&p)7 z-pyVieGGl82R@cik6q)CNKfu}l*_#EQ3!iOAC}O$KZ6yPzHn~z#%H*e9fyrF8q>0! zy6>}ZiP-lVQAl6UM)hI&9=rAs)Z(R&SNB`C9DWp=s<*y=IPMxGdoi(>Uy&{Cx-E^p zL1);~ZrIY;R^CiIz8E7vh$jcy>vlLf(K7P(A7y&BOJEzAg#g=tECrSU?A>|*Xao)c zhk+)5y{xwbZvwl3-2mGeybf#xUIo}r!vfR-6~J6-xHGixay+p&=zG8!fW58X0@%KT zz2e!nVG~eKuigocU4f^w0DFhC9my7eZ731}H4qJ8H_qXI1&-}hw$fgARSC?z9l!>l z3P^yL;s9^p82EAE1P~7N0^n@!?Uprnuag>P^aLOcz_yk%0mVQ*kO#a1Oa_Jm6M<}C zJTMLz35)=S1A_tVjM=|XY@^9GuXu30zDmeT^y}}kNgUOF?`x;xxRxp3cXK2oXu-n) z!Eq=oeRljXVra{UH_d(B$@JLh*l1+UqfHNe$r^g`p|AgTbcjF8rieLxPrTeY1f`Or zV`CDc-Hzryu?a&+7D5O6LdCr$1DQgUT_~uQR}3I+gf) z$(hX)?`B;@CiI9-fG=t2V_&j@8gXAwXLtJgOD7)E2S}7vp)9oCOTX*%O^}XSq_3Gw zw*=M`CmqH}-#d|$h?=oDuA!G7`T9$TJ<>;0n-<7_K-(Vs21x6m^l|m)p7VQ9%QGeQ z>+-|vEukxue(=nXFx9<-P+K}QioCkh)G@nxD$^)Bj%oaWHat@WNM}0ICstd($Y1SE zuXJSuNQXl^XU(ms?wS&a0`MKI=I(gYuBS@beQ&CK7ANbcq!~~n=(!&o1~~#J(vO~e zu9O}0qjgxC(V_{zQv7UmKXNA?Q)2+2(NP1E2$Ea@TQ{3u*~bb{g5*6-0G z>r9HIfZwbc6OGka2&FDhl(NQ9+WSeItTmKQev*+W9Y}qXRWN_-s)$8s4h~`pN=Hz; z9#$2Ob3Lc9s&4IQQy9I4hW3Qfhfn%B-47E#?!OvF`~7szvACyr2C)7gp48>(_yFku z>hrEkjS=yRH>}NAE%~q)UGP*HAe~%2_R!DnioeugEf9|>&+Y6@4?k7<{%-~1g=sP} zhHMlL$}k|?gwJKfm+TjQg7BA4rM$bs(oY@w(^@pDj*eAFCvoS50d^=Looh9A8TxrY zU9<)T*vy85?+RIR;w4nsk(Xs%5yA&{MCtF?SF|zW4|^UwXl^R@B%0Ki=tMZxv-PwJL@MrF140lKte_n}6+5h8*jv zm&9!p+8oFXvR&xajbz%~LmGuO-O%C5DABA3M_e{8d;anys}tgqG5Y6)cTs@c6h39* zw(y`EsU=N9r6ZbpBz)$G%F>bCKQ)VKkHW(_sEja6MkEFZJ$MpH1_)Z7`0@h=h=)EC zg*;I5M3@iZFCEpT_rLkIX4O=88F7T~u@$mx6AtmDTGl647|atTzY{CB6Ow}jozsh9 zPSC?<1yWmP1mC}PD;TTOBKR~3<0qZv=@uV}Pgj=okdc0vhwQ2qE;&Jg%fekJXm?ZS z;Y>nho5F-dXOiJ59SQO-^PU`uUbx$x+)fY`xQ%(t^lA`Vok=>sANw0de-z{{Br;r% zQDjs)yxaA}dFyxYTuFvP$ zvcH%ca~xW-*AOgh7G8D5u>7VOYPNc86%M*t`_E;fNqFQ+GX13!#y@>=t@^!bRRvb7 zt;N>}D5rwCtXb&xb7j@9S%P#(=4EtuJ_M5p9%}z zp{;ZdIeg0J+|rB7UjMm(htPxqBtp2z%83Vj$ypUvnkcT%tc%IQb5_nGT=qaY z=>T-V%JdJ_*=y>4Zm&(q^dPz9su1dhkiLqoV>AZcS}h%^mwUigQM|~UBP{Jsq|6to zTH#&Ke{bl4P~YQ4*Q8T%is{OwK!VW<~Lm!%978a;@TqzF5`$gWWL?qb9U zU8*6)hjrbhADfKoY%iAI+d1A{FnE*Tn&eRN2MeEO&;NbS{t(|`;4W}UtxvY=bIVVqOoR`?aB*Dw6sv6Q=0k?c?673FX8Mv=p2W7w!$}bq-PY0w;znxJ(d9Gdv7dEV ze_2v&C@wIT78zy~8Vak86(#z-(h@^~$!Ps;Mwy|&SYRwRn#{Hz%;1Lw>~|JXWqBt2 zw!@e|OJ7hPh2OZ$EH#=+@`?@f^vEioDU~*qlo?Is5-Zi4%k_osgY$}ujRgbdR2T|o zM-`hYgs#5CU+B}1xCymt5+IbRh=Y(3hZn~Dc=A%KQAO;D@KqA=7OuyW@xmPqNfVIR zO^8#GVM1F1NoyS*L%N9In@COyJ=93Nnn*Ol^<>65$?>3|Nc7 zg6~A)-|97x9FVm}rViN!OB`DVXi1cu#I;TvMsmF& K+a{CU void setStabilityAiApiKey: (stabilityAiApiKey?: string) => void - setAssistantProvider: (assistantProvider?: ComputeProvider) => void - setImageProvider: (imageProvider?: ComputeProvider) => void - setImageDepthProvider: (imageDepthProvider?: ComputeProvider) => void - setImageSegmentationProvider: (imageSegmentationProvider?: ComputeProvider) => void - setImageUpscalingProvider: (imageUpscalingProvider?: ComputeProvider) => void - setVideoProvider: (videoProvider?: ComputeProvider) => void - setVideoDepthProvider: (videoDepthProvider?: ComputeProvider) => void - setVideoSegmentationProvider: (videoSegmentationProvider?: ComputeProvider) => void - setVideoUpscalingProvider: (videoUpscalingProvider?: ComputeProvider) => void - setVoiceProvider: (voiceProvider?: ComputeProvider) => void - setSoundProvider: (soundProvider?: ComputeProvider) => void - setMusicProvider: (musicProvider?: ComputeProvider) => void + setAssistantProvider: (assistantProvider?: ClapWorkflowProvider) => void + setImageProvider: (imageProvider?: ClapWorkflowProvider) => void + setImageDepthProvider: (imageDepthProvider?: ClapWorkflowProvider) => void + setImageSegmentationProvider: (imageSegmentationProvider?: ClapWorkflowProvider) => void + setImageUpscalingProvider: (imageUpscalingProvider?: ClapWorkflowProvider) => void + setVideoProvider: (videoProvider?: ClapWorkflowProvider) => void + setVideoDepthProvider: (videoDepthProvider?: ClapWorkflowProvider) => void + setVideoSegmentationProvider: (videoSegmentationProvider?: ClapWorkflowProvider) => void + setVideoUpscalingProvider: (videoUpscalingProvider?: ClapWorkflowProvider) => void + setVoiceProvider: (voiceProvider?: ClapWorkflowProvider) => void + setSoundProvider: (soundProvider?: ClapWorkflowProvider) => void + setMusicProvider: (musicProvider?: ClapWorkflowProvider) => void setCensorNotForAllAudiencesContent: (censorNotForAllAudiencesContent?: boolean) => void diff --git a/packages/aitube-clapper-services/src/workflow-editor.ts b/packages/aitube-clapper-services/src/workflow-editor.ts index 67d72650..0c34149d 100644 --- a/packages/aitube-clapper-services/src/workflow-editor.ts +++ b/packages/aitube-clapper-services/src/workflow-editor.ts @@ -1,7 +1,6 @@ import { ClapWorkflow } from "@aitube/clap" import { VersionControls, VersionState } from "./version-control" -import { Workflow } from "./base-types"; export type WorkflowEditorTheme = { bgColor?: string; @@ -19,7 +18,7 @@ export type WorkflowEditorTheme = { } export type WorkflowEditorState = { - availableWorkflows: Workflow[] + availableWorkflows: ClapWorkflow[] } & VersionState export type WorkflowEditorControls = { From 68510620ed00cad8a2aed1c1abf0fe5b2f90b790 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 23:36:50 +0200 Subject: [PATCH 301/346] 0.1.10 --- packages/aitube-clapper-services/package.json | 2 +- .../aitube-clapper-services/src/settings.ts | 84 +++++++------------ 2 files changed, 29 insertions(+), 57 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 46cd1123..4ba93375 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.9", + "version": "0.1.10", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts index 72b44e73..304a3488 100644 --- a/packages/aitube-clapper-services/src/settings.ts +++ b/packages/aitube-clapper-services/src/settings.ts @@ -26,20 +26,6 @@ export type SettingsState = { broadcastObsServerPort: number broadcastObsServerPass: string - // ------------- WORKFLOW EXECUTION PROVIDERS --------------- - assistantProvider: ClapWorkflowProvider - imageProvider: ClapWorkflowProvider - imageDepthProvider: ClapWorkflowProvider - imageSegmentationProvider: ClapWorkflowProvider - imageUpscalingProvider: ClapWorkflowProvider - videoProvider: ClapWorkflowProvider - videoDepthProvider: ClapWorkflowProvider - videoSegmentationProvider: ClapWorkflowProvider - videoUpscalingProvider: ClapWorkflowProvider - voiceProvider: ClapWorkflowProvider - soundProvider: ClapWorkflowProvider - musicProvider: ClapWorkflowProvider - // -------------- SAFETY CHECKER ------------------ censorNotForAllAudiencesContent: boolean @@ -54,20 +40,20 @@ export type SettingsState = { videoNegativePrompt: string - assistantModel: string - assistantTurboModel: string - imageGenerationModel: string - imageGenerationTurboModel: string - imageUpscalingModel: string - imageDepthModel: string - imageSegmentationModel: string - videoGenerationModel: string - videoUpscalingModel: string - videoDepthModel: string - videoSegmentationModel: string - soundGenerationModel: string - voiceGenerationModel: string - musicGenerationModel: string + assistantWorkflow: string + assistantTurboWorkflow: string + imageGenerationWorkflow: string + imageGenerationTurboWorkflow: string + imageUpscalingWorkflow: string + imageDepthWorkflow: string + imageSegmentationWorkflow: string + videoGenerationWorkflow: string + videoUpscalingWorkflow: string + videoDepthWorkflow: string + videoSegmentationWorkflow: string + soundGenerationWorkflow: string + voiceGenerationWorkflow: string + musicGenerationWorkflow: string imageRenderingStrategy: RenderingStrategy imageUpscalingRenderingStrategy: RenderingStrategy @@ -124,20 +110,6 @@ export type SettingsControls = { setKitsAiApiKey: (kitsAiApiKey?: string) => void setStabilityAiApiKey: (stabilityAiApiKey?: string) => void - setAssistantProvider: (assistantProvider?: ClapWorkflowProvider) => void - setImageProvider: (imageProvider?: ClapWorkflowProvider) => void - setImageDepthProvider: (imageDepthProvider?: ClapWorkflowProvider) => void - setImageSegmentationProvider: (imageSegmentationProvider?: ClapWorkflowProvider) => void - setImageUpscalingProvider: (imageUpscalingProvider?: ClapWorkflowProvider) => void - setVideoProvider: (videoProvider?: ClapWorkflowProvider) => void - setVideoDepthProvider: (videoDepthProvider?: ClapWorkflowProvider) => void - setVideoSegmentationProvider: (videoSegmentationProvider?: ClapWorkflowProvider) => void - setVideoUpscalingProvider: (videoUpscalingProvider?: ClapWorkflowProvider) => void - setVoiceProvider: (voiceProvider?: ClapWorkflowProvider) => void - setSoundProvider: (soundProvider?: ClapWorkflowProvider) => void - setMusicProvider: (musicProvider?: ClapWorkflowProvider) => void - - setCensorNotForAllAudiencesContent: (censorNotForAllAudiencesContent?: boolean) => void setImagePromptPrefix: (imagePromptPrefix?: string) => void setImagePromptSuffix: (imagePromptSuffix?: string) => void @@ -146,20 +118,20 @@ export type SettingsControls = { setVideoPromptSuffix: (videoPromptSuffix?: string) => void setVideoNegativePrompt: (videoNegativePrompt?: string) => void - setAssistantModel: (assistantModel?: string) => void - setAssistantTurboModel: (assistantTurboModel?: string) => void - setImageGenerationModel: (imageGenerationModel?: string) => void - setImageGenerationTurboModel: (imageGenerationTurboModel?: string) => void - setImageUpscalingModel: (imageUpscalingModel?: string) => void - setImageDepthModel: (imageDepthModel?: string) => void - setImageSegmentationModel: (imageSegmentationModel?: string) => void - setVideoGenerationModel: (videoGenerationModel?: string) => void - setVideoDepthModel: (videoDepthModel?: string) => void - setVideoSegmentationModel: (videoSegmentationModel?: string) => void - setVideoUpscalingModel: (videoUpscalingModel?: string) => void - setSoundGenerationModel: (soundGenerationModel?: string) => void - setVoiceGenerationModel: (voiceGenerationModel?: string) => void - setMusicGenerationModel: (musicGenerationModel?: string) => void + setAssistantWorkflow: (assistantWorkflow?: string) => void + setAssistantTurboWorkflow: (assistantTurboWorkflow?: string) => void + setImageGenerationWorkflow: (imageGenerationWorkflow?: string) => void + setImageGenerationTurboWorkflow: (imageGenerationTurboWorkflow?: string) => void + setImageUpscalingWorkflow: (imageUpscalingWorkflow?: string) => void + setImageDepthWorkflow: (imageDepthWorkflow?: string) => void + setImageSegmentationWorkflow: (imageSegmentationWorkflow?: string) => void + setVideoGenerationWorkflow: (videoGenerationWorkflow?: string) => void + setVideoDepthWorkflow: (videoDepthWorkflow?: string) => void + setVideoSegmentationWorkflow: (videoSegmentationWorkflow?: string) => void + setVideoUpscalingWorkflow: (videoUpscalingWorkflow?: string) => void + setSoundGenerationWorkflow: (soundGenerationWorkflow?: string) => void + setVoiceGenerationWorkflow: (voiceGenerationWorkflow?: string) => void + setMusicGenerationWorkflow: (musicGenerationWorkflow?: string) => void setImageRenderingStrategy: (imageRenderingStrategy?: RenderingStrategy) => void setImageUpscalingRenderingStrategy: (imageUpscalingRenderingStrategy?: RenderingStrategy) => void From 216246a67254c74f685acd6b87c22375e7dc608e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 23:52:38 +0200 Subject: [PATCH 302/346] 0.2.0 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/types.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 640d20f2..93c65768 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.3", + "version": "0.2.0", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index e1077602..29ca346f 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -527,6 +527,7 @@ export enum ClapWorkflowProvider { // there are only separated for convenient, to add some semantic // to those abstract image-to-image models. export enum ClapWorkflowCategory { + ASSISTANT = "ASSISTANT", IMAGE_GENERATION = "IMAGE_GENERATION", IMAGE_FILTERING = "IMAGE_FILTERING", IMAGE_UPSCALING = "IMAGE_UPSCALING", From 9703042da1651a15510ad675e137da87b31266ae Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 23:53:39 +0200 Subject: [PATCH 303/346] 0.2.0 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 82d21d5d6a8447810df866d27d31136b5727eb30..5c0365ce65698a20a3ab51817af67d05cf20acc2 100755 GIT binary patch delta 142 zcmV;90CE4*i2>7z0gx^rA3ls8)?v=SGxCHq?t2dmc#ITpUh_8!5U+@&#hqY9u}AU_ZTGA=N)A2Fg512Qf!v&2IW0j;As*#H0l delta 144 zcmV;B0B`@(i2>7z0gx^r>Fs0SID8wrGmC!rn5NJ@@ksDX&hu} Date: Thu, 8 Aug 2024 23:54:16 +0200 Subject: [PATCH 304/346] 0.2.0 --- packages/aitube-engine/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-engine/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index d068f4521898fb1acbc96c60bc2f00461881d75b..2544fc4f9d94116a89cbdf33c2b9faaa3327e956 100755 GIT binary patch delta 142 zcmV;90CE4*i2>7z0gx^rA3ls8)?v=SGxCHq?t2dmc#ITpUh_8!5U+@&#hqY9u}AU_ZTGA=N)A2Fg512Qf!v&2IW0j;As*#H0l delta 144 zcmV;B0B`@(i2>7z0gx^r>Fs0SID8wrGmC!rn5NJ@@ksDX&hu} Date: Thu, 8 Aug 2024 23:55:49 +0200 Subject: [PATCH 305/346] 0.2.0 --- packages/aitube-timeline/bun.lockb | Bin 160824 -> 160309 bytes packages/aitube-timeline/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 33063aa9d34858a77ba2e1e56f113ea8cda030d2..f83c9bd2d31b0e38896c0b7c8ff7e4a1ff996ccf 100755 GIT binary patch delta 3947 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 oe#@r2JR@IJea-ubz79Wtva_4T0D~Qvd(} diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 7e5e7702..61dc268a 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.4-1", + "version": "0.2.0", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -31,7 +31,7 @@ "vite": "^5.3.4" }, "peerDependencies": { - "@aitube/clap": "0.1.3", + "@aitube/clap": "0.2.0", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", From 02de4074e761a54442f482cff0015b40cd24d713 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 23:56:41 +0200 Subject: [PATCH 306/346] 0.2.0 --- packages/aitube-clapper-services/bun.lockb | Bin 89187 -> 89185 bytes packages/aitube-clapper-services/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index de72351c49045c3954b4b0e6916730f046136fc9..6244445edcaf004c969da935b02132979fbb5b25 100755 GIT binary patch delta 5577 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 R)y9z7$;#K!N6D+?e*mueh5rBm delta 5604 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 4ba93375..3166d4ca 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.10", + "version": "0.2.0", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.1.3", - "@aitube/timeline": "0.1.4-1", + "@aitube/clap": "0.2.0", + "@aitube/timeline": "0.2.0", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From 6d8c9c750df7f1ebe1388e6c70101a105db95720 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 8 Aug 2024 23:58:10 +0200 Subject: [PATCH 307/346] 0.2.0 --- packages/broadway/bun.lockb | Bin 33915 -> 33915 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 98d999f91ad96c979ee7ad469b9ef2434ba0b130..558f15ab0ef50f3cc3bf967df0c7dc8d292e25df 100755 GIT binary patch delta 261 zcmey}!SuU>X@Z_YSW@1Sga-=h3#%n%LYR9NH6Q-8XtguDdNe{-t+ ze;HXLJp%>?1{omcV_;|qHu9g_-0IRGz-XWcl-b-Evz&_=#L!Onl$rdfRB7_GW-%~* Hu6Zp0x?O6Z delta 277 zcmey}!SuU>X@Z`@N@m&LE*k7DTvOhO&40UnX^&K#b8@Sz_5PayPnz$&IkM4@O`4H$ zvLJ`{ diff --git a/packages/broadway/package.json b/packages/broadway/package.json index af209e8f..52ab3c72 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.4-1", + "version": "0.2.0", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.1.3", - "@aitube/colors": "0.1.3" + "@aitube/clap": "0.2.0", + "@aitube/colors": "0.2.0" }, "repository": { "type": "git", From df6da7e371af34c4710899e35c5126df9e895da4 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 9 Aug 2024 00:29:01 +0200 Subject: [PATCH 308/346] 0.2.0-1 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 2 + .../aitube-clapper-services/src/settings.ts | 65 +++++++++++++------ 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 3166d4ca..f5272991 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0", + "version": "0.2.0-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index a5fd658a..9dd88083 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -181,6 +181,8 @@ export { } from "./tasks" export { + BaseSettings, + RequestSettings, SettingsState, SettingsControls, SettingsStore diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts index 304a3488..08fb5387 100644 --- a/packages/aitube-clapper-services/src/settings.ts +++ b/packages/aitube-clapper-services/src/settings.ts @@ -1,9 +1,9 @@ -import { ClapWorkflowProvider } from "@aitube/clap" +import { ClapWorkflow, ClapWorkflowProvider } from "@aitube/clap" import { RenderingStrategy } from "@aitube/timeline" import { ComfyIcuAccelerator } from "./base-types" -export type SettingsState = { +export type BaseSettings = { customComfyUiApiKey: string replicateApiKey: string comfyIcuApiKey: string @@ -38,22 +38,6 @@ export type SettingsState = { videoPromptPrefix: string videoPromptSuffix: string videoNegativePrompt: string - - - assistantWorkflow: string - assistantTurboWorkflow: string - imageGenerationWorkflow: string - imageGenerationTurboWorkflow: string - imageUpscalingWorkflow: string - imageDepthWorkflow: string - imageSegmentationWorkflow: string - videoGenerationWorkflow: string - videoUpscalingWorkflow: string - videoDepthWorkflow: string - videoSegmentationWorkflow: string - soundGenerationWorkflow: string - voiceGenerationWorkflow: string - musicGenerationWorkflow: string imageRenderingStrategy: RenderingStrategy imageUpscalingRenderingStrategy: RenderingStrategy @@ -91,6 +75,44 @@ export type SettingsState = { scriptEditorShowMinimap: boolean } +// Settings are serialized to the local storage, +// and we want to keep them lightweight +export type SettingsState = BaseSettings & { + assistantWorkflow: string + assistantTurboWorkflow: string + imageGenerationWorkflow: string + imageGenerationTurboWorkflow: string + imageUpscalingWorkflow: string + imageDepthWorkflow: string + imageSegmentationWorkflow: string + videoGenerationWorkflow: string + videoUpscalingWorkflow: string + videoDepthWorkflow: string + videoSegmentationWorkflow: string + soundGenerationWorkflow: string + voiceGenerationWorkflow: string + musicGenerationWorkflow: string +} + +// those settings are used for requests to the AI Assistant, +// or to resolve segments +export type RequestSettings = BaseSettings & { + assistantWorkflow: ClapWorkflow + assistantTurboWorkflow: ClapWorkflow + imageGenerationWorkflow: ClapWorkflow + imageGenerationTurboWorkflow: ClapWorkflow + imageUpscalingWorkflow: ClapWorkflow + imageDepthWorkflow: ClapWorkflow + imageSegmentationWorkflow: ClapWorkflow + videoGenerationWorkflow: ClapWorkflow + videoUpscalingWorkflow: ClapWorkflow + videoDepthWorkflow: ClapWorkflow + videoSegmentationWorkflow: ClapWorkflow + soundGenerationWorkflow: ClapWorkflow + voiceGenerationWorkflow: ClapWorkflow + musicGenerationWorkflow: ClapWorkflow +} + export type SettingsControls = { setCustomComfyUiApiKey: (customComfyUiApiKey?: string) => void setReplicateApiKey: (replicateApiKey?: string) => void @@ -165,7 +187,12 @@ export type SettingsControls = { setScriptEditorShowLineNumbers: (scriptEditorShowLineNumbers: boolean) => void setScriptEditorShowMinimap: (scriptEditorShowMinimap: boolean) => void - getSettings: () => SettingsState + /** + * Return settings that can be used for a request + * + * @returns + */ + getRequestSettings: () => RequestSettings } export type SettingsStore = From 4b76b6f7234aa83d1f1f59be4617a31fee8aa15f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 9 Aug 2024 00:31:40 +0200 Subject: [PATCH 309/346] 0.2.0-2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/types.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index f5272991..6d48f608 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0-1", + "version": "0.2.0-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/aitube-clapper-services/src/types.ts index e47c55f7..995065b2 100644 --- a/packages/aitube-clapper-services/src/types.ts +++ b/packages/aitube-clapper-services/src/types.ts @@ -2,11 +2,11 @@ import { ClapEntity, ClapMeta } from "@aitube/clap" import { TimelineSegment } from "@aitube/timeline" -import { SettingsState } from "./settings" +import { RequestSettings, SettingsState } from "./settings" import { ChatEvent, ResolveRequestPrompts } from "./base-types" export type ResolveRequest = { - settings: SettingsState + settings: RequestSettings // the reference segment to render (eg. storyboard or video) segment: TimelineSegment @@ -27,7 +27,7 @@ export type ResolveRequest = { } export type AssistantRequest = { - settings: SettingsState + settings: RequestSettings prompt: string From c5f6c3bc37829233692226714dd082f302e3a5f1 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 9 Aug 2024 20:27:33 +0200 Subject: [PATCH 310/346] 0.2.0-3 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/base-types.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 6d48f608..48e55e54 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0-2", + "version": "0.2.0-3", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/aitube-clapper-services/src/base-types.ts index 5c0f30d6..57929cec 100644 --- a/packages/aitube-clapper-services/src/base-types.ts +++ b/packages/aitube-clapper-services/src/base-types.ts @@ -78,6 +78,20 @@ export type ResolveRequestPrompts = { // the positive prompt - elements we don't want in the voice negative: string } + audio: { + // the positive prompt - elements we want in the audio + positive: string + + // the positive prompt - elements we don't want in the audio + negative: string + } + music: { + // the positive prompt - elements we want in the music + positive: string + + // the positive prompt - elements we don't want in the music + negative: string + } } export type ComfyParameter = From e3ac50156091d79c49b1aaf24bf839872b3ebabf Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 10 Aug 2024 16:47:50 +0200 Subject: [PATCH 311/346] 0.2.0-1 --- packages/aitube-engine/package.json | 2 +- packages/aitube-engine/src/index.ts | 3 ++ .../src/prompts/getBackgroundAudioPrompt.ts | 42 +++++++++++++++++++ .../src/prompts/getMusicPrompt.ts | 11 +++++ .../src/prompts/getSoundPrompt.ts | 23 ++++++++++ packages/aitube-engine/src/prompts/index.ts | 3 ++ 6 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 packages/aitube-engine/src/prompts/getBackgroundAudioPrompt.ts create mode 100644 packages/aitube-engine/src/prompts/getMusicPrompt.ts create mode 100644 packages/aitube-engine/src/prompts/getSoundPrompt.ts diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 0965ec14..357c930b 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0", + "version": "0.2.0-1", "description": "The engine powering AiTube.at and Clapper.app", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", diff --git a/packages/aitube-engine/src/index.ts b/packages/aitube-engine/src/index.ts index 93b5f2e7..bc8b0a17 100644 --- a/packages/aitube-engine/src/index.ts +++ b/packages/aitube-engine/src/index.ts @@ -4,9 +4,12 @@ export { } from './renderers' export { + getBackgroundAudioPrompt, getCharacterPrompt, getCharacterReferencePrompt, + getMusicPrompt, getPositivePrompt, + getSoundPrompt, getSpeechBackgroundAudioPrompt, getSpeechForegroundAudioPrompt, getVideoPrompt, diff --git a/packages/aitube-engine/src/prompts/getBackgroundAudioPrompt.ts b/packages/aitube-engine/src/prompts/getBackgroundAudioPrompt.ts new file mode 100644 index 00000000..1f09a70d --- /dev/null +++ b/packages/aitube-engine/src/prompts/getBackgroundAudioPrompt.ts @@ -0,0 +1,42 @@ +import { ClapEntity, ClapSegment, ClapSegmentCategory } from "@aitube/clap" + +import { getCharacterPrompt } from "./getCharacterPrompt" + +/** + * Recoonstruct an audio background from a list of active segments. + * + * This uses the ACTION, WEATHER and LOCATION fields to determine a prompt. + * + * This is useful for cases where we don't have a SOUND + * (eg. create a background audio track) + * + * @param segments + * @returns + */ +export function getBackgroundAudioPrompt( + segments: ClapSegment[] = [], + extraPositivePrompt: string[] = [] // "clear sound, high quality" etc +): string { + return segments + .filter(({ category }) => ( + category === ClapSegmentCategory.ACTION || + category === ClapSegmentCategory.WEATHER || + category === ClapSegmentCategory.LOCATION + )) + .sort((a, b) => b.label.localeCompare(a.label)) + .map(segment => { + const p = segment.prompt.toLocaleLowerCase() + + // since we are including the ACTION category, we might have some + // things like "he says:" which can create bad sound effects + // with random, weird garbled voices etc + // so we typically want to prune that + if (p.includes('talk') || p.includes('speak') || p.includes('voice') || p.includes('says') || p.includes('shout')) { + return '' + } + return segment.prompt + }) + .filter(x => x) + .concat([ ...extraPositivePrompt ]) + .join(". ") +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getMusicPrompt.ts b/packages/aitube-engine/src/prompts/getMusicPrompt.ts new file mode 100644 index 00000000..c6071675 --- /dev/null +++ b/packages/aitube-engine/src/prompts/getMusicPrompt.ts @@ -0,0 +1,11 @@ +import { ClapSegment, ClapSegmentCategory } from "@aitube/clap" + +export function getMusicPrompt( + segments: ClapSegment[] = [] +): string { + return segments + .filter(({ category }) => category === ClapSegmentCategory.MUSIC) + .sort((a, b) => b.label.localeCompare(a.label)) + .map(({ prompt }) => prompt).filter(x => x) + .join(". ") +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/getSoundPrompt.ts b/packages/aitube-engine/src/prompts/getSoundPrompt.ts new file mode 100644 index 00000000..ec890a8c --- /dev/null +++ b/packages/aitube-engine/src/prompts/getSoundPrompt.ts @@ -0,0 +1,23 @@ +import { ClapSegment, ClapSegmentCategory } from "@aitube/clap" + +/** + * + * @param segments + * @returns + */ +export function getSoundPrompt( + segments: ClapSegment[] = [], + extraPositivePrompt: string[] = [] // "clear sound, high quality" etc +): string { + return segments + .filter(({ category }) => ( + category === ClapSegmentCategory.SOUND + )) + .sort((a, b) => b.label.localeCompare(a.label)) + .map(segment => { + return segment.prompt + }) + .filter(x => x) + .concat([ ...extraPositivePrompt ]) + .join(". ") +} \ No newline at end of file diff --git a/packages/aitube-engine/src/prompts/index.ts b/packages/aitube-engine/src/prompts/index.ts index b8764e15..40e76802 100644 --- a/packages/aitube-engine/src/prompts/index.ts +++ b/packages/aitube-engine/src/prompts/index.ts @@ -1,6 +1,9 @@ +export { getBackgroundAudioPrompt } from "./getBackgroundAudioPrompt" export { getCharacterPrompt } from "./getCharacterPrompt" export { getCharacterReferencePrompt } from "./getCharacterReferencePrompt" +export { getMusicPrompt } from './getMusicPrompt' export { getPositivePrompt } from "./getPositivePrompt" +export { getSoundPrompt } from "./getSoundPrompt" export { getSpeechBackgroundAudioPrompt } from "./getSpeechBackgroundAudioPrompt" export { getSpeechForegroundAudioPrompt } from "./getSpeechForegroundAudioPrompt" export { getVideoPrompt } from "./getVideoPrompt" From 9b2a4b8fd52b01995b3819f5486478cd6b4d88c6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 10 Aug 2024 22:21:36 +0200 Subject: [PATCH 312/346] 0.2.1 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/index.ts | 1 + packages/aitube-clap/src/types.ts | 13 ++++++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 93c65768..73271764 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0", + "version": "0.2.1", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/index.ts b/packages/aitube-clap/src/index.ts index 882c8170..0e18cb90 100644 --- a/packages/aitube-clap/src/index.ts +++ b/packages/aitube-clap/src/index.ts @@ -26,6 +26,7 @@ export { ClapCompletionMode, ClapInputField, ClapInputFieldNumber, + ClapInputFieldInteger, ClapInputFieldString, ClapInputFieldBoolean, ClapInputFieldAny, diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 29ca346f..8d513b2b 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -441,6 +441,13 @@ export type ClapInputFieldNumber = { defaultValue: number } +export type ClapInputFieldInteger = { + type: 'integer' + minValue: number + maxValue: number + defaultValue: number +} + export type ClapInputFieldString = { type: 'string' allowedValues: string[] @@ -474,6 +481,7 @@ export type ClapInputField = { description: string } & ( | ClapInputFieldNumber + | ClapInputFieldInteger | ClapInputFieldString | ClapInputFieldBoolean | ClapInputFieldAny @@ -493,10 +501,9 @@ export enum ClapWorkflowProvider { BUILTIN = "BUILTIN", CUSTOM = "CUSTOM", HUGGINGFACE = "HUGGINGFACE", // https://huggingface.co - COMFY_HUGGINGFACE = "COMFY_HUGGINGFACE", // https://huggingface.co REPLICATE = "REPLICATE", // https://replicate.com - COMFY_REPLICATE = "COMFY_REPLICATE", // https://replicate.com - COMFY_COMFYICU = "COMFY_COMFYICU", // https://comfy.icu + COMFYDEPLOY = "COMFYDEPLOY", // https://comfydeploy.com + COMFYICU = "COMFYICU", // https://comfy.icu ELEVENLABS = "ELEVENLABS", // https://elevenlabs.io KITSAI = "KITSAI", // https://kits.ai OPENAI = "OPENAI", // https://openai.com From 8773467ecd81835e54f459c497cbc4acd2ea3b9b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 10 Aug 2024 22:23:32 +0200 Subject: [PATCH 313/346] 0.2.1 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 5c0365ce65698a20a3ab51817af67d05cf20acc2..59986d3be504a1d777db6cf638937993064da226 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rZ(8Bq9aEE7PJsoAkq6bGO!;GXkT}x>czw;(irZ`~u}AncXr|;B;Yl seT?(ln6g=L-q6#inS1h9Fc2;z_ad|1AVClTF|!{rq!Ix!v&2IW0hp9OjsO4v delta 138 zcmV;50CoS7z0gx^rA3ls8)?v=SGxCHq?t2dmc#ITpUh_8!5U+@&#hqY9u}AVClTFtZ;qq!Ixzv&2IW0nKzd9RL6T diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 47606963..4fe161df 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0", + "version": "0.2.1", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.0" + "@aitube/clap": "0.2.1" }, "repository": { "type": "git", From 1388f0b1971ea09ed3c7d08c9ff0aa8f1d569e50 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 10 Aug 2024 22:29:59 +0200 Subject: [PATCH 314/346] 0.2.1 --- packages/aitube-engine/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-engine/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 2544fc4f9d94116a89cbdf33c2b9faaa3327e956..4c86478a5312d0262251c70ad1335dce4bf2d843 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rZ(8Bq9aEE7PJsoAkq6bGO!;GXkT}x>czw;(irZ`~u}AncXr|;B;Yl seT?(ln6g=L-q6#inS1h9Fc2;z_ad|1AVClTF|!{rq!Ix!v&2IW0hp9OjsO4v delta 138 zcmV;50CoS7z0gx^rA3ls8)?v=SGxCHq?t2dmc#ITpUh_8!5U+@&#hqY9u}AVClTFtZ;qq!Ixzv&2IW0nKzd9RL6T diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 357c930b..9a77b0bf 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0-1", + "version": "0.2.1", "description": "The engine powering AiTube.at and Clapper.app", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.0" + "@aitube/clap": "0.2.1" }, "repository": { "type": "git", From 6d7e58f97ed179409c8c205161469be47ca3959e Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 10 Aug 2024 22:33:39 +0200 Subject: [PATCH 315/346] 0.2.1 --- packages/broadway/bun.lockb | Bin 33915 -> 33915 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 558f15ab0ef50f3cc3bf967df0c7dc8d292e25df..c69940b22c7de2a8378274045891ee616050fba6 100755 GIT binary patch delta 257 zcmV+c0sj8`hyweF0+22sQSkU_Gn%F;73UdFyJvot4&!Jil1f#<NXhBuG$Z^Wx3IQ>*D`!g_lTvjcla_-RlTvjc Hlg@*!NyTr! delta 257 zcmV+c0sj8`hyweF0+22sR$^|XVBjDpp?et|R0E8ngTwNot3wATivi)F-(}yTu}%sb zlUNZjlZYD-lUNZjv&b6-BS84Un-%`-M;!c(2jt9T*bo_|XN6A48=w?}O=j<(H389fYOB%pU{qy@AxdwvWj_HO z8!!L>02}}S01f~EfKxJ0or8r$fDi#NE;24Kvw>Wx3IQ;)D`!g_ljL Date: Sat, 10 Aug 2024 22:36:35 +0200 Subject: [PATCH 316/346] 0.2.1 --- packages/aitube-timeline/bun.lockb | Bin 160309 -> 160240 bytes packages/aitube-timeline/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index f83c9bd2d31b0e38896c0b7c8ff7e4a1ff996ccf..900eba75d6d8952d5abc64b1e466d43e16808a62 100755 GIT binary patch delta 21160 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 Date: Sat, 10 Aug 2024 22:42:10 +0200 Subject: [PATCH 317/346] 0.2.1 --- packages/aitube-clapper-services/bun.lockb | Bin 89185 -> 89108 bytes packages/aitube-clapper-services/package.json | 6 +++--- .../aitube-clapper-services/src/settings.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 6244445edcaf004c969da935b02132979fbb5b25..8567368200d4846fc0fdca8b2ae96d704bfdf4f1 100755 GIT binary patch delta 11579 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 48e55e54..09480afc 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.0-3", + "version": "0.2.1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.0", - "@aitube/timeline": "0.2.0", + "@aitube/clap": "0.2.1", + "@aitube/timeline": "0.2.1", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts index 08fb5387..b6898b53 100644 --- a/packages/aitube-clapper-services/src/settings.ts +++ b/packages/aitube-clapper-services/src/settings.ts @@ -8,6 +8,7 @@ export type BaseSettings = { replicateApiKey: string comfyIcuApiKey: string comfyIcuAccelerator: ComfyIcuAccelerator + comfyDeployApiKey: string falAiApiKey: string modelsLabApiKey: string huggingFaceApiKey: string @@ -118,6 +119,7 @@ export type SettingsControls = { setReplicateApiKey: (replicateApiKey?: string) => void setComfyIcuApiKey: (comfyIcuApiKey?: string) => void setComfyIcuAccelerator: (comfyIcuAccelerator?: ComfyIcuAccelerator) => void + setComfyDeployApiKey: (comfyDeployApiKey?: string) => void setHuggingFaceApiKey: (huggingFaceApiKey?: string) => void setModelsLabApiKey: (modelsLabApiKey?: string) => void setFalAiApiKey: (falAiApiKey?: string) => void From 2df2dc3287db55c1f25e6f8ebf4e072d50b3263d Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 00:53:34 +0200 Subject: [PATCH 318/346] 0.2.1 --- packages/aitube-client/bun.lockb | Bin 19099 -> 19099 bytes packages/aitube-client/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 5d5d5aeec18388197fc46a4bc608ff60b66e691f..7fc6c38c83cda9d5b6dac1df48a1fb7d42d809a1 100755 GIT binary patch delta 424 zcmV;Z0ayN;l>wWT0gx^rfGopXOBB5@fpZ5bV`AJnYgOp*akwWFC z%=}~l!Ha@;xh-P+EJiRnD;*=fxRhcKr777|W52&?7#J&Heq=^`$A^MmXF=(0mmSjZt*=)Su61L7^ zeI6p0cW;}H)mns}x#OxUXp>zc$ba6`(USc{wm|95STZXjJfv#|WC4#6rQW+h&X17D z+mc%MR^0)IU0`;=4HgxxlM!w8zSdq?!F59_h(jdQF_8fP009905B>oF051Rl00000 z0000000aPrdyNm_Nbs!Y!hcAUGTZnenNw(nH;?jf$stiORH4>AncXr|;2CsbczulX z+nBOhaNf|wWT0gx^rN=fS2MfM_r-1+PsXikW?HUaP;RWmq2cokJx4cg3?u}-E1 zlk^QVvnU2o2mut6p#vwApbnUmvHUEgGX^YQOzyT0Ulg=kO61CyEIBqJ$BGN?21weISE@Bg9$L0hG@?i$GOD3 z%%4|6-$~g78g~2a19HIoSgGA=Q*%|5pY0Wgz=NX`K Date: Sun, 11 Aug 2024 01:52:03 +0200 Subject: [PATCH 319/346] 0.2.1-1 --- packages/aitube-timeline/package.json | 2 +- .../components/controls/TimelineControls.tsx | 3 - .../src/compute/computeContentSizeMetrics.ts | 11 ++-- .../aitube-timeline/src/hooks/useTimeline.ts | 55 ++++++++++++------- packages/aitube-timeline/src/index.tsx | 3 +- .../aitube-timeline/src/types/timeline.ts | 5 +- .../src/utils/getDefaultState.ts | 7 +-- packages/aitube-timeline/src/utils/index.ts | 3 +- .../src/utils/timelineSegmentToClapSegment.ts | 30 ++++++++++ 9 files changed, 80 insertions(+), 39 deletions(-) create mode 100644 packages/aitube-timeline/src/utils/timelineSegmentToClapSegment.ts diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 0f2ad5b5..b9a1572e 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.1-1", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx index cad134a8..875b30ae 100644 --- a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx +++ b/packages/aitube-timeline/src/components/controls/TimelineControls.tsx @@ -30,7 +30,6 @@ export function TimelineControls({ // or maybe the useFrame, but it doesn't resize immediately useFrame(({ gl, scene, camera }) => { let { - clap, cellWidth, scrollX, scrollY, @@ -41,8 +40,6 @@ export function TimelineControls({ leftBarTrackScale, topBarTimeScale, resizeStartedAt, - width, - height, cursorTimestampAtInMs, } = useTimeline.getState() diff --git a/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts b/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts index 772b1839..4ed62565 100644 --- a/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts +++ b/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts @@ -1,4 +1,4 @@ -import { ClapProject, ClapTracks } from "@aitube/clap" +import { ClapMeta, ClapTracks } from "@aitube/clap" import { ContentSizeMetrics } from "@/types/timeline" @@ -6,13 +6,13 @@ import { computeCellHeight } from "./computeCellHeight" import { DEFAULT_COLUMNS_PER_SLICE, DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS, NB_MAX_SHOTS, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants/grid" export function computeContentSizeMetrics({ - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, totalDurationInMs, }: { - clap?: ClapProject + meta: ClapMeta tracks: ClapTracks cellWidth: number defaultSegmentDurationInSteps: number @@ -28,9 +28,8 @@ export function computeContentSizeMetrics({ // TODO: compute the exact image ratio instead of using the media orientation, // since it might not match the actual assets - const defaultMediaRatio = clap ? ( - (clap.meta.width || 896) / (clap.meta.height || 512) - ) : 1.75 + const defaultMediaRatio = + (meta.width || 896) / (meta.height || 512) // also storyboards and videos might have different sizes / ratios const defaultPreviewHeight = Math.round( diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index d10087ee..3615c029 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -5,7 +5,7 @@ import { ClapProject, ClapSegment, ClapSegmentCategory, isValidNumber, newClap, import { TimelineSegment, SegmentEditionStatus, SegmentVisibility, TimelineStore, SegmentArea } from "@/types/timeline" import { getDefaultProjectState, getDefaultState } from "@/utils/getDefaultState" import { DEFAULT_DURATION_IN_MS_PER_STEP, DEFAULT_NB_TRACKS } from "@/constants" -import { hslToHex, findFreeTrack, removeFinalVideosAndConvertToTimelineSegments, clapSegmentToTimelineSegment } from "@/utils" +import { hslToHex, findFreeTrack, removeFinalVideosAndConvertToTimelineSegments, clapSegmentToTimelineSegment, timelineSegmentToClapSegment } from "@/utils" import { ClapSegmentCategoryColors, ClapSegmentColorScheme, ClapTimelineTheme, SegmentResolver } from "@/types" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" @@ -53,6 +53,8 @@ export const useTimeline = create((set, get) => ({ cellWidth, } = get() + const meta = clap.meta + // TODO: many of those checks about average duration, nb of tracks, collisions... // should be done by the Clap parser and/or serializer // send a demand to Julian (@flngr) to get it fixed! @@ -192,7 +194,7 @@ export const useTimeline = create((set, get) => ({ } set({ - clap, + meta, segments, entities: clap.entities, entityIndex: clap.entityIndex, @@ -210,7 +212,7 @@ export const useTimeline = create((set, get) => ({ finalVideo, ...computeContentSizeMetrics({ - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -222,11 +224,22 @@ export const useTimeline = create((set, get) => ({ // as this will trigger various stuff in the parent get().jumpAt(0) }, + getClap: async (): Promise => { + const { meta, entities, segments: timelineSegments } = get() + + const clap = newClap({ + meta: { ...meta }, + entities: [...entities], + segments: timelineSegments.map(ts => timelineSegmentToClapSegment(ts)) + }) + + return clap + }, setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => { const { minHorizontalZoomLevel, maxHorizontalZoomLevel, - clap, + meta, tracks, defaultSegmentDurationInSteps, cellWidth: previousCellWidth, @@ -244,7 +257,7 @@ export const useTimeline = create((set, get) => ({ resizeStartedAt, isResizing, ...computeContentSizeMetrics({ - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -557,7 +570,7 @@ export const useTimeline = create((set, get) => ({ }, toggleTrackVisibility: (trackId: number) => { const { - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -566,7 +579,7 @@ export const useTimeline = create((set, get) => ({ set({ ...computeContentSizeMetrics({ - clap, + meta, tracks: tracks.map(t => ( t.id === trackId ? { ...t, visible: !t.visible } @@ -648,7 +661,9 @@ export const useTimeline = create((set, get) => ({ // some extra text to append to the file name extraLabel?: string } = {}) => { - const clap = get().clap || newClap() + const { getClap } = get() + + const clap = await getClap() const blob = await serializeClap(clap) @@ -728,7 +743,7 @@ export const useTimeline = create((set, get) => ({ triggerChange?: boolean }): Promise => { const { - clap, + meta, cellWidth, defaultSegmentDurationInSteps, totalDurationInMs, @@ -767,7 +782,7 @@ export const useTimeline = create((set, get) => ({ allSegmentsChanged: previousAllSegmentsChanged + 1, atLeastOneSegmentChanged: previousAtLeastOneSegmentChanged + 1, ...computeContentSizeMetrics({ - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -787,7 +802,7 @@ export const useTimeline = create((set, get) => ({ }): Promise => { // adding a segment is a bit complicated, lot of stuff might have to be updated const { - clap, + meta, findFreeTrack, cellWidth, tracks, @@ -858,17 +873,19 @@ export const useTimeline = create((set, get) => ({ ? segment.endTimeInMs : previousTotalDurationInMs - clap.meta.durationInMs = totalDurationInMs - clap.segments = segments + const newMeta = { + ...meta, + durationInMs: totalDurationInMs + } set({ - clap, + meta: newMeta, segments, allSegmentsChanged: previousAllSegmentsChanged + 1, atLeastOneSegmentChanged: previousAtLeastOneSegmentChanged + 1, totalDurationInMs, ...computeContentSizeMetrics({ - clap, + meta: newMeta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -891,7 +908,7 @@ export const useTimeline = create((set, get) => ({ fitSegmentToAssetDuration: async (segment: TimelineSegment, requestedDurationInMs?: number): Promise => { const { - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -1031,7 +1048,7 @@ export const useTimeline = create((set, get) => ({ allSegmentsChanged: previousAllSegmentsChanged + 1, atLeastOneSegmentChanged: previousAtLeastOneSegmentChanged + 1, ...computeContentSizeMetrics({ - clap, + meta, tracks, cellWidth, defaultSegmentDurationInSteps, @@ -1045,7 +1062,6 @@ export const useTimeline = create((set, get) => ({ allSegmentsChanged, atLeastOneSegmentChanged, silentChangesInSegment, - clap } = get() const deletables = new Set(ids) @@ -1055,9 +1071,6 @@ export const useTimeline = create((set, get) => ({ return !deletables.has(id) }) - // not sure we need to do this, but let's do it anyway for consistency - clap.segments = newSegments - set({ segments: newSegments, allSegmentsChanged: 1 + allSegmentsChanged, diff --git a/packages/aitube-timeline/src/index.tsx b/packages/aitube-timeline/src/index.tsx index 69f0304b..7e6cb1c6 100644 --- a/packages/aitube-timeline/src/index.tsx +++ b/packages/aitube-timeline/src/index.tsx @@ -64,7 +64,8 @@ export { similar, sleep, sliceSegments, - throttle + throttle, + timelineSegmentToClapSegment } from "./utils" export { diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 66d0a0c9..0df7b205 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -1,5 +1,5 @@ import * as THREE from "three" -import { ClapEntity, ClapProject, ClapScene, ClapSegment, ClapTracks } from "@aitube/clap" +import { ClapEntity, ClapMeta, ClapProject, ClapScene, ClapSegment, ClapTracks } from "@aitube/clap" import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" @@ -134,7 +134,7 @@ export type ContentSizeMetrics = { export type TimelineStoreProjectState = { - clap: ClapProject + meta: ClapMeta segments: TimelineSegment[] @@ -259,6 +259,7 @@ export type TimelineStoreModifiers = { setCanvas: (canvas?: HTMLCanvasElement) => void clear: () => void setClap: (clap?: ClapProject) => Promise + getClap: () => Promise setHorizontalZoomLevel: (newHorizontalZoomLevel: number) => void setSegments: (segments?: TimelineSegment[]) => void setLoadedSegments: (loadedSegments?: TimelineSegment[]) => void diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 760e2e1e..3bacad77 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -1,15 +1,14 @@ -import * as THREE from "three" +import { newClap } from "@aitube/clap" import { DEFAULT_NB_TRACKS, pastel, PROMPT_STEP_HEIGHT_IN_PX } from "@/constants" import { TimelineStorePreferencesState, TimelineStoreProjectState, TimelineStoreState } from "@/types/timeline" import { NB_MAX_SHOTS } from "@/constants/grid" -import { newClap } from "@aitube/clap" + // those settings will change between .clap project reloads export function getDefaultProjectState(): TimelineStoreProjectState { return { - - clap: newClap(), + meta: newClap().meta, segments: [], totalDurationInMs: 0, loadedSegments: [], diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/aitube-timeline/src/utils/index.ts index 8c230609..91776603 100644 --- a/packages/aitube-timeline/src/utils/index.ts +++ b/packages/aitube-timeline/src/utils/index.ts @@ -21,4 +21,5 @@ export { removeFinalVideosAndConvertToTimelineSegments } from "./removeFinalVide export { similar } from "./similar" export { sleep } from "./sleep" export { sliceSegments } from "./sliceSegments" -export { throttle } from "./throttle" \ No newline at end of file +export { throttle } from "./throttle" +export { timelineSegmentToClapSegment } from "./timelineSegmentToClapSegment" \ No newline at end of file diff --git a/packages/aitube-timeline/src/utils/timelineSegmentToClapSegment.ts b/packages/aitube-timeline/src/utils/timelineSegmentToClapSegment.ts new file mode 100644 index 00000000..695c4a79 --- /dev/null +++ b/packages/aitube-timeline/src/utils/timelineSegmentToClapSegment.ts @@ -0,0 +1,30 @@ +import { TimelineSegment } from "@/types" +import { ClapSegment } from "@aitube/clap" + +export function timelineSegmentToClapSegment(timelineSegment: TimelineSegment): ClapSegment { + + const segment: any = { + ...timelineSegment + } + + delete segment.scene + delete segment.startAtLine + delete segment.endAtLine + delete segment.audioBuffer + delete segment.visibility + delete segment.textures + + delete segment.isSelected + delete segment.isHovered + delete segment.isHoveredOnBody + delete segment.isHoveredOnLeftHandle + delete segment.isHoveredOnRightHandle + delete segment.isGrabbedOnBody + delete segment.isGrabbedOnLeftHandle + delete segment.isGrabbedOnRightHandle + delete segment.isActive + delete segment.isPlaying + delete segment.editionStatus + + return segment as ClapSegment +} \ No newline at end of file From 0d44b4b7a74959b0703e19cbffd376ff3b145531 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 01:54:30 +0200 Subject: [PATCH 320/346] 0.2.1-1 --- packages/aitube-clapper-services/bun.lockb | Bin 89108 -> 89625 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 8567368200d4846fc0fdca8b2ae96d704bfdf4f1..df0a1eb0aeb875490715264deab363d0d3e81b5f 100755 GIT binary patch delta 7803 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 D>9?dC diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 09480afc..8716e58c 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.1-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.2.1", - "@aitube/timeline": "0.2.1", + "@aitube/timeline": "0.2.1-1", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From ced135655db05c6b3f5d042c33c02c7787e2b120 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:15:04 +0200 Subject: [PATCH 321/346] 0.2.1-2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/settings.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 8716e58c..5b8ec663 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1-1", + "version": "0.2.1-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts index b6898b53..bb7159ca 100644 --- a/packages/aitube-clapper-services/src/settings.ts +++ b/packages/aitube-clapper-services/src/settings.ts @@ -9,6 +9,7 @@ export type BaseSettings = { comfyIcuApiKey: string comfyIcuAccelerator: ComfyIcuAccelerator comfyDeployApiKey: string + aiTubeApiKey: string falAiApiKey: string modelsLabApiKey: string huggingFaceApiKey: string @@ -122,6 +123,7 @@ export type SettingsControls = { setComfyDeployApiKey: (comfyDeployApiKey?: string) => void setHuggingFaceApiKey: (huggingFaceApiKey?: string) => void setModelsLabApiKey: (modelsLabApiKey?: string) => void + setAiTubeApiKey: (aiTubeApiKey?: string) => void setFalAiApiKey: (falAiApiKey?: string) => void setOpenaiApiKey: (openaiApiKey?: string) => void setGoogleApiKey: (googleApiKey?: string) => void From 56cd13fa23d320d355ecc3d8957b40f95c1936f9 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:17:46 +0200 Subject: [PATCH 322/346] 0.2.2 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/types.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 73271764..81e39159 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 8d513b2b..4cb8a184 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -500,6 +500,7 @@ export enum ClapWorkflowProvider { NONE = "NONE", BUILTIN = "BUILTIN", CUSTOM = "CUSTOM", + AITUBE = "AITUBE", // https://aitube.at HUGGINGFACE = "HUGGINGFACE", // https://huggingface.co REPLICATE = "REPLICATE", // https://replicate.com COMFYDEPLOY = "COMFYDEPLOY", // https://comfydeploy.com @@ -558,6 +559,9 @@ export enum ClapWorkflowEngine { GRADIO_API = "GRADIO_API", + // for any API that natively accepts OpenClap + OPENCLAP = "OPENCLAP", + // the JSON format used by ComfyUI COMFYUI_WORKFLOW = "COMFYUI_WORKFLOW", From 558cd047b77e686d61ef08fbc00a682270dab007 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:18:42 +0200 Subject: [PATCH 323/346] 0.2.2 --- packages/aitube-client/bun.lockb | Bin 19099 -> 19099 bytes packages/aitube-client/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 7fc6c38c83cda9d5b6dac1df48a1fb7d42d809a1..5370ee2a863f9552ca6f439acc959738bc724b13 100755 GIT binary patch delta 138 zcmV;50CoSHl>wWT0gx^r3rGOA`MI*0LDg7Zo=ZoAj{l?T4+m3+6=lRC5a3Pvu}&%v zlei5qv#1Z%6F?x#E=VHItAmIN7j_5QEhgzX*SqY`Jnd>^pvlRLX^%P1-Z4ErL)@D( s;OrS~^^Q-GTz{0j-@J}DmKzN1@G-N!BY6=4GP5@|R1^U+vy4d(0q^)d&j0`b delta 138 zcmV;50CoSHl>wWT0gx^rfGopXOBB5@fpZ5bV`AJnYgOp*akwWFlldyNm_Nbs!Y!hcAUGTZnenNw(nH;?jf$stiORH4>AncXr|;B;Yl seT?(ln6g=L-q6#inS1h9Fc2;z_ad{sBY6=4F|#){R1^U*vy4d(0oJWO&j0`b diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index c7fdc8b2..80e73f0a 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.1" + "@aitube/clap": "0.2.2" }, "repository": { "type": "git", From 378ff9567e3c74450e0c8596b93c35841616b251 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:19:27 +0200 Subject: [PATCH 324/346] 0.2.2 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 59986d3be504a1d777db6cf638937993064da226..f06f42148157553fc4a032b88ef21d15d5daf11b 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rZi)f#&Z9!kL*gu7Q&^pvlRLX^%P1-Z4ErL)@D( s;OrS~^^Q-GTz{0j-@J}DmKzN1@G-O9AVClTGP55sq!Ix#v&2IW0X57%cK`qY delta 138 zcmV;50CoS7z0gx^rZ(8Bq9aEE7PJsoAkq6bGO!;GXkT}x>czw;(irZ`~u}AncXr|;B;Yl seT?(ln6g=L-q6#inS1h9Fc2;z_ad|1AVClTF|!{rq!Ix!v&2IW0hp9OjsO4v diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 4fe161df..503029b0 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.1" + "@aitube/clap": "0.2.2" }, "repository": { "type": "git", From c6ba4ce1420496e20dbd180e05e45a65253d8834 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:20:28 +0200 Subject: [PATCH 325/346] 0.2.2 --- packages/aitube-engine/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-engine/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 4c86478a5312d0262251c70ad1335dce4bf2d843..7d43e9f432eb79ce15fe7f386a4ca307fa190bf6 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rZi)f#&Z9!kL*gu7Q&^pvlRLX^%P1-Z4ErL)@D( s;OrS~^^Q-GTz{0j-@J}DmKzN1@G-O9AVClTGP55sq!Ix#v&2IW0X57%cK`qY delta 138 zcmV;50CoS7z0gx^rZ(8Bq9aEE7PJsoAkq6bGO!;GXkT}x>czw;(irZ`~u}AncXr|;B;Yl seT?(ln6g=L-q6#inS1h9Fc2;z_ad|1AVClTF|!{rq!Ix!v&2IW0hp9OjsO4v diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 9a77b0bf..8c8f65c4 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "description": "The engine powering AiTube.at and Clapper.app", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,7 +19,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.1" + "@aitube/clap": "0.2.2" }, "repository": { "type": "git", From d5975692e2f5802933f96549b81f357a614457ee Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:21:11 +0200 Subject: [PATCH 326/346] 0.2.2 --- packages/broadway/bun.lockb | Bin 33915 -> 33915 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index c69940b22c7de2a8378274045891ee616050fba6..0ca97d924937f3448699aabb7117e35e769054ad 100755 GIT binary patch delta 257 zcmV+c0sj8`hyweF0+22s*nLGn=(rpgMrVb9+BVUIi5w_fFt)ly+EaPVq>eDeu}%sb zlb8`OlZYD-lb8`Ov&b6-BS0-OFo&a6wBIOl_-UAIuU(hCzS1XK(6(cM+~KFl+cEFq z?Kf^`-=P#NS;Z}_Cd4MRfKNoFlYcP~kKxa2G~bgAKNvtD%PvSF&Z~on3Kw<<+ASvO zIoG@F&phpFWT45(i)oKJ&fYOSJwx1^GT`hPZS{^%kz9Y2yx+WzHWx3IQ^+D`!g_lOlE?la_-RlOlE? Hlg@*!GT?8s delta 257 zcmV+c0sj8`hyweF0+22sQSkU_Gn%F;73UdFyJvot4&!Jil1f#<NXhBuG$Z^Wx3IQ>*D`!g_lTvjcla_-RlTvjc Hlg@*!NyTr! diff --git a/packages/broadway/package.json b/packages/broadway/package.json index b23b7a4f..c1a43295 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.1", - "@aitube/colors": "0.2.1" + "@aitube/clap": "0.2.2", + "@aitube/colors": "0.2.2" }, "repository": { "type": "git", From aeddea1a9831ae445693d5f6631d4fd8e2fa3836 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 02:22:38 +0200 Subject: [PATCH 327/346] 0.2.2 --- packages/aitube-timeline/bun.lockb | Bin 160240 -> 160240 bytes packages/aitube-timeline/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 900eba75d6d8952d5abc64b1e466d43e16808a62..a67d4aadbb2f1cf763972e3767856422df2146c3 100755 GIT binary patch delta 12099 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 delta 12354 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 Date: Sun, 11 Aug 2024 02:24:08 +0200 Subject: [PATCH 328/346] 0.2.2 --- packages/aitube-clapper-services/bun.lockb | Bin 89625 -> 89108 bytes packages/aitube-clapper-services/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index df0a1eb0aeb875490715264deab363d0d3e81b5f..fbd1c21e5500421fa03f7d941d0b2be8731056d2 100755 GIT binary patch delta 7623 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 5b8ec663..7383c20a 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.1-2", + "version": "0.2.2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.1", - "@aitube/timeline": "0.2.1-1", + "@aitube/clap": "0.2.2", + "@aitube/timeline": "0.2.2", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From d85942b9a19978585a9f18502d381477caeb0cd5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 13:05:48 +0200 Subject: [PATCH 329/346] 0.2.2-1 --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/hooks/useTimeline.ts | 8 +++++--- packages/aitube-timeline/src/types/timeline.ts | 3 ++- packages/aitube-timeline/src/utils/getDefaultState.ts | 1 + 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 2bfee69e..2981b81f 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.2-1", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 3615c029..53e7a10f 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -31,7 +31,7 @@ export const useTimeline = create((set, get) => ({ clear() - if (!clap || !Array.isArray(clap?.segments)) { + if (!clap) { console.log(`useTimeline: no clap to show`) return } @@ -195,6 +195,7 @@ export const useTimeline = create((set, get) => ({ set({ meta, + scenes: clap.scenes, segments, entities: clap.entities, entityIndex: clap.entityIndex, @@ -225,12 +226,13 @@ export const useTimeline = create((set, get) => ({ get().jumpAt(0) }, getClap: async (): Promise => { - const { meta, entities, segments: timelineSegments } = get() + const { meta, entities, scenes, segments } = get() const clap = newClap({ meta: { ...meta }, entities: [...entities], - segments: timelineSegments.map(ts => timelineSegmentToClapSegment(ts)) + scenes: [...scenes], + segments: segments.map(ts => timelineSegmentToClapSegment(ts)) }) return clap diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/aitube-timeline/src/types/timeline.ts index 0df7b205..d47dcbd1 100644 --- a/packages/aitube-timeline/src/types/timeline.ts +++ b/packages/aitube-timeline/src/types/timeline.ts @@ -5,7 +5,7 @@ import { ClapSegmentColorScheme, ClapTimelineTheme } from "./theme" import { TimelineControlsImpl } from "@/components/controls/types" import { TimelineCameraImpl } from "@/components/camera/types" import { IsPlaying, JumpAt, TimelineCursorImpl, TogglePlayback } from "@/components/timeline/types" -import { RenderingStrategy, SegmentResolver } from "./rendering" +import { SegmentResolver } from "./rendering" export enum SegmentVisibility { // the segment is visible, and the user explicitly requested to render it before the others @@ -135,6 +135,7 @@ export type ContentSizeMetrics = { export type TimelineStoreProjectState = { meta: ClapMeta + scenes: ClapScene[] segments: TimelineSegment[] diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/aitube-timeline/src/utils/getDefaultState.ts index 3bacad77..d9cf7140 100644 --- a/packages/aitube-timeline/src/utils/getDefaultState.ts +++ b/packages/aitube-timeline/src/utils/getDefaultState.ts @@ -9,6 +9,7 @@ import { NB_MAX_SHOTS } from "@/constants/grid" export function getDefaultProjectState(): TimelineStoreProjectState { return { meta: newClap().meta, + scenes: [], segments: [], totalDurationInMs: 0, loadedSegments: [], From 7cc122ed76302c9cebe2dfaa70617fdc7db3f508 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 11 Aug 2024 13:08:42 +0200 Subject: [PATCH 330/346] 0.2.2.-1 --- packages/aitube-clapper-services/bun.lockb | Bin 89108 -> 89625 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index fbd1c21e5500421fa03f7d941d0b2be8731056d2..59343a4cfb4211f219c862abbef9e48aabf441bb 100755 GIT binary patch delta 7903 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 R7rKafB5}vKOtIeYe*or0E*1a) delta 7595 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 7383c20a..60a30ec1 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.2-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.2.2", - "@aitube/timeline": "0.2.2", + "@aitube/timeline": "0.2.2-1", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From e64fb2ce1f3ece698890a7845252a16d018e37b5 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:06:33 +0200 Subject: [PATCH 331/346] 0.2.3 --- packages/aitube-clap/package.json | 2 +- packages/aitube-clap/src/types.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index 81e39159..c24adfff 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.3", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 4cb8a184..079e2077 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -500,6 +500,7 @@ export enum ClapWorkflowProvider { NONE = "NONE", BUILTIN = "BUILTIN", CUSTOM = "CUSTOM", + COMFYUI = "COMFUI", // any ComfyUI server (local or remote) AITUBE = "AITUBE", // https://aitube.at HUGGINGFACE = "HUGGINGFACE", // https://huggingface.co REPLICATE = "REPLICATE", // https://replicate.com From 8a2d8b55742a44eb1990265b7d2202bb8c669341 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:11:00 +0200 Subject: [PATCH 332/346] 0.2.3 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 7 ++++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index f06f42148157553fc4a032b88ef21d15d5daf11b..5e3bc4904bffbf3617bebdd7f57064b6415e901a 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rQ&OFNCu!MfhYs*_#$Jv-On~E7g*a7?E+0H8_hZ(&u}=SS)HO!mJo!Gm$&^+l(4hiAVClTGqWEtq!Ix$v&2IW0foUlVE_OC delta 138 zcmV;50CoS7z0gx^rZi)f#&Z9!kL*gu7Q&^pvlRLX^%P1-Z4ErL)@D( s;OrS~^^Q-GTz{0j-@J}DmKzN1@G-O9AVClTGP55sq!Ix#v&2IW0X57%cK`qY diff --git a/packages/aitube-colors/package.json b/packages/aitube-colors/package.json index 503029b0..aff82943 100644 --- a/packages/aitube-colors/package.json +++ b/packages/aitube-colors/package.json @@ -4,13 +4,14 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.3", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm run build && npm publish --access public" + "publish": "npm run build && npm publish --access public", + "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { "bun-types": "latest", @@ -19,7 +20,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.2" + "@aitube/clap": "0.2.3" }, "repository": { "type": "git", From dddfc6a0c6e05c30e58255170767ab252c2747eb Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:12:41 +0200 Subject: [PATCH 333/346] 0.2.3 --- packages/aitube-engine/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-engine/package.json | 7 ++++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 7d43e9f432eb79ce15fe7f386a4ca307fa190bf6..9429d8d5fd4df53c1779b11fd12976332bf17297 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rQ&OFNCu!MfhYs*_#$Jv-On~E7g*a7?E+0H8_hZ(&u}=SS)HO!mJo!Gm$&^+l(4hiAVClTGqWEtq!Ix$v&2IW0foUlVE_OC delta 138 zcmV;50CoS7z0gx^rZi)f#&Z9!kL*gu7Q&^pvlRLX^%P1-Z4ErL)@D( s;OrS~^^Q-GTz{0j-@J}DmKzN1@G-O9AVClTGP55sq!Ix#v&2IW0X57%cK`qY diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index 8c8f65c4..791349de 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,13 +4,14 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.3", "description": "The engine powering AiTube.at and Clapper.app", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm publish --access public" + "publish": "npm publish --access public", + "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { "bun-types": "latest", @@ -19,7 +20,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.2" + "@aitube/clap": "0.2.3" }, "repository": { "type": "git", From 9fd8042a79eb9bbc95b0b90f5f313d0e220de36c Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:13:36 +0200 Subject: [PATCH 334/346] 0.2.3 --- packages/broadway/bun.lockb | Bin 33915 -> 33915 bytes packages/broadway/package.json | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 0ca97d924937f3448699aabb7117e35e769054ad..42749859dd94430131bc6b196c3af726d78f95fe 100755 GIT binary patch delta 261 zcmV+g0s8*?hyweF0+22s^e5_ha4OWCBAUQz3oe&8Sha;{seSQhhg&gJM~9lpu}%sb zlh_V0lZYD-lh_V0v&b6-BS3Dbp3&h{8}$I|X<;OYn+a3h1l+E6p*>(;hoNH_*qTMQ zHFpqlWtFYXxqDNA^x(6##&T;@%BmN(W9&sC*|(DoKNvu%JuoArc?P)%SUU9%h(8$f z7>ud#%a|p=?aYa@+%rH{B~&GDJsitQo4|jtWbn0SWLce}PnHmbkC(UoPL!~-Wj_HO z8#4d^02}}S01f~EfKxJ0or8r$fDi#NE;24Nvw>Wx3IQ{-D`!g_0W*_9ejt;VgBJla Llc97Ulg@*!GGcEm delta 257 zcmV+c0sj8`hyweF0+22s*nLGn=(rpgMrVb9+BVUIi5w_fFt)ly+EaPVq>eDeu}%sb zlb8`OlZYD-lb8`Ov&b6-BS0-OFo&a6wBIOl_-UAIuU(hCzS1XK(6(cM+~KFl+cEFq z?Kf^`-=P#NS;Z}_Cd4MRfKNoFlYcP~kKxa2G~bgAKNvtD%PvSF&Z~on3Kw<<+ASvO zIoG@F&phpFWT45(i)oKJ&fYOSJwx1^GT`hPZS{^%kz9Y2yx+WzHWx3IQ^+D`!g_lOlE?la_-RlOlE? Hlg@*!GT?8s diff --git a/packages/broadway/package.json b/packages/broadway/package.json index c1a43295..d9cacea4 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,14 +4,15 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.3", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm publish --access public" + "publish": "npm publish --access public", + "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { "@aitube/io": "0.0.1", @@ -21,8 +22,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.2", - "@aitube/colors": "0.2.2" + "@aitube/clap": "0.2.3", + "@aitube/colors": "0.2.3" }, "repository": { "type": "git", From d6039135fdb69e6696c926a7925a769e3ea9bf63 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:14:55 +0200 Subject: [PATCH 335/346] 0.2.3 --- packages/aitube-timeline/bun.lockb | Bin 160240 -> 160755 bytes packages/aitube-timeline/package.json | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index a67d4aadbb2f1cf763972e3767856422df2146c3..49c91d3d3eac7010244db4f9c5d084edaf8847b9 100755 GIT binary patch delta 4513 zcmeH~dt8)N8pqFhm1F?9sNu}O0K=WgaTvrgE;bcjLPVu3tyQ$t#7ki$0xB~msAL2( z%7K*BOpvS%ooci)&E0Mq*=09T^W(a%f`&%8w(6$#du9%3?tc1f|J?JLXP)QzKF_(l z=RN0r&)a!Qb+JuVWr)k?b7BH52h3NCbRXBwKRY&b#nHAtXWw2hGyAb)Pi;KD>B)SB zQF(dIqoK;qbvp`e-ulQq#(WsF&7PNUn3K=ghB=IR!LOG3s6D_Z^s%Icj0J$2P`f|$ zMficxC!hyFkC1##0b~8(w}6v=7_Crz>mtU2py%bzqyeyLg^a1-#}?XO@CmVYH*ocze6KtTMr!#y>lsJVbIUR*Ff7!+}#hAdAX8jLk~ne7+Q;; zO$CFl>q;?W{?HKDth74r>udG)RQVKNeaEo0!Ld(0JJKFI+~}B;HePRUk2gA6r)GNF zBj*osOqx^btx7>%RAr6!lX3C(@mf#SAk66yP;S>xFndggmnstCcp?P@>fxp#=s|T* z;_U(282eW_Do+GPx@t|2H+#%`j-f6#Mi9v&RW|nfCgHDN1~i{b=!UWv)wkY%g++pg6_j zJS_AED;{(0wsK)%q+oBs%CH~Tr>N4GFqY-&{bZb3RSj=ikJkn7ksfa}ZaS73W|%U+ zf#)7Ic}6UN@rYq`80%Vi?pdYSQFu37F9y~le3-tZo8 z6TD&Yn0>Rs%uhNrHix&B?(SIk&ijq#;8~KBCV!mNL?F+)RBB-xO8v$izF|G_Jdz8{THF}V=qZvCAnQ0 z=MJm`ppm^S1NAa-qtu(F-U983yzS6bZqQtV&6ka8C997 zk&hkLO{;kI+lG7VE$Pi)_ln&1T|un(o_150IV)UX>Ble{UdLd zX~_LCv+ugddmyol|`s z*QQNPiQL0F?@NvRW>r#&qqNyF_k+(K4^QZ4C~(ZYT;*puY+C+YX2u6c=D+vQhcTJf zk=rkSJ0RxAk4818-?_2)C+DZTbcffcmtNiS#wUgEMrk{yd_U^K;_s4w-X7Q0)!Z+r zwAh*C$=m%b!(s}uZ~Stj^jKZ=s`N*i--u}R*?)X%!-tk9rmUFA>kc0aF|~GO{qfG0 zK?~3C&Hk5G=Uegi?t-rJQ`ft4HeV{q5>wP%Ep%!=hA$AgYW}EDYk1$xxJL(!`8jb% zH4kHsbM-qK{+6o@tv%&gdUttw$D#OVTHk5^I=N)`U$;hC$7^TAZ)&Y9tN;F+sr^@n zm3^|a;Z*9=*ovH8_qz_AFEko7`x%-QOEu_cq4=CYp%!3}7GRMm(gMT=0URe#B;tYq zT7$T+cqxcy@WtW?fmOlCNDD^BQc)fZFiZz{!S9 zTi=x-n+$m)^rU3VB*Tf#{WynuUb4Qhrw~V3E}1WEdWF!FyHqlIYCkMlnPha{8R@

#uxX&HWgZTFObwgLi;~?5TPInCWPxD2 zC<)~y7sI<2M>94ZLRVBN6V76djJHWj;M!LZ+l z&;Zs-rh}b_{#}LcI89p!#0Z-jse`5~4uw1mp|U|%4ug$T8>2?*!Du%15S-OqY@^Hz zhhG4pvPtGez{Y9Im1lib!bpH2uxS9V$;wf%lO)?JSu|J~ga*|hSq$vu5bCT^vRK$S zd@<^bmLz^G4l)b|^+ih(KW~;tmx-d@B*JTXjR(Df-w^{&a%yh0sxCJY=l10R{fzDLFiV~rlk#D3@MU~;`c+k zIpxuYC;wLa);dstE*9JfD&oP(Uv8j5@nLhztt9q)j(*y z(t@YOOpCkQ32|Q=*YJxXpq&p8&$RJS zk$Q$_NiJSH!?k#`>^;NBy48QH!MBRaHXiS_4_l8ud1DL3pWC=8sQcsepQ~r}KA2BT+OqE-vxA;E5@GVnxO9Q+oT;{-ihH) z4^_Ac1Egx}#WE!DkHmx@kk|cvJotqXUz#UYl-_Lqx;S)>=O}?ogz*QiRt4gV%77_w z)f+)LtAm@mbx(Mw=+nV_!adj~$~$g0=GEPpd+h1mt=z6}%j>?z-?_No_S4gStN8c= zPxSKt$-UzIyM*#1PZy(q2$k=m92t~t0T8$Mnc zHrDZ%(+3Wv87*DzMjp?1W_R-U28;b#CCqtun4*s3Cg+F;m6<*~Nvugy!ksM>m0f+s jp+QO?abTL#kDCeWMcI=|1y6MLpP^jy;fW$(fpX$k!Y0!@ delta 4245 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 Uw=`>6dN?03OZMk+%Vo=d01X1Aj{pDw diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 2981b81f..3801cb52 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2-1", + "version": "0.2.3", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -12,6 +12,7 @@ "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "bun run build && npm publish --access public", + "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build", "dev": "vite", "serve": "vite preview" }, @@ -31,7 +32,7 @@ "vite": "^5.3.4" }, "peerDependencies": { - "@aitube/clap": "0.2.2", + "@aitube/clap": "0.2.3", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", From aa40068c1eac61e8d0ac1c603bde265ad1614ace Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:16:33 +0200 Subject: [PATCH 336/346] 0.2.3 --- packages/aitube-client/bun.lockb | Bin 19099 -> 19099 bytes packages/aitube-client/package.json | 7 ++++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 5370ee2a863f9552ca6f439acc959738bc724b13..ad73771dedbecc24af7a7e78dcd798c5bc9864c1 100755 GIT binary patch delta 138 zcmV;50CoSHl>wWT0gx^rw&crY9GOyqo7=SS)HO!mJo!Gm$&^+l(4hCBY6=4GqX1}R1^U-vy4d(0oO-AHvj+t delta 138 zcmV;50CoSHl>wWT0gx^r3rGOA`MI*0LDg7Zo=ZoAj{l?T4+m3+6=lRC5a3Pvu}&%v zlei5qv#1Z%6F?x#E=VHItAmIN7j_5QEhgzX*SqY`Jnd>^pvlRLX^%P1-Z4ErL)@D( s;OrS~^^Q-GTz{0j-@J}DmKzN1@G-N!BY6=4GP5@|R1^U+vy4d(0q^)d&j0`b diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 80e73f0a..7bda0469 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,13 +4,14 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.2", + "version": "0.2.3", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm publish --access public" + "publish": "npm publish --access public", + "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { "bun-types": "latest", @@ -19,7 +20,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.2" + "@aitube/clap": "0.2.3" }, "repository": { "type": "git", From 8c23a9f92a364112d0400185702b038a747a9798 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Mon, 12 Aug 2024 14:18:52 +0200 Subject: [PATCH 337/346] 0.2.3 --- packages/aitube-clapper-services/bun.lockb | Bin 89625 -> 89108 bytes packages/aitube-clapper-services/package.json | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 59343a4cfb4211f219c862abbef9e48aabf441bb..5a369633b88be98dc7c26c06c10e366258c7ea2e 100755 GIT binary patch delta 7785 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 delta 8084 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 Date: Mon, 12 Aug 2024 14:52:31 +0200 Subject: [PATCH 338/346] 0.2.3-1 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/settings.ts | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 3aab2472..98f82a2c 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3", + "version": "0.2.3-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts index bb7159ca..0d25bbf8 100644 --- a/packages/aitube-clapper-services/src/settings.ts +++ b/packages/aitube-clapper-services/src/settings.ts @@ -4,7 +4,7 @@ import { RenderingStrategy } from "@aitube/timeline" import { ComfyIcuAccelerator } from "./base-types" export type BaseSettings = { - customComfyUiApiKey: string + comfyUiClientId: string replicateApiKey: string comfyIcuApiKey: string comfyIcuAccelerator: ComfyIcuAccelerator @@ -63,8 +63,9 @@ export type BaseSettings = { comfyWorkflowForSound: string comfyWorkflowForMusic: string - // ---------- MODELS FOR EACH PROVIDER -------------- + // ------------ OTHER SETTINGS ----------- + comfyUiApiUrl: string gradioApiUrlForAssistant: string gradioApiUrlForImage: string @@ -116,7 +117,7 @@ export type RequestSettings = BaseSettings & { } export type SettingsControls = { - setCustomComfyUiApiKey: (customComfyUiApiKey?: string) => void + setComfyUiClientId: (comfyUiClientId?: string) => void setReplicateApiKey: (replicateApiKey?: string) => void setComfyIcuApiKey: (comfyIcuApiKey?: string) => void setComfyIcuAccelerator: (comfyIcuAccelerator?: ComfyIcuAccelerator) => void @@ -181,6 +182,8 @@ export type SettingsControls = { setComfyWorkflowForSound: (comfyWorkflowForSound?: string) => void setComfyWorkflowForMusic: (comfyWorkflowForMusic?: string) => void + setComfyUiApiUrl: (comfyUiApiUrl?: string) => void + setGradioApiUrlForAssistant: (gradioApiUrlForAssistant?: string) => void setGradioApiUrlForImage: (gradioApiUrlForImage?: string) => void setGradioApiUrlForVideo: (gradioApiUrlForVideo?: string) => void From f61c1ed6aecba388648e41412888eeebc0df4e5b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 14 Aug 2024 13:52:12 +0200 Subject: [PATCH 339/346] 0.2.3-2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/settings.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 98f82a2c..48b4645e 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3-1", + "version": "0.2.3-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/aitube-clapper-services/src/settings.ts index 0d25bbf8..ce6fae5a 100644 --- a/packages/aitube-clapper-services/src/settings.ts +++ b/packages/aitube-clapper-services/src/settings.ts @@ -5,6 +5,8 @@ import { ComfyIcuAccelerator } from "./base-types" export type BaseSettings = { comfyUiClientId: string + comfyUiHttpAuthLogin: string + comfyUiHttpAuthPassword: string replicateApiKey: string comfyIcuApiKey: string comfyIcuAccelerator: ComfyIcuAccelerator @@ -118,6 +120,8 @@ export type RequestSettings = BaseSettings & { export type SettingsControls = { setComfyUiClientId: (comfyUiClientId?: string) => void + setComfyUiHttpAuthLogin: (comfyUiHttpAuthLogin?: string) => void + setComfyUiHttpAuthPassword: (comfyUiHttpAuthPassword?: string) => void setReplicateApiKey: (replicateApiKey?: string) => void setComfyIcuApiKey: (comfyIcuApiKey?: string) => void setComfyIcuAccelerator: (comfyIcuAccelerator?: ComfyIcuAccelerator) => void From 11c70815335755b70a6a5b7fe1ed4746c7fb2146 Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 14 Aug 2024 18:23:16 -0700 Subject: [PATCH 340/346] Migrate code to packages/app --- LICENCE.txt => LICENSE.txt | 0 package-lock.json | 42160 ++++++++-------- package.json | 209 +- .env.example => packages/app/.env.example | 0 .eslintrc.json => packages/app/.eslintrc.json | 0 .gitattributes => packages/app/.gitattributes | 0 packages/app/.gitignore | 42 + packages/app/.nvmrc | 1 + .../app/.prettierrc.json | 0 Dockerfile => packages/app/Dockerfile | 0 packages/app/LICENSE.txt | 674 + .../app/components.json | 0 .../app/forge.config.js | 0 main.js => packages/app/main.js | 0 next.config.js => packages/app/next.config.js | 0 packages/app/package-lock.json | 21714 ++++++++ packages/app/package.json | 195 + .../app/playwright.config.ts | 0 .../app/postcss.config.js | 0 .../app/public}/.gitattributes | 0 .../app/public}/carriers/README.md | 0 .../baby-names-us-year-of-birth-full.csv | 0 .../images/icons/interface/character.svg | 0 .../images/icons/interface/characters.svg | 0 .../public}/images/icons/interface/cloud.svg | 0 .../images/icons/interface/community.svg | 0 .../images/icons/interface/computer.svg | 0 .../public}/images/icons/interface/cut.svg | 0 .../images/icons/interface/downloads.svg | 0 .../public}/images/icons/interface/film.svg | 0 .../public}/images/icons/interface/hidden.svg | 0 .../images/icons/interface/image-to-image.svg | 0 .../public}/images/icons/interface/image.svg | 0 .../images/icons/interface/imagefile.svg | 0 .../images/icons/interface/interpolate.svg | 0 .../images/icons/interface/location.svg | 0 .../public}/images/icons/interface/lora.svg | 0 .../public}/images/icons/interface/misc.svg | 0 .../public}/images/icons/interface/mute.svg | 0 .../images/icons/interface/project.svg | 0 .../public}/images/icons/interface/prompt.svg | 0 .../images/icons/interface/screenplay.svg | 0 .../public}/images/icons/interface/sound.svg | 0 .../images/icons/interface/soundfile.svg | 0 .../public}/images/icons/interface/speech.svg | 0 .../public}/images/icons/interface/team.svg | 0 .../images/icons/interface/text-to-music.svg | 0 .../images/icons/interface/text-to-video.svg | 0 .../images/icons/interface/textfile.svg | 0 .../images/icons/interface/transfer.svg | 0 .../images/icons/interface/transition.svg | 0 .../public}/images/icons/interface/unpute.svg | 0 .../images/icons/interface/upscale.svg | 0 .../public}/images/icons/interface/vendor.svg | 0 .../images/icons/interface/video-folder.svg | 0 .../images/icons/interface/video-to-video.svg | 0 .../images/icons/interface/videofile.svg | 0 .../images/icons/interface/visible.svg | 0 .../public}/images/icons/segments/action.svg | 0 .../public}/images/icons/segments/camera.svg | 0 .../images/icons/segments/character.svg | 0 .../public}/images/icons/segments/depth.svg | 0 .../images/icons/segments/dialogue.svg | 0 .../public}/images/icons/segments/effect.svg | 0 .../app/public}/images/icons/segments/era.svg | 0 .../public}/images/icons/segments/event.svg | 0 .../public}/images/icons/segments/generic.svg | 0 .../images/icons/segments/interface.svg | 0 .../images/icons/segments/lighting.svg | 0 .../images/icons/segments/location.svg | 0 .../public}/images/icons/segments/mesh.svg | 0 .../public}/images/icons/segments/music.svg | 0 .../images/icons/segments/phenomenon.svg | 0 .../public}/images/icons/segments/sound.svg | 0 .../public}/images/icons/segments/splat.svg | 0 .../images/icons/segments/storyboard.svg | 0 .../public}/images/icons/segments/style.svg | 0 .../public}/images/icons/segments/time.svg | 0 .../images/icons/segments/transition.svg | 0 .../public}/images/icons/segments/video.svg | 0 .../public}/images/icons/segments/weather.svg | 0 .../app/public}/images/logos/CL.icns | Bin .../images/logos/CL.iconset/icon_128x128.png | 0 .../logos/CL.iconset/icon_128x128@2x.png | 0 .../images/logos/CL.iconset/icon_16x16.png | 0 .../images/logos/CL.iconset/icon_16x16@2x.png | 0 .../images/logos/CL.iconset/icon_256x256.png | 0 .../logos/CL.iconset/icon_256x256@2x.png | 0 .../images/logos/CL.iconset/icon_32x32.png | 0 .../images/logos/CL.iconset/icon_32x32@2x.png | 0 .../images/logos/CL.iconset/icon_512x512.png | 0 .../logos/CL.iconset/icon_512x512@2x.png | 0 .../app/public}/images/logos/CL.png | 0 .../app/public}/images/logos/clapper.png | 0 .../public}/images/logos/logo-desaturated.png | 0 .../public}/images/logos/logo-discord-2.png | 0 .../public}/images/logos/logo-discord-3.png | 0 .../app/public}/images/logos/logo-no-bg.png | 0 .../app/public}/images/logos/logo-v2.png | 0 .../app/public}/images/logos/logo-v2.xcf | 0 .../public}/images/onboarding/get-started.png | 0 .../public}/images/onboarding/get-started.xcf | 0 .../images/onboarding/pick-an-example.png | 0 .../images/onboarding/pick-an-example.xcf | 0 .../public}/images/providers/anthropic.png | 0 .../app/public}/images/providers/cohere.png | 0 .../app/public}/images/providers/comfyicu.png | 0 .../app/public}/images/providers/comfyui.png | 0 .../public}/images/providers/elevenlabs.png | 0 .../public}/images/providers/everartai.png | 0 .../app/public}/images/providers/falai.png | 0 .../public}/images/providers/fireworks.png | 0 .../app/public}/images/providers/google.png | 0 .../app/public}/images/providers/groq.png | 0 .../app/public}/images/providers/hedra.png | 0 .../public}/images/providers/huggingface.png | 0 .../app/public}/images/providers/kitsai.png | 0 .../app/public}/images/providers/kuaishou.png | 0 .../public}/images/providers/leonardoai.png | 0 .../app/public}/images/providers/lumalabs.png | 0 .../public}/images/providers/midjourney.png | 0 .../public}/images/providers/mistralai.png | 0 .../public}/images/providers/modelslab.jpeg | 0 .../app/public}/images/providers/none.png | 0 .../app/public}/images/providers/openai.png | 0 .../public}/images/providers/replicate.jpeg | 0 .../app/public}/images/providers/runwayml.png | 0 .../public}/images/providers/stabilityai.png | 0 .../app/public}/images/providers/suno.png | 0 .../app/public}/images/providers/udio.png | 0 ...ow v10 X Rewrite Bryan E. Harris 2023.clap | 0 .../public}/samples/claps/empty_project.clap | 0 .../public}/samples/claps/empty_project.yaml | 0 .../app/public}/samples/claps/test.clap | 0 .../app/public}/samples/claps/wasteland.clap | 0 .../public}/samples/scripts/Citizen Kane.txt | 0 .../app/public}/samples/scripts/DISCLAIMER.md | 0 .../scripts/Raiders of the Lost Ark.txt | 0 .../public}/samples/scripts/Rear Window.txt | 0 .../samples/scripts/Star Wars A New Hope.txt | 0 .../app/public}/samples/scripts/The Apery.txt | 0 .../public}/samples/scripts/The Goonies.txt | 0 .../samples/scripts/The Wizard Of Oz.txt | 0 .../app/public}/voices/README.md | 0 .../app/public}/wasm/MediaInfoModule.wasm | 0 .../app/public}/workers/captioning.worker.js | 0 .../src}/app/api/assistant/askAnyAssistant.ts | 0 .../api/assistant/parseLangChainResponse.ts | 0 .../app/src}/app/api/assistant/parser.ts | 0 .../api/assistant/providers/google/README.md | 0 .../api/assistant/providers/google/sample.txt | 0 .../app/src}/app/api/assistant/route.ts | 0 .../app/src}/app/api/assistant/samples.ts | 0 .../app/src}/app/api/assistant/templates.ts | 0 .../api/resolve/providers/aitube/README.md | 0 .../app/api/resolve/providers/aitube/index.ts | 0 .../providers/comfy-comfydeploy/index.ts | 0 .../resolve/providers/comfy-comfyicu/index.ts | 0 .../resolve/providers/comfy-comfyicu/types.ts | 0 .../providers/comfy-huggingface/index.ts | 0 .../providers/comfy-replicate/index.ts | 0 .../providers/comfy-replicate/runWorkflow.ts | 0 .../api/resolve/providers/comfyui/index.ts | 0 .../app/api/resolve/providers/falai/index.ts | 0 .../app/api/resolve/providers/falai/types.ts | 0 .../providers/getWorkflowInputValues.ts | 0 .../app/api/resolve/providers/gradio/index.ts | 0 .../providers/huggingface/generateImage.ts | 0 .../providers/huggingface/generateMusic.ts | 0 .../providers/huggingface/generateVideo.ts | 0 .../providers/huggingface/generateVoice.ts | 0 .../resolve/providers/huggingface/index.ts | 0 .../src}/app/api/resolve/providers/index.ts | 0 .../providers/lumalabs/getGenerations.ts | 0 .../api/resolve/providers/lumalabs/todo.ts | 0 .../api/resolve/providers/lumalabs/types.ts | 0 .../api/resolve/providers/modelslab/index.ts | 0 .../app/api/resolve/providers/openai/TODO.md | 0 .../api/resolve/providers/replicate/index.ts | 0 .../providers/stabilityai/generateImage.ts | 0 .../providers/stabilityai/generateVideo.ts | 0 .../resolve/providers/stabilityai/index.ts | 0 .../app/src}/app/api/resolve/route.ts | 0 .../app/src}/app/cute_1024x1024x32.png | 0 .../app/src}/app/cute_favicon.ico | Bin {src => packages/app/src}/app/cute_icon.png | 0 {src => packages/app/src}/app/embed/README.md | 0 {src => packages/app/src}/app/embed/embed.tsx | 0 {src => packages/app/src}/app/embed/page.tsx | 0 {src => packages/app/src}/app/favicon.ico | Bin .../app/src}/app/favicon_square.ico | Bin .../app/fonts/alarm-clock/alarm-clock.woff2 | Bin {src => packages/app/src}/app/fonts/index.ts | 0 .../app/src}/app/icon_NEXTJS_BUG.png | 0 {src => packages/app/src}/app/icon_square.png | 0 {src => packages/app/src}/app/layout.tsx | 0 {src => packages/app/src}/app/main.tsx | 0 {src => packages/app/src}/app/page.tsx | 0 .../app/src}/app/styles/globals.css | 0 .../src}/app/styles/react-reflex-custom.css | 0 .../app/src}/app/styles/react-reflex.css | 0 .../src}/components/assistant/ChatBubble.tsx | 0 .../src}/components/assistant/ChatView.tsx | 0 .../providers/ClapWorkflowProviderLogo.tsx | 0 .../providers/ClapWorkflowProviderName.tsx | 0 .../src}/components/core/providers/index.ts | 0 .../src}/components/core/providers/logos.ts | 0 .../src}/components/core/timeline/index.tsx | 0 .../app/src}/components/core/tree/README.md | 0 .../components/core/tree/chainable-map.ts | 0 .../app/src}/components/core/tree/icons.tsx | 0 .../app/src}/components/core/tree/index.tsx | 0 .../app/src}/components/core/tree/root.tsx | 0 .../app/src}/components/core/tree/roving.tsx | 0 .../src}/components/core/tree/tree-state.ts | 0 .../app/src}/components/core/tree/types.ts | 0 .../src}/components/core/tree/useTreeNode.ts | 0 .../src}/components/core/waveform/types.ts | 0 .../components/core/waveform/useWaveform.ts | 0 .../dialogs/iframe-warning/index.tsx | 0 .../dialogs/loader/LoadingDialog.tsx | 0 .../src}/components/dialogs/loader/index.tsx | 0 .../app/src}/components/editors/Editors.tsx | 0 .../editors/EntityEditor/EntityTree/index.tsx | 0 .../EntityEditor/EntityTree/useEntityTree.ts | 0 .../EntityEditor/EntityViewer/EntityList.tsx | 0 .../EntityEditor/EntityViewer/index.tsx | 0 .../components/editors/EntityEditor/index.tsx | 0 .../editors/FilterEditor/FilterTree/index.tsx | 0 .../FilterEditor/FilterTree/useFilterTree.ts | 0 .../FilterEditor/FilterViewer/index.tsx | 0 .../components/editors/FilterEditor/index.tsx | 0 .../editors/ProjectEditor/index.tsx | 0 .../components/editors/ScriptEditor/README.md | 0 .../components/editors/ScriptEditor/index.tsx | 0 .../editors/ScriptEditor/styles.css | 0 .../editors/SegmentEditor/index.tsx | 0 .../WorkflowEditor/WorkflowTree/index.tsx | 0 .../WorkflowTree/useWorkflowTree.ts | 0 .../ReactFlowCanvas/NodeView.tsx | 0 .../clapWorkflowToReactWorkflow.ts | 0 .../ReactFlowCanvas/formats/comfyui/types.ts | 0 .../ReactFlowCanvas/formats/falai/types.ts | 0 .../formats/glif/glifToReactWorkflow.ts | 0 .../ReactFlowCanvas/formats/glif/types.ts | 0 .../WorkflowViewer/ReactFlowCanvas/index.tsx | 0 .../ReactFlowCanvas/samples/comfyicu.ts | 0 .../ReactFlowCanvas/samples/glif.ts | 0 .../WorkflowViewer/ReactFlowCanvas/types.ts | 0 .../WorkflowEditor/WorkflowViewer/index.tsx | 0 .../editors/WorkflowEditor/index.tsx | 0 .../app/src}/components/forms/FormDir.tsx | 0 .../app/src}/components/forms/FormField.tsx | 0 .../app/src}/components/forms/FormFile.tsx | 0 .../app/src}/components/forms/FormInput.tsx | 0 .../app/src}/components/forms/FormLabel.tsx | 0 .../app/src}/components/forms/FormRadio.tsx | 0 .../app/src}/components/forms/FormSection.tsx | 0 .../app/src}/components/forms/FormSelect.tsx | 0 .../app/src}/components/forms/FormSlider.tsx | 0 .../app/src}/components/forms/FormSwitch.tsx | 0 .../app/src}/components/forms/index.ts | 0 .../components/icons/getAppropriateIcon.ts | 0 .../app/src}/components/icons/index.tsx | 0 .../app/src}/components/mobile/MobileMenu.tsx | 0 .../src}/components/monitor/Counter/index.tsx | 0 .../monitor/DynamicPlayer/DynamicBuffer.tsx | 0 .../DynamicPlayer/StoryboardBuffer.tsx | 0 .../monitor/DynamicPlayer/VideoClipBuffer.tsx | 0 .../monitor/DynamicPlayer/index.tsx | 0 .../monitor/PlayerControls/index.tsx | 0 .../app/src}/components/monitor/README.md | 0 .../components/monitor/Separator/index.tsx | 0 .../components/monitor/StaticPlayer/index.tsx | 0 .../monitor/UniversalPlayer/index.tsx | 2 +- .../components/monitor/icons/icon-switch.tsx | 0 .../components/monitor/icons/single-icon.tsx | 0 .../app/src}/components/monitor/index.tsx | 0 .../monitor/utils/splitElapsedTime.tsx | 0 .../src}/components/monitor/utils/zeroPad.ts | 0 .../src}/components/settings/assistant.tsx | 0 .../app/src}/components/settings/constants.ts | 0 .../app/src}/components/settings/editors.tsx | 0 .../app/src}/components/settings/image.tsx | 0 .../app/src}/components/settings/index.tsx | 0 .../app/src}/components/settings/music.tsx | 0 .../app/src}/components/settings/provider.tsx | 0 .../app/src}/components/settings/sound.tsx | 0 .../app/src}/components/settings/video.tsx | 0 .../app/src}/components/settings/voice.tsx | 0 .../app/src}/components/tags/Tag.tsx | 0 .../app/src}/components/tags/colors.ts | 0 .../app/src}/components/tags/types.ts | 0 .../components/tasks/TaskStatusUpdate.tsx | 0 .../app/src}/components/tasks/useTasks.tsx | 0 .../components/toolbars/bottom-bar/index.tsx | 0 .../toolbars/bottom-bar/metrics/index.tsx | 0 .../toolbars/bottom-bar/tasks/index.tsx | 0 .../toolbars/editors-menu/EditorsSideMenu.tsx | 0 .../editors-menu/EditorsSideMenuItem.tsx | 0 .../toolbars/editors-menu/NatureIcon.tsx | 0 .../components/toolbars/system-menu/index.tsx | 0 .../components/toolbars/top-bar/index.tsx | 0 .../top-menu/ActivitySpinner/index.tsx | 0 .../toolbars/top-menu/IsBusy/index.tsx | 0 .../top-menu/ToggleFullScreen/index.tsx | 0 .../toolbars/top-menu/ToggleView/index.tsx | 0 .../top-menu/ToggleWindowLayout/index.tsx | 0 .../toolbars/top-menu/TopMenuLogo/index.tsx | 0 .../toolbars/top-menu/assistant/index.tsx | 0 .../components/toolbars/top-menu/constants.ts | 0 .../toolbars/top-menu/edit/index.tsx | 0 .../toolbars/top-menu/file/index.tsx | 0 .../toolbars/top-menu/image/index.tsx | 0 .../components/toolbars/top-menu/index.tsx | 0 .../top-menu/lists/AssistantWorkflows.tsx | 0 .../top-menu/lists/ImageDepthWorkflows.tsx | 0 .../lists/ImageGenerationWorkflows.tsx | 0 .../lists/ImageSegmentationWorkflows.tsx | 0 .../lists/ImageUpscalingWorkflows.tsx | 0 .../lists/MusicGenerationWorkflows.tsx | 0 .../top-menu/lists/RenderingStrategyList.tsx | 0 .../lists/SoundGenerationWorkflows.tsx | 0 .../toolbars/top-menu/lists/ThemeList.tsx | 0 .../top-menu/lists/VideoDepthWorkflows.tsx | 0 .../lists/VideoGenerationWorkflows.tsx | 0 .../lists/VideoSegmentationWorkflows.tsx | 0 .../lists/VideoUpscalingWorkflows.tsx | 0 .../lists/VoiceGenerationWorkflows.tsx | 0 .../toolbars/top-menu/lists/formatProvider.ts | 0 .../top-menu/lists/getWorkflowProviders.ts | 0 .../toolbars/top-menu/lists/hasNoPublicAPI.ts | 0 .../toolbars/top-menu/music/index.tsx | 0 .../toolbars/top-menu/plugins/index.tsx | 0 .../toolbars/top-menu/sound/index.tsx | 0 .../toolbars/top-menu/video/index.tsx | 0 .../toolbars/top-menu/view/index.tsx | 0 .../toolbars/top-menu/voice/index.tsx | 0 .../tree-browsers/style/treeNodeStyles.ts | 0 .../src}/components/tree-browsers/types.ts | 0 .../tree-browsers/utils/getCollectionColor.ts | 0 .../utils/getCollectionItemTextColor.ts | 0 .../tree-browsers/utils/getItemColor.ts | 0 .../tree-browsers/utils/isSomething.ts | 0 .../app/src}/components/ui/accordion.tsx | 0 .../app/src}/components/ui/alert.tsx | 0 .../app/src}/components/ui/avatar.tsx | 0 .../app/src}/components/ui/badge.tsx | 0 .../app/src}/components/ui/button.tsx | 0 .../app/src}/components/ui/card.tsx | 0 .../app/src}/components/ui/checkbox.tsx | 0 .../app/src}/components/ui/collapsible.tsx | 0 .../app/src}/components/ui/command.tsx | 0 .../app/src}/components/ui/dialog.tsx | 0 .../app/src}/components/ui/dropdown-menu.tsx | 0 .../app/src}/components/ui/input.tsx | 0 .../app/src}/components/ui/label.tsx | 0 .../app/src}/components/ui/menubar.tsx | 0 .../app/src}/components/ui/popover.tsx | 0 .../app/src}/components/ui/progress.tsx | 0 .../app/src}/components/ui/scroll-area.tsx | 0 .../app/src}/components/ui/select.tsx | 0 .../app/src}/components/ui/separator.tsx | 0 .../app/src}/components/ui/sheet.tsx | 0 .../app/src}/components/ui/slider.tsx | 0 .../app/src}/components/ui/sonner.tsx | 0 .../app/src}/components/ui/switch.tsx | 0 .../app/src}/components/ui/table.tsx | 0 .../app/src}/components/ui/tabs.tsx | 0 .../app/src}/components/ui/textarea.tsx | 0 .../app/src}/components/ui/toast.tsx | 0 .../app/src}/components/ui/toaster.tsx | 0 .../app/src}/components/ui/tooltip.tsx | 0 .../app/src}/components/ui/use-toast.ts | 0 .../src}/components/ui/vertical-slider.tsx | 0 .../src}/components/uikit/default/button.tsx | 2 +- .../src}/components/uikit/default/theme.tsx | 0 .../app/src}/components/windows/index.tsx | 0 .../src}/components/wizards/project/index.tsx | 0 .../app/src}/experiments/README.md | 0 .../experiments/moodboard/MoodboardView.tsx | 0 .../app/src}/experiments/moodboard/Node.tsx | 0 .../app/src}/experiments/samples/demo.ts | 0 .../app/src}/lib/core/constants.ts | 0 .../app/src}/lib/ffmpeg/convertAudioToMp3.ts | 0 .../app/src}/lib/ffmpeg/getMediaInfo.ts | 0 .../app/src}/lib/hf/adapter/README.md | 0 .../adapter/adaptAnyInputsToGradioInputs.ts | 0 .../lib/hf/adapter/findMainGradioEndpoint.ts | 0 .../src}/lib/hf/adapter/getAdaptationScore.ts | 0 .../src}/lib/hf/adapter/getDefaultFields.ts | 0 .../app/src}/lib/hf/adapter/identifyField.ts | 0 .../app/src}/lib/hf/callGradioApi.ts | 0 .../app/src}/lib/hf/cloneSpace.ts | 0 .../app/src}/lib/hf/getCurrentOwner.ts | 0 .../app/src}/lib/hf/getGradioApiInfo.ts | 0 .../app/src}/lib/hf/getSpaceStatus.ts | 0 {src => packages/app/src}/lib/hf/getSpaces.ts | 0 .../src}/lib/hf/parseHuggingFaceHubId.test.ts | 0 .../app/src}/lib/hf/parseHuggingFaceHubId.ts | 0 {src => packages/app/src}/lib/hf/runSpace.ts | 0 {src => packages/app/src}/lib/hf/types.ts | 0 .../app/src}/lib/hf/useMyGradioSpaces.ts | 0 {src => packages/app/src}/lib/hooks/README.md | 0 {src => packages/app/src}/lib/hooks/index.ts | 0 .../app/src}/lib/hooks/useAnimationFrame.ts | 0 .../app/src}/lib/hooks/useDebounce.ts | 0 .../app/src}/lib/hooks/useFullscreenStatus.ts | 0 .../app/src}/lib/hooks/useOpenFilePicker.ts | 0 .../app/src}/lib/hooks/usePerformanceMeter.ts | 0 .../src}/lib/hooks/useQueryStringParams.ts | 0 .../lib/hooks/useRequestAnimationFrame.ts | 0 .../app/src}/lib/hooks/useTitle.ts | 0 .../app/src}/lib/kdenlive/README.md | 0 .../app/src}/lib/kdenlive/entry.ts | 0 .../app/src}/lib/kdenlive/index.ts | 0 .../app/src}/lib/kdenlive/kdenlive.ts | 0 .../app/src}/lib/kdenlive/makeIDGen.ts | 0 .../app/src}/lib/kdenlive/playlist.ts | 0 .../app/src}/lib/kdenlive/producer.ts | 0 .../src}/lib/kdenlive/producer_original.ts | 0 .../app/src}/lib/kdenlive/tractor.ts | 0 .../app/src}/lib/utils/addBase64Header.ts | 0 .../lib/utils/base64DataUriToBlob.test.ts | 0 .../app/src}/lib/utils/base64DataUriToBlob.ts | 0 .../app/src}/lib/utils/base64DataUriToFile.ts | 0 .../lib/utils/base64DataUriToUint8Array.ts | 0 .../app/src}/lib/utils/blobToBase64DataUri.ts | 0 .../app/src}/lib/utils/cn.test.ts | 0 {src => packages/app/src}/lib/utils/cn.ts | 0 .../app/src}/lib/utils/convertToJpeg.ts | 0 .../app/src}/lib/utils/debounceAsync.ts | 0 .../app/src}/lib/utils/debounceSync.ts | 0 .../app/src}/lib/utils/decodeOutput.ts | 0 .../src}/lib/utils/fetchContentToBase64.ts | 0 .../app/src}/lib/utils/findClosest.ts | 0 .../app/src}/lib/utils/formatDuration.test.ts | 0 .../app/src}/lib/utils/formatDuration.ts | 0 .../lib/utils/formatSegmentForExport.test.ts | 0 .../src}/lib/utils/formatSegmentForExport.ts | 0 .../lib/utils/getTypeAndExtension.test.ts | 0 .../app/src}/lib/utils/getTypeAndExtension.ts | 0 .../app/src}/lib/utils/getValidBoolean.ts | 0 .../getValidComfyWorkflowTemplate.test.ts | 0 .../utils/getValidComfyWorkflowTemplate.ts | 0 .../app/src}/lib/utils/getValidNumber.ts | 0 .../app/src}/lib/utils/getValidString.ts | 0 {src => packages/app/src}/lib/utils/index.ts | 0 .../app/src}/lib/utils/isValidNumber.ts | 0 .../lib/utils/parseComfyIcuAccelerator.ts | 0 .../src}/lib/utils/parsePdfToIndentedText.ts | 0 {src => packages/app/src}/lib/utils/sleep.ts | 0 {src => packages/app/src}/services/README.md | 0 .../src}/services/assistant/askAssistant.ts | 0 .../assistant/getDefaultAssistantState.ts | 0 .../assistant/parseRawInputToAction.ts | 0 .../services/assistant/updateStoryAndScene.ts | 0 .../src}/services/assistant/useAssistant.ts | 0 .../services/assistant/useVoiceAssistant.ts | 0 .../app/src}/services/audio/README.md | 0 .../app/src}/services/audio/analyzeAudio.ts | 0 .../app/src}/services/audio/detectBPM.ts | 0 .../services/audio/getDefaultAudioState.ts | 0 .../services/audio/startAudioSourceNode.ts | 0 .../app/src}/services/audio/useAudio.ts | 0 .../extractCaptionFromFrameMoondream.ts | 0 .../autocomplete/extractCaptionsFromFrames.ts | 0 .../getDefaultAutocompleteState.ts | 0 .../app/src}/services/autocomplete/types.ts | 0 .../services/autocomplete/useAutocomplete.ts | 0 .../app/src}/services/broadcast/constants.ts | 0 .../broadcast/getDefaultBroadcastState.ts | 0 .../src}/services/broadcast/useBroadcast.ts | 0 {src => packages/app/src}/services/debug.ts | 0 .../getDefaultEntityEditorState.ts | 0 .../editors/entity-editor/useEntityEditor.ts | 0 .../services/editors/filter-editor/README.md | 0 .../services/editors/filter-editor/demo.ts | 0 .../filter-editor/filters/analogLens.ts | 0 .../filter-editor/filters/cinematic.ts | 0 .../filter-editor/filters/colorMapping.ts | 0 .../filter-editor/filters/colorTemperature.ts | 0 .../filter-editor/filters/crossProcessing.ts | 0 .../filter-editor/filters/filmDegradation.ts | 0 .../editors/filter-editor/filters/index.ts | 0 .../editors/filter-editor/filters/infrared.ts | 0 .../filter-editor/filters/lomography.ts | 0 .../filter-editor/filters/splitToning.ts | 0 .../filter-editor/filters/toneMapping.ts | 0 .../filter-editor/filters/vintageFilm.ts | 0 .../getDefaultFilterEditorState.ts | 0 .../filter-editor/runFilterPipeline.ts | 0 .../editors/filter-editor/useFilterEditor.ts | 0 .../editors/getDefaultEditorsState.ts | 0 .../app/src}/services/editors/index.ts | 0 .../getDefaultProjectEditorState.ts | 0 .../project-editor/useProjectEditor.ts | 0 .../getDefaultScriptEditorState.ts | 0 .../editors/script-editor/useScriptEditor.ts | 0 .../getDefaultSegmentEditorState.ts | 0 .../segment-editor/useSegmentEditor.ts | 0 .../app/src}/services/editors/useEditors.ts | 0 .../getDefaultWorkflowEditorState.ts | 0 .../workflow-editor/useDynamicWorkflows.ts | 0 .../workflow-editor/useWorkflowEditor.ts | 0 .../_documentation_/demo_examples.ts | 0 .../workflow-editor/workflows/aitube/index.ts | 0 .../workflows/anthropic/index.ts | 0 .../workflow-editor/workflows/cohere/index.ts | 0 .../workflows/comfydeploy/index.ts | 0 .../workflows/comfyicu/index.ts | 0 .../workflows/comfyui/getComfyWorkflow.ts | 0 .../workflows/comfyui/index.ts | 0 .../comfyui/flux_plus_ultimatesdupscale.ts | 0 .../comfyui/text_to_image_demo_workflow.ts | 0 .../workflows/common/defaultValues.ts | 0 .../workflow-editor/workflows/common/types.ts | 0 .../workflows/elevenlabs/index.ts | 0 .../workflows/falai/comfyuiWorkflows.ts | 0 .../workflows/falai/defaultWorkflows.ts | 0 .../workflow-editor/workflows/falai/index.ts | 0 .../workflows/fireworksai/index.ts | 0 .../workflow-editor/workflows/google/index.ts | 0 .../workflow-editor/workflows/groq/index.ts | 0 .../workflows/huggingface/index.ts | 0 .../workflow-editor/workflows/index.ts | 0 .../workflows/mistralai/index.ts | 0 .../workflow-editor/workflows/openai/index.ts | 0 .../openart/samples/openart_workflow.json | 0 .../workflows/replicate/comfyuiWorkflows.ts | 0 .../workflows/replicate/defaultWorkflows.ts | 0 .../workflows/replicate/index.ts | 0 .../workflows/stabilityai/index.ts | 0 {src => packages/app/src}/services/index.ts | 0 .../services/inputs/getDefaultInputsState.ts | 0 .../app/src}/services/inputs/types.ts | 0 .../app/src}/services/inputs/useInputs.ts | 0 .../app/src}/services/io/createFullVideo.ts | 0 .../services/io/extractFramesFromVideo.ts | 0 .../services/io/extractScenesFromVideo.ts | 0 .../app/src}/services/io/ffmpegUtils.ts | 0 .../app/src}/services/io/fileDataToBase64.ts | 0 .../services/io/fix-xenova-transformers.d.ts | 0 .../app/src}/services/io/getDefaultIOState.ts | 0 .../app/src}/services/io/imageCaptioning.ts | 0 .../src}/services/io/parseFileIntoSegments.ts | 0 .../app/src}/services/io/parseFileName.ts | 0 .../services/io/parseFilesIntoSegments.ts | 0 .../app/src}/services/io/useIO.ts | 0 .../app/src}/services/metrics/constants.ts | 0 .../getDefaultClapWorkflowProviderMetrics.ts | 0 .../getDefaultMetricsModelEstimations.ts | 0 .../metrics/getDefaultMetricsModelStats.ts | 0 .../metrics/getDefaultMetricsPerProvider.ts | 0 .../metrics/getDefaultMetricsState.ts | 0 .../app/src}/services/metrics/types.ts | 0 .../app/src}/services/metrics/useMetrics.ts | 0 .../src}/services/mic/getDefaultMicState.ts | 0 .../app/src}/services/mic/useMic.ts | 0 .../app/src}/services/monitor/README.md | 0 .../monitor/getDefaultMonitorState.ts | 0 .../app/src}/services/monitor/useMonitor.ts | 0 .../app/src}/services/plugins/constants.ts | 0 .../app/src}/services/plugins/fetchAndRun.ts | 0 .../plugins/getDefaultPluginsState.ts | 0 .../app/src}/services/plugins/usePlugins.ts | 0 .../app/src}/services/renderer/constants.ts | 0 .../renderer/getDefaultBufferedSegments.ts | 0 .../renderer/getDefaultRendererState.ts | 0 .../services/renderer/getSegmentCacheKey.ts | 0 .../app/src}/services/renderer/index.ts | 0 .../src}/services/renderer/useRenderLoop.ts | 0 .../app/src}/services/renderer/useRenderer.ts | 0 .../app/src}/services/resolver/constants.ts | 0 .../resolver/getDefaultResolverState.ts | 0 .../app/src}/services/resolver/useResolver.ts | 0 .../settings/getDefaultSettingsState.ts | 0 .../app/src}/services/settings/index.ts | 0 .../app/src}/services/settings/useSettings.ts | 0 .../src}/services/settings/workflows/image.ts | 0 .../simulator/useDefaultSimulatorState.ts | 0 .../src}/services/simulator/useSimulator.ts | 0 .../app/src}/services/ui/getDefaultUIState.ts | 0 .../app/src}/services/ui/index.ts | 0 .../app/src}/services/ui/theme.ts | 0 .../app/src}/services/ui/useTheme.ts | 0 .../app/src}/services/ui/useUI.ts | 0 .../app/src}/services/windows/types.ts | 0 .../app/src}/services/windows/useWindows.ts | 0 .../app/tailwind.config.js | 0 .../app/tests}/examples.spec.txt | 0 {tests => packages/app/tests}/main.spec.ts | 0 tsconfig.json => packages/app/tsconfig.json | 0 .../app/vitest.config.mts | 0 594 files changed, 43094 insertions(+), 21905 deletions(-) rename LICENCE.txt => LICENSE.txt (100%) rename .env.example => packages/app/.env.example (100%) rename .eslintrc.json => packages/app/.eslintrc.json (100%) rename .gitattributes => packages/app/.gitattributes (100%) create mode 100644 packages/app/.gitignore create mode 100644 packages/app/.nvmrc rename .prettierrc.json => packages/app/.prettierrc.json (100%) rename Dockerfile => packages/app/Dockerfile (100%) create mode 100644 packages/app/LICENSE.txt rename components.json => packages/app/components.json (100%) rename forge.config.js => packages/app/forge.config.js (100%) rename main.js => packages/app/main.js (100%) rename next.config.js => packages/app/next.config.js (100%) create mode 100644 packages/app/package-lock.json create mode 100644 packages/app/package.json rename playwright.config.ts => packages/app/playwright.config.ts (100%) rename postcss.config.js => packages/app/postcss.config.js (100%) rename {public => packages/app/public}/.gitattributes (100%) rename {public => packages/app/public}/carriers/README.md (100%) rename {public => packages/app/public}/datasets/baby-names-us-year-of-birth-full.csv (100%) rename {public => packages/app/public}/images/icons/interface/character.svg (100%) rename {public => packages/app/public}/images/icons/interface/characters.svg (100%) rename {public => packages/app/public}/images/icons/interface/cloud.svg (100%) rename {public => packages/app/public}/images/icons/interface/community.svg (100%) rename {public => packages/app/public}/images/icons/interface/computer.svg (100%) rename {public => packages/app/public}/images/icons/interface/cut.svg (100%) rename {public => packages/app/public}/images/icons/interface/downloads.svg (100%) rename {public => packages/app/public}/images/icons/interface/film.svg (100%) rename {public => packages/app/public}/images/icons/interface/hidden.svg (100%) rename {public => packages/app/public}/images/icons/interface/image-to-image.svg (100%) rename {public => packages/app/public}/images/icons/interface/image.svg (100%) rename {public => packages/app/public}/images/icons/interface/imagefile.svg (100%) rename {public => packages/app/public}/images/icons/interface/interpolate.svg (100%) rename {public => packages/app/public}/images/icons/interface/location.svg (100%) rename {public => packages/app/public}/images/icons/interface/lora.svg (100%) rename {public => packages/app/public}/images/icons/interface/misc.svg (100%) rename {public => packages/app/public}/images/icons/interface/mute.svg (100%) rename {public => packages/app/public}/images/icons/interface/project.svg (100%) rename {public => packages/app/public}/images/icons/interface/prompt.svg (100%) rename {public => packages/app/public}/images/icons/interface/screenplay.svg (100%) rename {public => packages/app/public}/images/icons/interface/sound.svg (100%) rename {public => packages/app/public}/images/icons/interface/soundfile.svg (100%) rename {public => packages/app/public}/images/icons/interface/speech.svg (100%) rename {public => packages/app/public}/images/icons/interface/team.svg (100%) rename {public => packages/app/public}/images/icons/interface/text-to-music.svg (100%) rename {public => packages/app/public}/images/icons/interface/text-to-video.svg (100%) rename {public => packages/app/public}/images/icons/interface/textfile.svg (100%) rename {public => packages/app/public}/images/icons/interface/transfer.svg (100%) rename {public => packages/app/public}/images/icons/interface/transition.svg (100%) rename {public => packages/app/public}/images/icons/interface/unpute.svg (100%) rename {public => packages/app/public}/images/icons/interface/upscale.svg (100%) rename {public => packages/app/public}/images/icons/interface/vendor.svg (100%) rename {public => packages/app/public}/images/icons/interface/video-folder.svg (100%) rename {public => packages/app/public}/images/icons/interface/video-to-video.svg (100%) rename {public => packages/app/public}/images/icons/interface/videofile.svg (100%) rename {public => packages/app/public}/images/icons/interface/visible.svg (100%) rename {public => packages/app/public}/images/icons/segments/action.svg (100%) rename {public => packages/app/public}/images/icons/segments/camera.svg (100%) rename {public => packages/app/public}/images/icons/segments/character.svg (100%) rename {public => packages/app/public}/images/icons/segments/depth.svg (100%) rename {public => packages/app/public}/images/icons/segments/dialogue.svg (100%) rename {public => packages/app/public}/images/icons/segments/effect.svg (100%) rename {public => packages/app/public}/images/icons/segments/era.svg (100%) rename {public => packages/app/public}/images/icons/segments/event.svg (100%) rename {public => packages/app/public}/images/icons/segments/generic.svg (100%) rename {public => packages/app/public}/images/icons/segments/interface.svg (100%) rename {public => packages/app/public}/images/icons/segments/lighting.svg (100%) rename {public => packages/app/public}/images/icons/segments/location.svg (100%) rename {public => packages/app/public}/images/icons/segments/mesh.svg (100%) rename {public => packages/app/public}/images/icons/segments/music.svg (100%) rename {public => packages/app/public}/images/icons/segments/phenomenon.svg (100%) rename {public => packages/app/public}/images/icons/segments/sound.svg (100%) rename {public => packages/app/public}/images/icons/segments/splat.svg (100%) rename {public => packages/app/public}/images/icons/segments/storyboard.svg (100%) rename {public => packages/app/public}/images/icons/segments/style.svg (100%) rename {public => packages/app/public}/images/icons/segments/time.svg (100%) rename {public => packages/app/public}/images/icons/segments/transition.svg (100%) rename {public => packages/app/public}/images/icons/segments/video.svg (100%) rename {public => packages/app/public}/images/icons/segments/weather.svg (100%) rename {public => packages/app/public}/images/logos/CL.icns (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_128x128.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_128x128@2x.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_16x16.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_16x16@2x.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_256x256.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_256x256@2x.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_32x32.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_32x32@2x.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_512x512.png (100%) rename {public => packages/app/public}/images/logos/CL.iconset/icon_512x512@2x.png (100%) rename {public => packages/app/public}/images/logos/CL.png (100%) rename {public => packages/app/public}/images/logos/clapper.png (100%) rename {public => packages/app/public}/images/logos/logo-desaturated.png (100%) rename {public => packages/app/public}/images/logos/logo-discord-2.png (100%) rename {public => packages/app/public}/images/logos/logo-discord-3.png (100%) rename {public => packages/app/public}/images/logos/logo-no-bg.png (100%) rename {public => packages/app/public}/images/logos/logo-v2.png (100%) rename {public => packages/app/public}/images/logos/logo-v2.xcf (100%) rename {public => packages/app/public}/images/onboarding/get-started.png (100%) rename {public => packages/app/public}/images/onboarding/get-started.xcf (100%) rename {public => packages/app/public}/images/onboarding/pick-an-example.png (100%) rename {public => packages/app/public}/images/onboarding/pick-an-example.xcf (100%) rename {public => packages/app/public}/images/providers/anthropic.png (100%) rename {public => packages/app/public}/images/providers/cohere.png (100%) rename {public => packages/app/public}/images/providers/comfyicu.png (100%) rename {public => packages/app/public}/images/providers/comfyui.png (100%) rename {public => packages/app/public}/images/providers/elevenlabs.png (100%) rename {public => packages/app/public}/images/providers/everartai.png (100%) rename {public => packages/app/public}/images/providers/falai.png (100%) rename {public => packages/app/public}/images/providers/fireworks.png (100%) rename {public => packages/app/public}/images/providers/google.png (100%) rename {public => packages/app/public}/images/providers/groq.png (100%) rename {public => packages/app/public}/images/providers/hedra.png (100%) rename {public => packages/app/public}/images/providers/huggingface.png (100%) rename {public => packages/app/public}/images/providers/kitsai.png (100%) rename {public => packages/app/public}/images/providers/kuaishou.png (100%) rename {public => packages/app/public}/images/providers/leonardoai.png (100%) rename {public => packages/app/public}/images/providers/lumalabs.png (100%) rename {public => packages/app/public}/images/providers/midjourney.png (100%) rename {public => packages/app/public}/images/providers/mistralai.png (100%) rename {public => packages/app/public}/images/providers/modelslab.jpeg (100%) rename {public => packages/app/public}/images/providers/none.png (100%) rename {public => packages/app/public}/images/providers/openai.png (100%) rename {public => packages/app/public}/images/providers/replicate.jpeg (100%) rename {public => packages/app/public}/images/providers/runwayml.png (100%) rename {public => packages/app/public}/images/providers/stabilityai.png (100%) rename {public => packages/app/public}/images/providers/suno.png (100%) rename {public => packages/app/public}/images/providers/udio.png (100%) rename {public => packages/app/public}/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap (100%) rename {public => packages/app/public}/samples/claps/empty_project.clap (100%) rename {public => packages/app/public}/samples/claps/empty_project.yaml (100%) rename {public => packages/app/public}/samples/claps/test.clap (100%) rename {public => packages/app/public}/samples/claps/wasteland.clap (100%) rename {public => packages/app/public}/samples/scripts/Citizen Kane.txt (100%) rename {public => packages/app/public}/samples/scripts/DISCLAIMER.md (100%) rename {public => packages/app/public}/samples/scripts/Raiders of the Lost Ark.txt (100%) rename {public => packages/app/public}/samples/scripts/Rear Window.txt (100%) rename {public => packages/app/public}/samples/scripts/Star Wars A New Hope.txt (100%) rename {public => packages/app/public}/samples/scripts/The Apery.txt (100%) rename {public => packages/app/public}/samples/scripts/The Goonies.txt (100%) rename {public => packages/app/public}/samples/scripts/The Wizard Of Oz.txt (100%) rename {public => packages/app/public}/voices/README.md (100%) rename {public => packages/app/public}/wasm/MediaInfoModule.wasm (100%) rename {public => packages/app/public}/workers/captioning.worker.js (100%) rename {src => packages/app/src}/app/api/assistant/askAnyAssistant.ts (100%) rename {src => packages/app/src}/app/api/assistant/parseLangChainResponse.ts (100%) rename {src => packages/app/src}/app/api/assistant/parser.ts (100%) rename {src => packages/app/src}/app/api/assistant/providers/google/README.md (100%) rename {src => packages/app/src}/app/api/assistant/providers/google/sample.txt (100%) rename {src => packages/app/src}/app/api/assistant/route.ts (100%) rename {src => packages/app/src}/app/api/assistant/samples.ts (100%) rename {src => packages/app/src}/app/api/assistant/templates.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/aitube/README.md (100%) rename {src => packages/app/src}/app/api/resolve/providers/aitube/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfy-comfydeploy/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfy-comfyicu/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfy-comfyicu/types.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfy-huggingface/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfy-replicate/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfy-replicate/runWorkflow.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/comfyui/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/falai/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/falai/types.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/getWorkflowInputValues.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/gradio/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/huggingface/generateImage.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/huggingface/generateMusic.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/huggingface/generateVideo.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/huggingface/generateVoice.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/huggingface/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/lumalabs/getGenerations.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/lumalabs/todo.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/lumalabs/types.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/modelslab/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/openai/TODO.md (100%) rename {src => packages/app/src}/app/api/resolve/providers/replicate/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/stabilityai/generateImage.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/stabilityai/generateVideo.ts (100%) rename {src => packages/app/src}/app/api/resolve/providers/stabilityai/index.ts (100%) rename {src => packages/app/src}/app/api/resolve/route.ts (100%) rename {src => packages/app/src}/app/cute_1024x1024x32.png (100%) rename {src => packages/app/src}/app/cute_favicon.ico (100%) rename {src => packages/app/src}/app/cute_icon.png (100%) rename {src => packages/app/src}/app/embed/README.md (100%) rename {src => packages/app/src}/app/embed/embed.tsx (100%) rename {src => packages/app/src}/app/embed/page.tsx (100%) rename {src => packages/app/src}/app/favicon.ico (100%) rename {src => packages/app/src}/app/favicon_square.ico (100%) rename {src => packages/app/src}/app/fonts/alarm-clock/alarm-clock.woff2 (100%) rename {src => packages/app/src}/app/fonts/index.ts (100%) rename {src => packages/app/src}/app/icon_NEXTJS_BUG.png (100%) rename {src => packages/app/src}/app/icon_square.png (100%) rename {src => packages/app/src}/app/layout.tsx (100%) rename {src => packages/app/src}/app/main.tsx (100%) rename {src => packages/app/src}/app/page.tsx (100%) rename {src => packages/app/src}/app/styles/globals.css (100%) rename {src => packages/app/src}/app/styles/react-reflex-custom.css (100%) rename {src => packages/app/src}/app/styles/react-reflex.css (100%) rename {src => packages/app/src}/components/assistant/ChatBubble.tsx (100%) rename {src => packages/app/src}/components/assistant/ChatView.tsx (100%) rename {src => packages/app/src}/components/core/providers/ClapWorkflowProviderLogo.tsx (100%) rename {src => packages/app/src}/components/core/providers/ClapWorkflowProviderName.tsx (100%) rename {src => packages/app/src}/components/core/providers/index.ts (100%) rename {src => packages/app/src}/components/core/providers/logos.ts (100%) rename {src => packages/app/src}/components/core/timeline/index.tsx (100%) rename {src => packages/app/src}/components/core/tree/README.md (100%) rename {src => packages/app/src}/components/core/tree/chainable-map.ts (100%) rename {src => packages/app/src}/components/core/tree/icons.tsx (100%) rename {src => packages/app/src}/components/core/tree/index.tsx (100%) rename {src => packages/app/src}/components/core/tree/root.tsx (100%) rename {src => packages/app/src}/components/core/tree/roving.tsx (100%) rename {src => packages/app/src}/components/core/tree/tree-state.ts (100%) rename {src => packages/app/src}/components/core/tree/types.ts (100%) rename {src => packages/app/src}/components/core/tree/useTreeNode.ts (100%) rename {src => packages/app/src}/components/core/waveform/types.ts (100%) rename {src => packages/app/src}/components/core/waveform/useWaveform.ts (100%) rename {src => packages/app/src}/components/dialogs/iframe-warning/index.tsx (100%) rename {src => packages/app/src}/components/dialogs/loader/LoadingDialog.tsx (100%) rename {src => packages/app/src}/components/dialogs/loader/index.tsx (100%) rename {src => packages/app/src}/components/editors/Editors.tsx (100%) rename {src => packages/app/src}/components/editors/EntityEditor/EntityTree/index.tsx (100%) rename {src => packages/app/src}/components/editors/EntityEditor/EntityTree/useEntityTree.ts (100%) rename {src => packages/app/src}/components/editors/EntityEditor/EntityViewer/EntityList.tsx (100%) rename {src => packages/app/src}/components/editors/EntityEditor/EntityViewer/index.tsx (100%) rename {src => packages/app/src}/components/editors/EntityEditor/index.tsx (100%) rename {src => packages/app/src}/components/editors/FilterEditor/FilterTree/index.tsx (100%) rename {src => packages/app/src}/components/editors/FilterEditor/FilterTree/useFilterTree.ts (100%) rename {src => packages/app/src}/components/editors/FilterEditor/FilterViewer/index.tsx (100%) rename {src => packages/app/src}/components/editors/FilterEditor/index.tsx (100%) rename {src => packages/app/src}/components/editors/ProjectEditor/index.tsx (100%) rename {src => packages/app/src}/components/editors/ScriptEditor/README.md (100%) rename {src => packages/app/src}/components/editors/ScriptEditor/index.tsx (100%) rename {src => packages/app/src}/components/editors/ScriptEditor/styles.css (100%) rename {src => packages/app/src}/components/editors/SegmentEditor/index.tsx (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowTree/index.tsx (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowTree/useWorkflowTree.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/NodeView.tsx (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/clapWorkflowToReactWorkflow.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/comfyui/types.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/falai/types.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/glifToReactWorkflow.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/types.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/index.tsx (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/comfyicu.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/glif.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/types.ts (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/WorkflowViewer/index.tsx (100%) rename {src => packages/app/src}/components/editors/WorkflowEditor/index.tsx (100%) rename {src => packages/app/src}/components/forms/FormDir.tsx (100%) rename {src => packages/app/src}/components/forms/FormField.tsx (100%) rename {src => packages/app/src}/components/forms/FormFile.tsx (100%) rename {src => packages/app/src}/components/forms/FormInput.tsx (100%) rename {src => packages/app/src}/components/forms/FormLabel.tsx (100%) rename {src => packages/app/src}/components/forms/FormRadio.tsx (100%) rename {src => packages/app/src}/components/forms/FormSection.tsx (100%) rename {src => packages/app/src}/components/forms/FormSelect.tsx (100%) rename {src => packages/app/src}/components/forms/FormSlider.tsx (100%) rename {src => packages/app/src}/components/forms/FormSwitch.tsx (100%) rename {src => packages/app/src}/components/forms/index.ts (100%) rename {src => packages/app/src}/components/icons/getAppropriateIcon.ts (100%) rename {src => packages/app/src}/components/icons/index.tsx (100%) rename {src => packages/app/src}/components/mobile/MobileMenu.tsx (100%) rename {src => packages/app/src}/components/monitor/Counter/index.tsx (100%) rename {src => packages/app/src}/components/monitor/DynamicPlayer/DynamicBuffer.tsx (100%) rename {src => packages/app/src}/components/monitor/DynamicPlayer/StoryboardBuffer.tsx (100%) rename {src => packages/app/src}/components/monitor/DynamicPlayer/VideoClipBuffer.tsx (100%) rename {src => packages/app/src}/components/monitor/DynamicPlayer/index.tsx (100%) rename {src => packages/app/src}/components/monitor/PlayerControls/index.tsx (100%) rename {src => packages/app/src}/components/monitor/README.md (100%) rename {src => packages/app/src}/components/monitor/Separator/index.tsx (100%) rename {src => packages/app/src}/components/monitor/StaticPlayer/index.tsx (100%) rename {src => packages/app/src}/components/monitor/UniversalPlayer/index.tsx (94%) rename {src => packages/app/src}/components/monitor/icons/icon-switch.tsx (100%) rename {src => packages/app/src}/components/monitor/icons/single-icon.tsx (100%) rename {src => packages/app/src}/components/monitor/index.tsx (100%) rename {src => packages/app/src}/components/monitor/utils/splitElapsedTime.tsx (100%) rename {src => packages/app/src}/components/monitor/utils/zeroPad.ts (100%) rename {src => packages/app/src}/components/settings/assistant.tsx (100%) rename {src => packages/app/src}/components/settings/constants.ts (100%) rename {src => packages/app/src}/components/settings/editors.tsx (100%) rename {src => packages/app/src}/components/settings/image.tsx (100%) rename {src => packages/app/src}/components/settings/index.tsx (100%) rename {src => packages/app/src}/components/settings/music.tsx (100%) rename {src => packages/app/src}/components/settings/provider.tsx (100%) rename {src => packages/app/src}/components/settings/sound.tsx (100%) rename {src => packages/app/src}/components/settings/video.tsx (100%) rename {src => packages/app/src}/components/settings/voice.tsx (100%) rename {src => packages/app/src}/components/tags/Tag.tsx (100%) rename {src => packages/app/src}/components/tags/colors.ts (100%) rename {src => packages/app/src}/components/tags/types.ts (100%) rename {src => packages/app/src}/components/tasks/TaskStatusUpdate.tsx (100%) rename {src => packages/app/src}/components/tasks/useTasks.tsx (100%) rename {src => packages/app/src}/components/toolbars/bottom-bar/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/bottom-bar/metrics/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/bottom-bar/tasks/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/editors-menu/EditorsSideMenu.tsx (100%) rename {src => packages/app/src}/components/toolbars/editors-menu/EditorsSideMenuItem.tsx (100%) rename {src => packages/app/src}/components/toolbars/editors-menu/NatureIcon.tsx (100%) rename {src => packages/app/src}/components/toolbars/system-menu/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-bar/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/ActivitySpinner/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/IsBusy/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/ToggleFullScreen/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/ToggleView/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/ToggleWindowLayout/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/TopMenuLogo/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/assistant/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/constants.ts (100%) rename {src => packages/app/src}/components/toolbars/top-menu/edit/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/file/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/image/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/AssistantWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/RenderingStrategyList.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/ThemeList.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/formatProvider.ts (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/getWorkflowProviders.ts (100%) rename {src => packages/app/src}/components/toolbars/top-menu/lists/hasNoPublicAPI.ts (100%) rename {src => packages/app/src}/components/toolbars/top-menu/music/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/plugins/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/sound/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/video/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/view/index.tsx (100%) rename {src => packages/app/src}/components/toolbars/top-menu/voice/index.tsx (100%) rename {src => packages/app/src}/components/tree-browsers/style/treeNodeStyles.ts (100%) rename {src => packages/app/src}/components/tree-browsers/types.ts (100%) rename {src => packages/app/src}/components/tree-browsers/utils/getCollectionColor.ts (100%) rename {src => packages/app/src}/components/tree-browsers/utils/getCollectionItemTextColor.ts (100%) rename {src => packages/app/src}/components/tree-browsers/utils/getItemColor.ts (100%) rename {src => packages/app/src}/components/tree-browsers/utils/isSomething.ts (100%) rename {src => packages/app/src}/components/ui/accordion.tsx (100%) rename {src => packages/app/src}/components/ui/alert.tsx (100%) rename {src => packages/app/src}/components/ui/avatar.tsx (100%) rename {src => packages/app/src}/components/ui/badge.tsx (100%) rename {src => packages/app/src}/components/ui/button.tsx (100%) rename {src => packages/app/src}/components/ui/card.tsx (100%) rename {src => packages/app/src}/components/ui/checkbox.tsx (100%) rename {src => packages/app/src}/components/ui/collapsible.tsx (100%) rename {src => packages/app/src}/components/ui/command.tsx (100%) rename {src => packages/app/src}/components/ui/dialog.tsx (100%) rename {src => packages/app/src}/components/ui/dropdown-menu.tsx (100%) rename {src => packages/app/src}/components/ui/input.tsx (100%) rename {src => packages/app/src}/components/ui/label.tsx (100%) rename {src => packages/app/src}/components/ui/menubar.tsx (100%) rename {src => packages/app/src}/components/ui/popover.tsx (100%) rename {src => packages/app/src}/components/ui/progress.tsx (100%) rename {src => packages/app/src}/components/ui/scroll-area.tsx (100%) rename {src => packages/app/src}/components/ui/select.tsx (100%) rename {src => packages/app/src}/components/ui/separator.tsx (100%) rename {src => packages/app/src}/components/ui/sheet.tsx (100%) rename {src => packages/app/src}/components/ui/slider.tsx (100%) rename {src => packages/app/src}/components/ui/sonner.tsx (100%) rename {src => packages/app/src}/components/ui/switch.tsx (100%) rename {src => packages/app/src}/components/ui/table.tsx (100%) rename {src => packages/app/src}/components/ui/tabs.tsx (100%) rename {src => packages/app/src}/components/ui/textarea.tsx (100%) rename {src => packages/app/src}/components/ui/toast.tsx (100%) rename {src => packages/app/src}/components/ui/toaster.tsx (100%) rename {src => packages/app/src}/components/ui/tooltip.tsx (100%) rename {src => packages/app/src}/components/ui/use-toast.ts (100%) rename {src => packages/app/src}/components/ui/vertical-slider.tsx (100%) rename {src => packages/app/src}/components/uikit/default/button.tsx (98%) rename {src => packages/app/src}/components/uikit/default/theme.tsx (100%) rename {src => packages/app/src}/components/windows/index.tsx (100%) rename {src => packages/app/src}/components/wizards/project/index.tsx (100%) rename {src => packages/app/src}/experiments/README.md (100%) rename {src => packages/app/src}/experiments/moodboard/MoodboardView.tsx (100%) rename {src => packages/app/src}/experiments/moodboard/Node.tsx (100%) rename {src => packages/app/src}/experiments/samples/demo.ts (100%) rename {src => packages/app/src}/lib/core/constants.ts (100%) rename {src => packages/app/src}/lib/ffmpeg/convertAudioToMp3.ts (100%) rename {src => packages/app/src}/lib/ffmpeg/getMediaInfo.ts (100%) rename {src => packages/app/src}/lib/hf/adapter/README.md (100%) rename {src => packages/app/src}/lib/hf/adapter/adaptAnyInputsToGradioInputs.ts (100%) rename {src => packages/app/src}/lib/hf/adapter/findMainGradioEndpoint.ts (100%) rename {src => packages/app/src}/lib/hf/adapter/getAdaptationScore.ts (100%) rename {src => packages/app/src}/lib/hf/adapter/getDefaultFields.ts (100%) rename {src => packages/app/src}/lib/hf/adapter/identifyField.ts (100%) rename {src => packages/app/src}/lib/hf/callGradioApi.ts (100%) rename {src => packages/app/src}/lib/hf/cloneSpace.ts (100%) rename {src => packages/app/src}/lib/hf/getCurrentOwner.ts (100%) rename {src => packages/app/src}/lib/hf/getGradioApiInfo.ts (100%) rename {src => packages/app/src}/lib/hf/getSpaceStatus.ts (100%) rename {src => packages/app/src}/lib/hf/getSpaces.ts (100%) rename {src => packages/app/src}/lib/hf/parseHuggingFaceHubId.test.ts (100%) rename {src => packages/app/src}/lib/hf/parseHuggingFaceHubId.ts (100%) rename {src => packages/app/src}/lib/hf/runSpace.ts (100%) rename {src => packages/app/src}/lib/hf/types.ts (100%) rename {src => packages/app/src}/lib/hf/useMyGradioSpaces.ts (100%) rename {src => packages/app/src}/lib/hooks/README.md (100%) rename {src => packages/app/src}/lib/hooks/index.ts (100%) rename {src => packages/app/src}/lib/hooks/useAnimationFrame.ts (100%) rename {src => packages/app/src}/lib/hooks/useDebounce.ts (100%) rename {src => packages/app/src}/lib/hooks/useFullscreenStatus.ts (100%) rename {src => packages/app/src}/lib/hooks/useOpenFilePicker.ts (100%) rename {src => packages/app/src}/lib/hooks/usePerformanceMeter.ts (100%) rename {src => packages/app/src}/lib/hooks/useQueryStringParams.ts (100%) rename {src => packages/app/src}/lib/hooks/useRequestAnimationFrame.ts (100%) rename {src => packages/app/src}/lib/hooks/useTitle.ts (100%) rename {src => packages/app/src}/lib/kdenlive/README.md (100%) rename {src => packages/app/src}/lib/kdenlive/entry.ts (100%) rename {src => packages/app/src}/lib/kdenlive/index.ts (100%) rename {src => packages/app/src}/lib/kdenlive/kdenlive.ts (100%) rename {src => packages/app/src}/lib/kdenlive/makeIDGen.ts (100%) rename {src => packages/app/src}/lib/kdenlive/playlist.ts (100%) rename {src => packages/app/src}/lib/kdenlive/producer.ts (100%) rename {src => packages/app/src}/lib/kdenlive/producer_original.ts (100%) rename {src => packages/app/src}/lib/kdenlive/tractor.ts (100%) rename {src => packages/app/src}/lib/utils/addBase64Header.ts (100%) rename {src => packages/app/src}/lib/utils/base64DataUriToBlob.test.ts (100%) rename {src => packages/app/src}/lib/utils/base64DataUriToBlob.ts (100%) rename {src => packages/app/src}/lib/utils/base64DataUriToFile.ts (100%) rename {src => packages/app/src}/lib/utils/base64DataUriToUint8Array.ts (100%) rename {src => packages/app/src}/lib/utils/blobToBase64DataUri.ts (100%) rename {src => packages/app/src}/lib/utils/cn.test.ts (100%) rename {src => packages/app/src}/lib/utils/cn.ts (100%) rename {src => packages/app/src}/lib/utils/convertToJpeg.ts (100%) rename {src => packages/app/src}/lib/utils/debounceAsync.ts (100%) rename {src => packages/app/src}/lib/utils/debounceSync.ts (100%) rename {src => packages/app/src}/lib/utils/decodeOutput.ts (100%) rename {src => packages/app/src}/lib/utils/fetchContentToBase64.ts (100%) rename {src => packages/app/src}/lib/utils/findClosest.ts (100%) rename {src => packages/app/src}/lib/utils/formatDuration.test.ts (100%) rename {src => packages/app/src}/lib/utils/formatDuration.ts (100%) rename {src => packages/app/src}/lib/utils/formatSegmentForExport.test.ts (100%) rename {src => packages/app/src}/lib/utils/formatSegmentForExport.ts (100%) rename {src => packages/app/src}/lib/utils/getTypeAndExtension.test.ts (100%) rename {src => packages/app/src}/lib/utils/getTypeAndExtension.ts (100%) rename {src => packages/app/src}/lib/utils/getValidBoolean.ts (100%) rename {src => packages/app/src}/lib/utils/getValidComfyWorkflowTemplate.test.ts (100%) rename {src => packages/app/src}/lib/utils/getValidComfyWorkflowTemplate.ts (100%) rename {src => packages/app/src}/lib/utils/getValidNumber.ts (100%) rename {src => packages/app/src}/lib/utils/getValidString.ts (100%) rename {src => packages/app/src}/lib/utils/index.ts (100%) rename {src => packages/app/src}/lib/utils/isValidNumber.ts (100%) rename {src => packages/app/src}/lib/utils/parseComfyIcuAccelerator.ts (100%) rename {src => packages/app/src}/lib/utils/parsePdfToIndentedText.ts (100%) rename {src => packages/app/src}/lib/utils/sleep.ts (100%) rename {src => packages/app/src}/services/README.md (100%) rename {src => packages/app/src}/services/assistant/askAssistant.ts (100%) rename {src => packages/app/src}/services/assistant/getDefaultAssistantState.ts (100%) rename {src => packages/app/src}/services/assistant/parseRawInputToAction.ts (100%) rename {src => packages/app/src}/services/assistant/updateStoryAndScene.ts (100%) rename {src => packages/app/src}/services/assistant/useAssistant.ts (100%) rename {src => packages/app/src}/services/assistant/useVoiceAssistant.ts (100%) rename {src => packages/app/src}/services/audio/README.md (100%) rename {src => packages/app/src}/services/audio/analyzeAudio.ts (100%) rename {src => packages/app/src}/services/audio/detectBPM.ts (100%) rename {src => packages/app/src}/services/audio/getDefaultAudioState.ts (100%) rename {src => packages/app/src}/services/audio/startAudioSourceNode.ts (100%) rename {src => packages/app/src}/services/audio/useAudio.ts (100%) rename {src => packages/app/src}/services/autocomplete/extractCaptionFromFrameMoondream.ts (100%) rename {src => packages/app/src}/services/autocomplete/extractCaptionsFromFrames.ts (100%) rename {src => packages/app/src}/services/autocomplete/getDefaultAutocompleteState.ts (100%) rename {src => packages/app/src}/services/autocomplete/types.ts (100%) rename {src => packages/app/src}/services/autocomplete/useAutocomplete.ts (100%) rename {src => packages/app/src}/services/broadcast/constants.ts (100%) rename {src => packages/app/src}/services/broadcast/getDefaultBroadcastState.ts (100%) rename {src => packages/app/src}/services/broadcast/useBroadcast.ts (100%) rename {src => packages/app/src}/services/debug.ts (100%) rename {src => packages/app/src}/services/editors/entity-editor/getDefaultEntityEditorState.ts (100%) rename {src => packages/app/src}/services/editors/entity-editor/useEntityEditor.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/README.md (100%) rename {src => packages/app/src}/services/editors/filter-editor/demo.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/analogLens.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/cinematic.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/colorMapping.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/colorTemperature.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/crossProcessing.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/filmDegradation.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/index.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/infrared.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/lomography.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/splitToning.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/toneMapping.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/filters/vintageFilm.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/getDefaultFilterEditorState.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/runFilterPipeline.ts (100%) rename {src => packages/app/src}/services/editors/filter-editor/useFilterEditor.ts (100%) rename {src => packages/app/src}/services/editors/getDefaultEditorsState.ts (100%) rename {src => packages/app/src}/services/editors/index.ts (100%) rename {src => packages/app/src}/services/editors/project-editor/getDefaultProjectEditorState.ts (100%) rename {src => packages/app/src}/services/editors/project-editor/useProjectEditor.ts (100%) rename {src => packages/app/src}/services/editors/script-editor/getDefaultScriptEditorState.ts (100%) rename {src => packages/app/src}/services/editors/script-editor/useScriptEditor.ts (100%) rename {src => packages/app/src}/services/editors/segment-editor/getDefaultSegmentEditorState.ts (100%) rename {src => packages/app/src}/services/editors/segment-editor/useSegmentEditor.ts (100%) rename {src => packages/app/src}/services/editors/useEditors.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/useDynamicWorkflows.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/useWorkflowEditor.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/_documentation_/demo_examples.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/aitube/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/anthropic/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/cohere/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/comfydeploy/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/comfyicu/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/comfyui/getComfyWorkflow.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/comfyui/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/common/comfyui/flux_plus_ultimatesdupscale.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/common/comfyui/text_to_image_demo_workflow.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/common/defaultValues.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/common/types.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/elevenlabs/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/falai/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/fireworksai/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/google/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/groq/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/huggingface/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/mistralai/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/openai/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/openart/samples/openart_workflow.json (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/replicate/index.ts (100%) rename {src => packages/app/src}/services/editors/workflow-editor/workflows/stabilityai/index.ts (100%) rename {src => packages/app/src}/services/index.ts (100%) rename {src => packages/app/src}/services/inputs/getDefaultInputsState.ts (100%) rename {src => packages/app/src}/services/inputs/types.ts (100%) rename {src => packages/app/src}/services/inputs/useInputs.ts (100%) rename {src => packages/app/src}/services/io/createFullVideo.ts (100%) rename {src => packages/app/src}/services/io/extractFramesFromVideo.ts (100%) rename {src => packages/app/src}/services/io/extractScenesFromVideo.ts (100%) rename {src => packages/app/src}/services/io/ffmpegUtils.ts (100%) rename {src => packages/app/src}/services/io/fileDataToBase64.ts (100%) rename {src => packages/app/src}/services/io/fix-xenova-transformers.d.ts (100%) rename {src => packages/app/src}/services/io/getDefaultIOState.ts (100%) rename {src => packages/app/src}/services/io/imageCaptioning.ts (100%) rename {src => packages/app/src}/services/io/parseFileIntoSegments.ts (100%) rename {src => packages/app/src}/services/io/parseFileName.ts (100%) rename {src => packages/app/src}/services/io/parseFilesIntoSegments.ts (100%) rename {src => packages/app/src}/services/io/useIO.ts (100%) rename {src => packages/app/src}/services/metrics/constants.ts (100%) rename {src => packages/app/src}/services/metrics/getDefaultClapWorkflowProviderMetrics.ts (100%) rename {src => packages/app/src}/services/metrics/getDefaultMetricsModelEstimations.ts (100%) rename {src => packages/app/src}/services/metrics/getDefaultMetricsModelStats.ts (100%) rename {src => packages/app/src}/services/metrics/getDefaultMetricsPerProvider.ts (100%) rename {src => packages/app/src}/services/metrics/getDefaultMetricsState.ts (100%) rename {src => packages/app/src}/services/metrics/types.ts (100%) rename {src => packages/app/src}/services/metrics/useMetrics.ts (100%) rename {src => packages/app/src}/services/mic/getDefaultMicState.ts (100%) rename {src => packages/app/src}/services/mic/useMic.ts (100%) rename {src => packages/app/src}/services/monitor/README.md (100%) rename {src => packages/app/src}/services/monitor/getDefaultMonitorState.ts (100%) rename {src => packages/app/src}/services/monitor/useMonitor.ts (100%) rename {src => packages/app/src}/services/plugins/constants.ts (100%) rename {src => packages/app/src}/services/plugins/fetchAndRun.ts (100%) rename {src => packages/app/src}/services/plugins/getDefaultPluginsState.ts (100%) rename {src => packages/app/src}/services/plugins/usePlugins.ts (100%) rename {src => packages/app/src}/services/renderer/constants.ts (100%) rename {src => packages/app/src}/services/renderer/getDefaultBufferedSegments.ts (100%) rename {src => packages/app/src}/services/renderer/getDefaultRendererState.ts (100%) rename {src => packages/app/src}/services/renderer/getSegmentCacheKey.ts (100%) rename {src => packages/app/src}/services/renderer/index.ts (100%) rename {src => packages/app/src}/services/renderer/useRenderLoop.ts (100%) rename {src => packages/app/src}/services/renderer/useRenderer.ts (100%) rename {src => packages/app/src}/services/resolver/constants.ts (100%) rename {src => packages/app/src}/services/resolver/getDefaultResolverState.ts (100%) rename {src => packages/app/src}/services/resolver/useResolver.ts (100%) rename {src => packages/app/src}/services/settings/getDefaultSettingsState.ts (100%) rename {src => packages/app/src}/services/settings/index.ts (100%) rename {src => packages/app/src}/services/settings/useSettings.ts (100%) rename {src => packages/app/src}/services/settings/workflows/image.ts (100%) rename {src => packages/app/src}/services/simulator/useDefaultSimulatorState.ts (100%) rename {src => packages/app/src}/services/simulator/useSimulator.ts (100%) rename {src => packages/app/src}/services/ui/getDefaultUIState.ts (100%) rename {src => packages/app/src}/services/ui/index.ts (100%) rename {src => packages/app/src}/services/ui/theme.ts (100%) rename {src => packages/app/src}/services/ui/useTheme.ts (100%) rename {src => packages/app/src}/services/ui/useUI.ts (100%) rename {src => packages/app/src}/services/windows/types.ts (100%) rename {src => packages/app/src}/services/windows/useWindows.ts (100%) rename tailwind.config.js => packages/app/tailwind.config.js (100%) rename {tests => packages/app/tests}/examples.spec.txt (100%) rename {tests => packages/app/tests}/main.spec.ts (100%) rename tsconfig.json => packages/app/tsconfig.json (100%) rename vitest.config.mts => packages/app/vitest.config.mts (100%) diff --git a/LICENCE.txt b/LICENSE.txt similarity index 100% rename from LICENCE.txt rename to LICENSE.txt diff --git a/package-lock.json b/package-lock.json index ff73b9cc..3c7f266c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21714 +1,20454 @@ { - "name": "clapper", - "version": "0.0.8", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "clapper", - "version": "0.0.8", - "license": "GPL-3.0-only", - "dependencies": { - "@aitube/broadway": "0.2.3", - "@aitube/clap": "0.2.3", - "@aitube/clapper-services": "0.2.3-2", - "@aitube/client": "0.2.3", - "@aitube/engine": "0.2.3", - "@aitube/timeline": "0.2.3", - "@fal-ai/serverless-client": "^0.13.0", - "@ffmpeg/ffmpeg": "^0.12.10", - "@ffmpeg/util": "^0.12.1", - "@gradio/client": "^1.5.0", - "@huggingface/hub": "^0.15.1", - "@huggingface/inference": "^2.8.0", - "@langchain/anthropic": "^0.2.14", - "@langchain/cohere": "^0.2.2", - "@langchain/core": "^0.2.23", - "@langchain/google-vertexai": "^0.0.25", - "@langchain/groq": "^0.0.16", - "@langchain/mistralai": "^0.0.28", - "@langchain/openai": "^0.2.6", - "@monaco-editor/react": "^4.6.0", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-menubar": "^1.0.4", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-progress": "^1.0.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-tooltip": "^1.0.7", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.106.0", - "@react-three/fiber": "^8.16.6", - "@react-three/uikit": "^0.3.4", - "@react-three/uikit-lucide": "^0.3.4", - "@saintno/comfyui-sdk": "^0.1.11", - "@tailwindcss/container-queries": "^0.1.1", - "@types/dom-speech-recognition": "^0.0.4", - "@types/pngjs": "^6.0.5", - "@xenova/transformers": "github:xenova/transformers.js#v3", - "@xyflow/react": "^12.0.3", - "autoprefixer": "10.4.19", - "base64-arraybuffer": "^1.0.2", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^0.2.1", - "comfydeploy": "^0.0.21", - "date-fns": "^3.6.0", - "dotenv": "^16.4.5", - "fflate": "^0.8.2", - "fluent-ffmpeg": "^2.1.3", - "framer-motion": "11.1.7", - "fs-extra": "^11.2.0", - "is-hotkey": "^0.2.0", - "lucide-react": "^0.396.0", - "mediainfo.js": "^0.3.2", - "mlt-xml": "^2.0.2", - "monaco-editor": "^0.50.0", - "next": "^14.2.5", - "next-themes": "^0.3.0", - "pngjs": "^7.0.0", - "qs": "^6.12.1", - "query-string": "^9.0.0", - "react": "^18.3.1", - "react-device-frameset": "^1.3.4", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-drag-drop-files": "^2.3.10", - "react-error-boundary": "^4.0.13", - "react-hook-consent": "^3.5.3", - "react-hotkeys-hook": "^4.5.0", - "react-icons": "^5.2.1", - "react-markdown": "^9.0.1", - "react-reflex": "^4.2.6", - "react-speakup": "^1.0.0", - "remark-gfm": "^4.0.0", - "replicate": "^0.32.0", - "sharp": "0.33.4", - "sonner": "^1.5.0", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "three": "^0.164.1", - "ts-node": "^10.9.2", - "use-file-picker": "^2.1.2", - "usehooks-ts": "^2.14.0", - "uuid": "^9.0.1", - "web-audio-beat-detector": "^8.2.12", - "yaml": "^2.4.5", - "zustand": "4.5.2", - "zx": "^8.1.4" - }, - "devDependencies": { - "@electron-forge/cli": "^7.4.0", - "@electron-forge/maker-deb": "^7.4.0", - "@electron-forge/maker-dmg": "^7.4.0", - "@electron-forge/maker-rpm": "^7.4.0", - "@electron-forge/maker-squirrel": "^7.4.0", - "@electron-forge/maker-zip": "^7.4.0", - "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", - "@electron-forge/publisher-github": "^7.4.0", - "@playwright/test": "^1.45.1", - "@testing-library/react": "^16.0.0", - "@types/fluent-ffmpeg": "^2.1.24", - "@types/is-hotkey": "^0.1.10", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@types/uuid": "^9.0.8", - "@vitejs/plugin-react": "^4.3.1", - "@webgpu/types": "^0.1.44", - "electron": "^31.2.1", - "eslint": "^8", - "eslint-config-next": "14.2.5", - "eslint-config-prettier": "^9.1.0", - "jsdom": "^24.1.0", - "node-gyp": "^10.2.0", - "postcss": "^8", - "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.5", - "tailwind-scrollbar": "^3.1.0", - "tailwindcss": "^3.4.3", - "typescript": "^5.5.0", - "vitest": "^2.0.2" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-libvips-win32-ia32": "1.0.2", - "@img/sharp-libvips-win32-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/@aitube/broadway": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/broadway/-/broadway-0.2.3.tgz", - "integrity": "sha512-zuJ8zsVbTury3Phw7flMit8TnlnlLaSympkuxdR1Aea5YeZOOZmJh5+S/Y1f+xkcj9wox2ej8J8XGfIJWbd3RA==", - "dependencies": { - "@datagica/parse-entities": "^0.3.0", - "@datagica/parse-names": "^0.0.8", - "indexeddb-fs": "^2.1.5" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/colors": "0.2.3" - } - }, - "node_modules/@aitube/clap": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.2.3.tgz", - "integrity": "sha512-qT0wI6R5BrkIWDr1Dog/GPMYjKnwy5glwO3MibPcM0BWJVQlbj0cy0qbwH+wZPC1ZmRZnaJPlhCEj5e3/U6UsA==", - "dependencies": { - "pure-uuid": "^1.8.1" - }, - "peerDependencies": { - "yaml": "^2.5.0" - } - }, - "node_modules/@aitube/clapper-services": { - "version": "0.2.3-2", - "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.2.3-2.tgz", - "integrity": "sha512-Qd6Riridk4FVcTjlscxw5wsbUgojwi1wkTIjlgPluhT5J5kLyEJQL/hmT2gBDBRsB4kyieVNZiGflgXnauDENw==", - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/timeline": "0.2.3", - "@monaco-editor/react": "4.6.0", - "monaco-editor": "0.50.0", - "react": "*", - "react-dom": "*", - "zustand": "4.5.2" - } - }, - "node_modules/@aitube/client": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/client/-/client-0.2.3.tgz", - "integrity": "sha512-REgFjqvK2I+Qe4tbabHwtU5uNxQwOHMXY2XQAIN34Ff7wrd4Y4vaWB3EZ37l/yKgt7Bd3kldp2ddDt09osedMQ==", - "dependencies": { - "query-string": "^9.0.0" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "node_modules/@aitube/colors": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/colors/-/colors-0.2.3.tgz", - "integrity": "sha512-bqie0eFUG/UA62lhJIibCVPdBNyudqE9YF6HoWMY2JpFtjV3EHJlla3NuXtTgfTgs7XGcmtTyqoXtmPsRSHZtw==", - "peer": true, - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "node_modules/@aitube/engine": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/engine/-/engine-0.2.3.tgz", - "integrity": "sha512-y6KktN1BU5L/WFC5rrNwx0CHdQYM9xPJX1fTPZVDYfZC/6NJhn1Rm1SAnV1SkkP+3NCDQBabKvUivjmZY0CFDw==", - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "node_modules/@aitube/timeline": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.2.3.tgz", - "integrity": "sha512-zr9G5t/koz/vwXxKHs2qFot5gSau72J+luTfBK0o1tgf/TK/+yP6ACO3QbO8kAmkqa6wtWuBHdVXkVceB8z7Rw==", - "dependencies": { - "date-fns": "^3.6.0", - "react-virtualized-auto-sizer": "^1.0.24" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@radix-ui/react-slider": "^1.1.2", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.105.4", - "@react-three/fiber": "^8.16.2", - "clsx": "^2.1.1", - "react": "*", - "react-dom": "*", - "tailwind-merge": "^2.4.0", - "tailwindcss": "^3.4.6", - "three": "^0.164.1", - "zustand": "4.5.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", - "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/crc32/node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.624.0.tgz", - "integrity": "sha512-imw3bNptHdhcogU3lwSVlQJsRpTxnkT4bQbchS/qX6+fF0Pk6ERZ+Q0YjzitPqTjkeyAWecUT4riyqv2djo+5w==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sagemaker": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.624.0.tgz", - "integrity": "sha512-J04HAxGhC3dQRn43aPcPL6C+uW0wd0gR/dehFqJJA+XvSNLxa9HEiTjYUHCHUY+iaLQn5QCk7ICKRosynhQkxw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", - "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", - "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", - "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", - "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.624.0.tgz", - "integrity": "sha512-gbXaxZP29yzMmEUzsGqUrHpKBnfMBtemvrlufJbaz/MGJNIa5qtJQp7n1LMI5R49DBVUN9s/e9Rf5liyMvlHiw==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", - "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", - "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.624.0.tgz", - "integrity": "sha512-SX+F5x/w8laQkhXLd1oww2lTuBDJSxzXWyxuOi25a9s4bMDs0V/wOj885Vr6h8QEGi3F8jZ8aWLwpsm2yuk9BA==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/credential-provider-cognito-identity": "3.624.0", - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.374.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.374.0.tgz", - "integrity": "sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==", - "deprecated": "This package has moved to @smithy/protocol-http", - "dependencies": { - "@smithy/protocol-http": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/protocol-http": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", - "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", - "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4": { - "version": "3.374.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.374.0.tgz", - "integrity": "sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==", - "deprecated": "This package has moved to @smithy/signature-v4", - "dependencies": { - "@smithy/signature-v4": "^1.0.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", - "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/signature-v4": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", - "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", - "dependencies": { - "@smithy/eventstream-codec": "^1.1.0", - "@smithy/is-array-buffer": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "@smithy/util-middleware": "^1.1.0", - "@smithy/util-uri-escape": "^1.1.0", - "@smithy/util-utf8": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", - "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", - "dependencies": { - "@smithy/is-array-buffer": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", - "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-middleware": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", - "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-uri-escape": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", - "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", - "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", - "dependencies": { - "@smithy/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@datagica/fast-index": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@datagica/fast-index/-/fast-index-0.1.0.tgz", - "integrity": "sha512-e6jK4wWGROc8lgps2agayuKXQIqOjvTL8brgFLEtzUzYwdVbzfc8foOW4SpmA43/desLU1YgoASredFmmFWqcQ==" - }, - "node_modules/@datagica/parse-entities": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@datagica/parse-entities/-/parse-entities-0.3.0.tgz", - "integrity": "sha512-Ai/SZAANZ4sUpcAIeW8C7M5I5tVymKengXaKYiNtmJmWBl79e+VBWUPxcv2DLmIcZ5CQxWnJUgSVyQ9NIfyQUw==", - "dependencies": { - "@datagica/treegram": "^0.3.0" - } - }, - "node_modules/@datagica/parse-names": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@datagica/parse-names/-/parse-names-0.0.8.tgz", - "integrity": "sha512-wfpGYgJIB35XOPlb4CFC148XrYcbXN+ZP3pt/mSJbxF46tyacgfZ+9+KHfDK0M0H6eKx7Ngm1DhYCbAY3JyXyA==", - "dependencies": { - "@datagica/parse-entities": "^0.2.7" - } - }, - "node_modules/@datagica/parse-names/node_modules/@datagica/fast-index": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@datagica/fast-index/-/fast-index-0.0.7.tgz", - "integrity": "sha512-S0bBOIh15KRjQkUvmGijhPci8K+/k0yw5oatGwDGPL1AOVoJNkXt8d8Dnt71k7uWr1S2k4akIlytkh9V3TrlQw==" - }, - "node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@datagica/parse-entities/-/parse-entities-0.2.8.tgz", - "integrity": "sha512-RP0ol+uG7jzpWR3kBZMtoQ3/8F71Sjrt/3LtDp6By3/8EA5wxeHCXwy8iqFQUpQiC0L1K9sjg0wRjKqLwECw2g==", - "dependencies": { - "@datagica/treegram": "^0.2.8" - } - }, - "node_modules/@datagica/parse-names/node_modules/@datagica/treegram": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@datagica/treegram/-/treegram-0.2.9.tgz", - "integrity": "sha512-IDhQUFmA8TqkjBnJtXRXFTPOPmorJswFEw7k5YCbxvLj7O2hqojs5pfCaS31rdOe0VXxmde+AFidUZqVtLaR6w==", - "dependencies": { - "@datagica/fast-index": "^0.0.7", - "@datagica/tokenize": "^0.0.2" - } - }, - "node_modules/@datagica/tokenize": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@datagica/tokenize/-/tokenize-0.0.2.tgz", - "integrity": "sha512-MmZwlj5yzp3HzFSFEYOCvzC/IURsaQmRuLKy5rfoOzPk7NPHYnq0Vct9MxeZ+3jjRoTHI/PpUlDKKF93ngVe7Q==" - }, - "node_modules/@datagica/treegram": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@datagica/treegram/-/treegram-0.3.0.tgz", - "integrity": "sha512-iZAqiQI1jsgI+MYwbCRhKUpev+eIVyP0JZoL/E7rJE0k5V5yTbunt7K/KyyLYRpGfRIkzaDga1qfr8wrskeJIQ==", - "dependencies": { - "@datagica/fast-index": "^0.1.0", - "@datagica/tokenize": "^0.0.2" - } - }, - "node_modules/@electron-forge/cli": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.4.0.tgz", - "integrity": "sha512-a+zZv3ja/IxkJzNyx4sOHSZv6DPV85S0PEVF6pcRjUpbDL5r+DxjRFsNc0Nq4UIWyFm1nw7RWoPdd9uDst4Tvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "@electron-forge/core": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@electron/get": "^3.0.0", - "chalk": "^4.0.0", - "commander": "^4.1.1", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "listr2": "^7.0.2", - "semver": "^7.2.1" - }, - "bin": { - "electron-forge": "dist/electron-forge.js", - "electron-forge-vscode-nix": "script/vscode.sh", - "electron-forge-vscode-win": "script/vscode.cmd" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/cli/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/core": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.4.0.tgz", - "integrity": "sha512-pYHKpB2CKeQgWsb+gox+FPkEvP+6Q2zGj2eZtgZRtKppoWIXrHIpOtcm6FllJ/gZ5u4AsQzVIYReAHGaBa0osw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "@electron-forge/core-utils": "7.4.0", - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/plugin-base": "7.4.0", - "@electron-forge/publisher-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "@electron-forge/template-vite": "7.4.0", - "@electron-forge/template-vite-typescript": "7.4.0", - "@electron-forge/template-webpack": "7.4.0", - "@electron-forge/template-webpack-typescript": "7.4.0", - "@electron-forge/tracer": "7.4.0", - "@electron/get": "^3.0.0", - "@electron/packager": "^18.3.1", - "@electron/rebuild": "^3.2.10", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "fast-glob": "^3.2.7", - "filenamify": "^4.1.0", - "find-up": "^5.0.0", - "fs-extra": "^10.0.0", - "got": "^11.8.5", - "interpret": "^3.1.1", - "listr2": "^7.0.2", - "lodash": "^4.17.20", - "log-symbols": "^4.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "rechoir": "^0.8.0", - "resolve-package": "^1.0.1", - "semver": "^7.2.1", - "source-map-support": "^0.5.13", - "sudo-prompt": "^9.1.1", - "username": "^5.1.0", - "yarn-or-npm": "^3.0.1" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/core-utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.4.0.tgz", - "integrity": "sha512-9RLG0F9SX466TpkaTcW+V15KmnGuTpmr7NKMRlngtHXmnkBUJz4Mxp1x33WZLgL90dJrxrRgHSfVBtA4lstDPw==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron/rebuild": "^3.2.10", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "find-up": "^5.0.0", - "fs-extra": "^10.0.0", - "log-symbols": "^4.0.0", - "semver": "^7.2.1", - "yarn-or-npm": "^3.0.1" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/core-utils/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/core/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.4.0.tgz", - "integrity": "sha512-LwWS4VPdwjISl1KpLhmM1Qr1M3sRTTQ/RsX+GlFd7cQ1W/FsgxMjaTG4Od1d+a5CGVTh3s6X2g99TSUfxjOveg==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/maker-base/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-deb": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.4.0.tgz", - "integrity": "sha512-npWea3IpGeu96xNqJpsCOYX6V4E+HY6u/okeTUzUOMX96UteT14MecdUefMam158glRTX84k2ryh7WcBoOa4mg==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-debian": "^3.2.0" - } - }, - "node_modules/@electron-forge/maker-dmg": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.4.0.tgz", - "integrity": "sha512-xRCMNtnpvQNwrDYvwbVFegnErnIMpHGZANrjwushlH9+Fsu60DFvf5s3AVkgsYdQTqlY7wYRG1mziYZmRlPAIw==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-dmg": "^4.0.0" - } - }, - "node_modules/@electron-forge/maker-dmg/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-rpm": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.4.0.tgz", - "integrity": "sha512-N64Yh/K/91GzIk28T1jKsCGgYaquDuhXcEJW+TkVyP5tPZ9aTz9SjXLBxAg8WhcroArAZEsVyPOFKthmFzAUuA==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-redhat": "^3.2.0" - } - }, - "node_modules/@electron-forge/maker-squirrel": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.4.0.tgz", - "integrity": "sha512-mCQyufnSNfjffiKho59ZqVg4W601zGOl6h01OyfDwjOU/G4iQtpnnDEOXGe26q7OVT5ORb1WDnfyGgBeJ6Ge7g==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-winstaller": "^5.3.0" - } - }, - "node_modules/@electron-forge/maker-squirrel/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-zip": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.4.0.tgz", - "integrity": "sha512-UGbMdpuK/P29x1FFRWNOs3bNz+7QNFWVWyTM5hcWqib66cNuUmoaPifQyuwW2POIrIohrxlzLK87/i9Zc8g4dA==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "cross-zip": "^4.0.0", - "fs-extra": "^10.0.0", - "got": "^11.8.5" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/maker-zip/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/plugin-auto-unpack-natives": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.4.0.tgz", - "integrity": "sha512-jJ/v2blH32bcvdlJbeeW/yO99K9SduW8yrS7zuFN6y+B1cmzLd+S7L8oCcOghFDMAlYjQaBlnCe/nMJbT9mN4g==", - "dev": true, - "dependencies": { - "@electron-forge/plugin-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/plugin-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.4.0.tgz", - "integrity": "sha512-LcTNtEc2YaWvhhqWVIfdJ+J0/krSgc2dqYAHhOH2aLUSm9End3dKO/PZ1Y6DPsiPiJKHnSLBJ/XBN/16NY4Sjw==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/publisher-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.4.0.tgz", - "integrity": "sha512-PiJk4RfaC55SnVnteLW2ZIQNM9DpGOi6YoUn5t8i9UcVp2rFIdya7bJY/b9u1hwubm4d5+TdypMVEuJjM44CJQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/publisher-github": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-github/-/publisher-github-7.4.0.tgz", - "integrity": "sha512-hrxKNssJyU8Yuz0qv384y5RKojMG0nWeG7/kidjp8PX/RnqjGRU/JJ0Worl28g8LGiLt5R5JIfNLngLaFMn8tg==", - "dev": true, - "dependencies": { - "@electron-forge/publisher-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@octokit/core": "^3.2.4", - "@octokit/plugin-retry": "^3.0.9", - "@octokit/request-error": "^2.0.5", - "@octokit/rest": "^18.0.11", - "@octokit/types": "^6.1.2", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "log-symbols": "^4.0.0", - "mime-types": "^2.1.25" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/publisher-github/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/shared-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.4.0.tgz", - "integrity": "sha512-5Ehy6enUjBaU08odf9u9TOhmOVXlqobzMvKUixtkdAWgV1XZAUJmn+p21xhj0IkO92MQiXMGv66w9pDNjRT8uQ==", - "dev": true, - "dependencies": { - "@electron-forge/tracer": "7.4.0", - "@electron/packager": "^18.3.1", - "@electron/rebuild": "^3.2.10", - "listr2": "^7.0.2" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.4.0.tgz", - "integrity": "sha512-3YWdRSGzQfQPQkQxStn2wkJ/SuNGGKo9slwFJGvqMV+Pbx3/M/hYi9sMXOuaqVZgeaBp8Ap27yFPxaIIOC3vcA==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "username": "^5.1.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-base/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-vite": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.4.0.tgz", - "integrity": "sha512-YPVyCGiBKmZPCxK/Bd2louV3PBcxI2nT2+tRKP+mlEHOWrxbZIfmZSR2lIAFvK/ALKlwUKROdmlwyi7ZcdT7JQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-vite-typescript": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.4.0.tgz", - "integrity": "sha512-wdByG807VWcUd81E6572b/G/Ki8gb+GrCIWxO7Cl3qBa+yNaU1sHhBwB1RyTbQy1r8ubSBtsWrRD1J/yzHKWoQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-vite-typescript/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-vite/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-webpack": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.4.0.tgz", - "integrity": "sha512-W558AEGwQrwEtKIbIJPPs0LIsaC/1Vncj5NgqKehEMJjBb0KQq4hwBu/6dauQrfun4jRCOp7LV+OVrf5XPJ7QA==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-webpack-typescript": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.4.0.tgz", - "integrity": "sha512-O5gwjNSGFNRdJWyiCtevcOBDPAMhgOPvLORh9qR1GcjyTutWwHWmZzycqH+MmkhpQPgrAYDEeipXcOQhSbzNZA==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-webpack-typescript/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-webpack/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/tracer": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.4.0.tgz", - "integrity": "sha512-F4jbnDn4yIZjmky1FZ6rgBKTM05AZQQfHkyJW2hdS4pDKJjdKAqWytoZKDi1/S6Cr6tN+DD0TFGD3V0i6HPHYQ==", - "dev": true, - "dependencies": { - "chrome-trace-event": "^1.0.3" - }, - "engines": { - "node": ">= 14.17.5" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", - "dev": true, - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", - "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", - "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "dev": true, - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/packager": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.3.tgz", - "integrity": "sha512-hGXzwbUdxv49XvlYwlVPC6W6j6WaXUAzKkYyyTeiwdhxvHFMfQSEJxVHsQpqMFzZZ7wrr7iqiokOFZ/qkgEzUQ==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "@electron/get": "^3.0.0", - "@electron/notarize": "^2.1.0", - "@electron/osx-sign": "^1.0.5", - "@electron/universal": "^2.0.1", - "@electron/windows-sign": "^1.0.0", - "debug": "^4.0.1", - "extract-zip": "^2.0.0", - "filenamify": "^4.1.0", - "fs-extra": "^11.1.0", - "galactus": "^1.0.0", - "get-package-info": "^1.0.0", - "junk": "^3.1.0", - "parse-author": "^2.0.0", - "plist": "^3.0.0", - "resedit": "^2.0.0", - "resolve": "^1.1.6", - "semver": "^7.1.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "electron-packager": "bin/electron-packager.js" - }, - "engines": { - "node": ">= 16.13.0" - }, - "funding": { - "url": "https://github.com/electron/packager?sponsor=1" - } - }, - "node_modules/@electron/rebuild": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", - "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@electron/rebuild/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@electron/rebuild/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/rebuild/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@electron/rebuild/node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/@electron/rebuild/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@electron/rebuild/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/windows-sign": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.3.tgz", - "integrity": "sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw==", - "dev": true, - "dependencies": { - "cross-dirname": "^0.1.0", - "debug": "^4.3.4", - "fs-extra": "^11.1.1", - "minimist": "^1.2.8", - "postject": "^1.0.0-alpha.6" - }, - "bin": { - "electron-windows-sign": "bin/electron-windows-sign.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", - "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fal-ai/serverless-client": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@fal-ai/serverless-client/-/serverless-client-0.13.0.tgz", - "integrity": "sha512-Nkb/5YXJIPQHzM79+fRb1LZ1zQLSSvNhDVL2l62sN6/H4XqAWueIOqAAvPF8ds39uSGn8nF1WQV1mt7raVMlWw==", - "dependencies": { - "@msgpack/msgpack": "^3.0.0-beta2", - "eventsource-parser": "^1.1.2", - "robot3": "^0.4.1", - "uuid-random": "^1.3.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ffmpeg/ffmpeg": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.10.tgz", - "integrity": "sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ==", - "dependencies": { - "@ffmpeg/types": "^0.12.2" - }, - "engines": { - "node": ">=18.x" - } - }, - "node_modules/@ffmpeg/types": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.2.tgz", - "integrity": "sha512-NJtxwPoLb60/z1Klv0ueshguWQ/7mNm106qdHkB4HL49LXszjhjCCiL+ldHJGQ9ai2Igx0s4F24ghigy//ERdA==", - "engines": { - "node": ">=16.x" - } - }, - "node_modules/@ffmpeg/util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@ffmpeg/util/-/util-0.12.1.tgz", - "integrity": "sha512-10jjfAKWaDyb8+nAkijcsi9wgz/y26LOc1NKJradNMyCIl6usQcBbhkjX5qhALrSBcOy6TOeksunTYa+a03qNQ==", - "engines": { - "node": ">=18.x" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", - "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", - "dependencies": { - "@floating-ui/utils": "^0.2.7" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", - "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", - "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", - "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@gradio/client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@gradio/client/-/client-1.5.0.tgz", - "integrity": "sha512-ZQ1coiujVZjVfas0zyyFgVQOocUL+pnYJagRNfLTzCsJ0m/DXGngELhGTM/QjIVkJGVDuhUyY5VCM7vD1n4LDQ==", - "dependencies": { - "@types/eventsource": "^1.1.15", - "bufferutil": "^4.0.7", - "eventsource": "^2.0.2", - "fetch-event-stream": "^0.1.5", - "msw": "^2.2.1", - "semiver": "^1.1.0", - "textlinestream": "^1.1.1", - "typescript": "^5.0.0", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@huggingface/hub": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-0.15.1.tgz", - "integrity": "sha512-uHb4aFkJDoGfLeRHfFTjkI36Z8IV6Z1c+KzhMDqUSC56opyr7Mn1Nsx7Rri/C7KDwROhQfBp/fOOqqjTzn6Cgg==", - "dependencies": { - "@huggingface/tasks": "^0.10.6", - "hash-wasm": "^4.9.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/inference": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@huggingface/inference/-/inference-2.8.0.tgz", - "integrity": "sha512-Ti681P1qckcCAqgzmL53jBnluPuZGelmMIuXNjgAwC5+RIjF4S0SDQu6oy44ZTwekwNp2ETaZ2sXsOk+45aC4w==", - "dependencies": { - "@huggingface/tasks": "^0.11.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/inference/node_modules/@huggingface/tasks": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.11.8.tgz", - "integrity": "sha512-HOdx2vwhd/rCmy6gpDPiUbsXD+vwVpYSS/h2Tx+yV1uMDfS98MWl/TvoVGV+u5cJWTFbvdiTHMXIuw8B6JbHuQ==" - }, - "node_modules/@huggingface/jinja": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.0.tgz", - "integrity": "sha512-GLJzso0M07ZncFkrJMIXVU4os6GFbPocD4g8fMQPMGJubf48FtGOsUORH2rtFdXPIPelz8SLBMn8ZRmOTwXm9Q==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/tasks": { - "version": "0.10.22", - "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.10.22.tgz", - "integrity": "sha512-sCtp+A6sq6NXoUU7NXuXWoVNNjKddk1GTQIh3cJ6illF8S4zmFoerCVRvFf19BdgICGvF+RVZiv9sGGK9KRDTg==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", - "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", - "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=10.13", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", - "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", - "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", - "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", - "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", - "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-win32-ia32": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-win32-ia32/-/sharp-libvips-win32-ia32-1.0.2.tgz", - "integrity": "sha512-NDMPtXP7TTnm7588hpVwzUm48oMH3GOP8UKZLeBpL4yTLY89Jya3QBuKTVkh22GJGs8rV0ben7raSWXWsfMyww==", - "optional": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-win32-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-win32-x64/-/sharp-libvips-win32-x64-1.0.2.tgz", - "integrity": "sha512-rpNEXU8TJSrwmYh/pOoKNxsYcnA92MfuUmNWEz7Twb2kRffK23zIIIIf2Km3wqLhbLR2hqvGB5g2avN9SMQTvg==", - "optional": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", - "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", - "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", - "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", - "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", - "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", - "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", - "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", - "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", - "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", - "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.2", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.1.0", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@inquirer/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", - "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "optional": true, - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@langchain/anthropic": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.14.tgz", - "integrity": "sha512-qTFlsMej8SE0hz6IrqcQTkza/TGnlc7Tq/9W65TjQGLX51rGCYkprbLfpTi/LL9gahdB9VvB2Q5knUL0/N/xtQ==", - "dependencies": { - "@anthropic-ai/sdk": "^0.22.0", - "@langchain/core": ">=0.2.21 <0.3.0", - "fast-xml-parser": "^4.4.1", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/cohere": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@langchain/cohere/-/cohere-0.2.2.tgz", - "integrity": "sha512-XbH6vBnPz0dmJaTMKMFriFhh4eYiajYrEg7Jr0bdejj7s7lxhST92znNrJezi76LjSTtDQo3PyLBKDktk8OxKw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "cohere-ai": "^7.10.5", - "uuid": "^10.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/cohere/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/core": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.23.tgz", - "integrity": "sha512-elPg6WpAkxWEIGC9u38F2anbzqfYYEy32lJdsd9dtChcHSFmFLlXqa+SnpO3R772gUuJmcu+Pd+fCvmRFy029w==", - "dependencies": { - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", - "js-tiktoken": "^1.0.12", - "langsmith": "~0.1.39", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "p-retry": "4", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/core/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@langchain/core/node_modules/langsmith": { - "version": "0.1.41", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.41.tgz", - "integrity": "sha512-8R7s/225Pxmv0ipMfd6sqmWVsfHLQivYlQZ0vx5K+ReoknummTenQlVK8gapk3kqRMnzkrouuRHMhWjMR6RgUA==", - "dependencies": { - "@types/uuid": "^9.0.1", - "commander": "^10.0.1", - "p-queue": "^6.6.2", - "p-retry": "4", - "semver": "^7.6.3", - "uuid": "^9.0.0" - }, - "peerDependencies": { - "@langchain/core": "*", - "langchain": "*", - "openai": "*" - }, - "peerDependenciesMeta": { - "@langchain/core": { - "optional": true - }, - "langchain": { - "optional": true - }, - "openai": { - "optional": true - } - } - }, - "node_modules/@langchain/core/node_modules/langsmith/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/core/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/google-common": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/google-common/-/google-common-0.0.25.tgz", - "integrity": "sha512-5k9WrEAVT7po+NBa+36Xr2mkZzbw5JAV9kkdi4hjE3mCK8KS8s1kIqkbKZ4wfYCCP59ZcPs5MZayzbNdq8Dhag==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "uuid": "^10.0.0", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/google-common/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/google-gauth": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/google-gauth/-/google-gauth-0.0.25.tgz", - "integrity": "sha512-M6kFGZNDGwYNQvr0kNCMQEWvxk8P8yGDk/KQul9UjjWrAmJuJ8qsVEtucvTzFIppj4ee6LR5CGxSJSmIynKMhQ==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/google-common": "~0.0.25", - "google-auth-library": "^8.9.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/google-vertexai": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/google-vertexai/-/google-vertexai-0.0.25.tgz", - "integrity": "sha512-hXiTz7gsTXou8CXZVauDmFZWzsjIKUTBUa9hPgpxj/Rh3/EV6esixI9+HWVn20kATjaZ7bY1aD8RI0+krQ52vw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/google-gauth": "~0.0.25" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/groq": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@langchain/groq/-/groq-0.0.16.tgz", - "integrity": "sha512-rwD57PzT54clE4WigMzTMmA9rIifXq82uQ9nqFHJ4hfDV38P2lbQ1/N21QE0+L8c9oKvdY+TVm0vlilxV4w22A==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/openai": "~0.2.6", - "groq-sdk": "^0.5.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/mistralai": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-0.0.28.tgz", - "integrity": "sha512-6+6AUlRtNTw+fZatbrYNBaZn2Qgn8s+EMBhrpmT5pG4n5usQ57zIKT9VKfv4nJOauBF9J3+3+GiA4bwC8tmkNw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@mistralai/mistralai": "^0.4.0", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/mistralai/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/openai": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.6.tgz", - "integrity": "sha512-LZgSzHOZPJGsZr2ZXJICqZo1GN0kUyP9/RN+T45g7HDdMRfS5Df7fJgY9w7EIfznT83Q0Ywhz+At/UvWMR3xhw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "js-tiktoken": "^1.0.12", - "openai": "^4.55.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", - "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" - }, - "node_modules/@mistralai/mistralai": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.4.0.tgz", - "integrity": "sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==", - "dependencies": { - "node-fetch": "^2.6.7" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "dependencies": { - "@monaco-editor/loader": "^1.4.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", - "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@msgpack/msgpack": { - "version": "3.0.0-beta2", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", - "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@next/env": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", - "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", - "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", - "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", - "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", - "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz", - "integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "bottleneck": "^2.15.3" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", - "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", - "devOptional": true, - "dependencies": { - "playwright": "1.46.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@pmndrs/uikit": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@pmndrs/uikit/-/uikit-0.3.13.tgz", - "integrity": "sha512-DxKE1kHBnp6C7Bp57KwfPcM4BSwlE+7sbyntwzIyIBHPqH2786nEeZNn5hkYMIw9Gjw1ioEXRLoyIZ16UwYGfQ==", - "dependencies": { - "@preact/signals-core": "^1.5.1", - "inline-style-parser": "^0.2.3", - "node-html-parser": "^6.1.13", - "tw-to-css": "^0.0.12", - "yoga-layout": "^3.0.4" - }, - "peerDependencies": { - "three": ">=0.160" - } - }, - "node_modules/@preact/signals-core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", - "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", - "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.0.tgz", - "integrity": "sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collapsible": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", - "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz", - "integrity": "sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", - "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz", - "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", - "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", - "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", - "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", - "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", - "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", - "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", - "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", - "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x" - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", - "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", - "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.1.tgz", - "integrity": "sha512-V05Hryq/BE2m+rs8d5eLfrS0jmSWSDHEbG7jEyLA5D5J9jTvWj/o3v3xDN9YsOlH6QIkJgiaNDaP+S4T1rdykw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", - "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", - "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", - "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", - "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.0.tgz", - "integrity": "sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", - "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz", - "integrity": "sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", - "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", - "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", - "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", - "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", - "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", - "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", - "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", - "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", - "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" - }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" - }, - "node_modules/@react-spring/animated": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.4.tgz", - "integrity": "sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==", - "dependencies": { - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.4.tgz", - "integrity": "sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==", - "dependencies": { - "@react-spring/animated": "~9.7.4", - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.4.tgz", - "integrity": "sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.4.tgz", - "integrity": "sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==", - "dependencies": { - "@react-spring/rafz": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.4.tgz", - "integrity": "sha512-HKUhrrvWW7F/MAroObOloqcYyFqsUHp1ANIDvPVxk9cSh7veW7gQbJm2Sc7Ka+L4gVJEwSkS+MRfr8kk+sRZBw==", - "dependencies": { - "@react-spring/animated": "~9.7.4", - "@react-spring/core": "~9.7.4", - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.4.tgz", - "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==" - }, - "node_modules/@react-three/drei": { - "version": "9.109.5", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.5.tgz", - "integrity": "sha512-Ftw2d01N+83aXTOOMA5y8hF2KBU0w7gBEctyjeHJihUyRuLBdfcgfu5c1OhBjhrdy23ycSYRINaeLkqUBPDFxQ==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@mediapipe/tasks-vision": "0.10.8", - "@monogrid/gainmap-js": "^3.0.5", - "@react-spring/three": "~9.6.1", - "@use-gesture/react": "^10.2.24", - "camera-controls": "^2.4.2", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.28", - "glsl-noise": "^0.0.0", - "hls.js": "1.3.5", - "maath": "^0.10.7", - "meshline": "^3.1.6", - "react-composer": "^5.0.3", - "stats-gl": "^2.0.0", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.0", - "three-stdlib": "^2.29.9", - "troika-three-text": "^0.49.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.10.0", - "uuid": "^9.0.1", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=8.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/animated": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", - "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", - "dependencies": { - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/core": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", - "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/rafz": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/rafz": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", - "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" - }, - "node_modules/@react-three/drei/node_modules/@react-spring/shared": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", - "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", - "dependencies": { - "@react-spring/rafz": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", - "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/core": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/types": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", - "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" - }, - "node_modules/@react-three/drei/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.16.8", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", - "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.1", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@react-three/uikit": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@react-three/uikit/-/uikit-0.3.13.tgz", - "integrity": "sha512-tS6JFpKygxJSCr0z3K7KEv+VFkBQckDgcOpQzcqaCHgDNf/jGr1uudieqCCct31hChO6bosIq42SRhIvR//DnA==", - "dependencies": { - "@pmndrs/uikit": "^0.3.13", - "@preact/signals-core": "^1.5.1", - "chalk": "^5.3.0", - "commander": "^12.0.0", - "ora": "^8.0.1", - "prettier": "^3.2.5", - "prompts": "^2.4.2", - "zod": "^3.22.4", - "zustand": "^4.5.2" - }, - "bin": { - "uikit": "dist/cli/index.js" - }, - "peerDependencies": { - "@react-three/fiber": ">=8", - "react": ">=18" - } - }, - "node_modules/@react-three/uikit-lucide": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@react-three/uikit-lucide/-/uikit-lucide-0.3.13.tgz", - "integrity": "sha512-VFdwvR7YTPlia4o8rsiIbrB6k2d31Bkm/gcEqS/1+J6kkXaLOwGCE0jmmPu3/4um7bsUK83Ni1/KiafhsmBnOQ==", - "dependencies": { - "@react-three/uikit": "^0.3.13" - } - }, - "node_modules/@react-three/uikit/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@react-three/uikit/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-three/uikit/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-three/uikit/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" - }, - "node_modules/@react-three/uikit/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true - }, - "node_modules/@saintno/comfyui-sdk": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@saintno/comfyui-sdk/-/comfyui-sdk-0.1.11.tgz", - "integrity": "sha512-k8Wui1ejYKOKhEF4WvNiNz3DTCtg+zJSnwKBKP6AHn9xOp+73mNF7F+TXXTTTuq9SCVNQdalEXTkDS6uDnEmxg==", - "dependencies": { - "@types/node": "^22.2.0", - "bun-types": "^1.1.22", - "ws": "^8.18.0" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } - }, - "node_modules/@saintno/comfyui-sdk/node_modules/@types/node": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", - "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "node_modules/@saintno/comfyui-sdk/node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", - "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", - "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", - "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tailwindcss/container-queries": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", - "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", - "peerDependencies": { - "tailwindcss": ">=3.2.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", - "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/dom-speech-recognition": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.4.tgz", - "integrity": "sha512-zf2GwV/G6TdaLwpLDcGTIkHnXf8JEf/viMux+khqKQKDa8/8BAUtXXZS563GnvJ4Fg0PBLGAaFf2GekEVSZ6GQ==" - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/eventsource": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-1.1.15.tgz", - "integrity": "sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==" - }, - "node_modules/@types/fluent-ffmpeg": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.25.tgz", - "integrity": "sha512-a9/Jtv/RVaCG4lUwWIcuClWE5eXJFoFS/oHOecOv/RS8n+lQdJzcJVmDlxA8Xbk4B82YpO88Dijcoljb6sYTcA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/is-hotkey": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.10.tgz", - "integrity": "sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "optional": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" - }, - "node_modules/@types/pngjs": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", - "integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "devOptional": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/stats.js": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", - "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" - }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==" - }, - "node_modules/@types/three": { - "version": "0.167.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", - "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", - "peer": true, - "dependencies": { - "@tweenjs/tween.js": "~23.1.2", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" - }, - "node_modules/@types/webxr": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", - "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" - }, - "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dev": true, - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dev": true, - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dev": true, - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.44", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.44.tgz", - "integrity": "sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ==", - "dev": true - }, - "node_modules/@xenova/transformers": { - "version": "3.0.0-alpha.0", - "resolved": "git+ssh://git@github.com/xenova/transformers.js.git#222b94ed69158798c463d5fb374efbe44da199da", - "dependencies": { - "@huggingface/jinja": "^0.3.0", - "onnxruntime-web": "^1.18.0", - "sharp": "^0.33.2" - }, - "optionalDependencies": { - "onnxruntime-node": "^1.18.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xyflow/react": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.0.4.tgz", - "integrity": "sha512-eeQzw1gIbLKOB55rp2+20uB1PASDUf1q6zy2VsgugnuPEcL/olVMX3WT42XxyG8m3rcbUiHlq2NSmPTFWEjiUQ==", - "dependencies": { - "@xyflow/system": "0.0.37", - "classcat": "^5.0.3", - "zustand": "^4.4.0" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@xyflow/system": { - "version": "0.0.37", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.37.tgz", - "integrity": "sha512-hSIhezhxgftPUpC+xiQVIorcRILZUOWlLjpYPTyGWRu8s4RJvM4GqvrsFmD5OnMKXLgpU7/PqqUibDVO67oWQQ==", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appdmg": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", - "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "async": "^1.4.2", - "ds-store": "^0.1.5", - "execa": "^1.0.0", - "fs-temp": "^1.0.0", - "fs-xattr": "^0.3.0", - "image-size": "^0.7.4", - "is-my-json-valid": "^2.20.0", - "minimist": "^1.1.3", - "parse-color": "^1.0.0", - "path-exists": "^4.0.0", - "repeat-string": "^1.5.4" - }, - "bin": { - "appdmg": "bin/appdmg.js" - }, - "engines": { - "node": ">=8.5" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "peer": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", - "dev": true, - "optional": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" - } - }, - "node_modules/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "optional": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/automation-events": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/automation-events/-/automation-events-7.0.7.tgz", - "integrity": "sha512-eg7aK2P0jrq4QqnZRWXOQJDYs6lxZXK/erfZ/WPTVPP/YQlgt+J0KvIzTo86zYszkru2J/QCW1FFJYgJVd7TgA==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.2.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", - "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base32-encode": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", - "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", - "dev": true, - "optional": true, - "dependencies": { - "to-data-view": "^1.1.0" - } - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "optional": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/bplist-creator": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", - "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", - "dev": true, - "optional": true, - "dependencies": { - "stream-buffers": "~2.2.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bun-types": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.22.tgz", - "integrity": "sha512-PBgj4pQd+1WZJ8kWCho7D6i1RMS9/6WkiRikIfqYFzFomfyWZET32Wy83xK2zmF9HiKXd2+bjtVahJ6546oraA==", - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/bun-types/node_modules/@types/node": { - "version": "20.12.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", - "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camera-controls": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", - "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "optional": true - }, - "node_modules/class-variance-authority": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", - "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", - "dependencies": { - "clsx": "2.0.0" - }, - "funding": { - "url": "https://joebell.co.uk" - } - }, - "node_modules/class-variance-authority/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", - "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", - "dependencies": { - "@radix-ui/react-dialog": "1.0.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", - "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", - "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", - "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-dismissable-layer": "1.0.0", - "@radix-ui/react-focus-guards": "1.0.0", - "@radix-ui/react-focus-scope": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-portal": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-slot": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", - "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-escape-keydown": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", - "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", - "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", - "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", - "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", - "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", - "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", - "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", - "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cohere-ai": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.11.2.tgz", - "integrity": "sha512-IImDbZLg+kApTH9KswRAEGd0dRuZiChnsqC8gf6RepuklLuSxEkqto4uwSQQSUTj50Ns4uN7yaxzVyS6OmLpIg==", - "dependencies": { - "@aws-sdk/client-sagemaker": "^3.583.0", - "@aws-sdk/credential-providers": "^3.583.0", - "@aws-sdk/protocol-http": "^3.374.0", - "@aws-sdk/signature-v4": "^3.374.0", - "form-data": "^4.0.0", - "form-data-encoder": "^4.0.2", - "formdata-node": "^6.0.3", - "js-base64": "3.7.2", - "node-fetch": "2.7.0", - "qs": "6.11.2", - "readable-stream": "^4.5.2", - "url-join": "4.0.1" - } - }, - "node_modules/cohere-ai/node_modules/form-data-encoder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", - "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", - "engines": { - "node": ">= 18" - } - }, - "node_modules/cohere-ai/node_modules/formdata-node": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", - "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", - "engines": { - "node": ">= 18" - } - }, - "node_modules/cohere-ai/node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", - "dev": true, - "optional": true - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comfydeploy": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/comfydeploy/-/comfydeploy-0.0.21.tgz", - "integrity": "sha512-v5i6igitVWN6jmDlg35g8XyJuGsToD1sbhEZIz4nM3F6gSXZf2YjJzL/wzabsHlOtHhKsO/vdQAXuvO7/w8deQ==", - "dependencies": { - "zod": "^3.22.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/cross-dirname": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", - "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", - "dev": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-zip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", - "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.10" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dev": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decode-uri-component": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", - "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.42", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", - "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "peer": true - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" - }, - "node_modules/ds-store": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", - "integrity": "sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==", - "dev": true, - "optional": true, - "dependencies": { - "bplist-creator": "~0.0.3", - "macos-alias": "~0.2.5", - "tn1150": "^0.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/electron": { - "version": "31.3.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.3.1.tgz", - "integrity": "sha512-9fiuWlRhBfygtcT+auRd/WdBK/f8LZZcrpx0RjpXhH2DPTP/PfnkC4JB1PW55qCbGbh4wAgkYbf4ExIag8oGCA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-installer-common": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", - "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", - "dev": true, - "optional": true, - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "asar": "^3.0.0", - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "glob": "^7.1.4", - "lodash": "^4.17.15", - "parse-author": "^2.0.0", - "semver": "^7.1.1", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" - }, - "optionalDependencies": { - "@types/fs-extra": "^9.0.1" - } - }, - "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-installer-common/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-debian": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", - "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", - "dev": true, - "optional": true, - "os": [ - "darwin", - "linux" - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "debug": "^4.1.1", - "electron-installer-common": "^0.10.2", - "fs-extra": "^9.0.0", - "get-folder-size": "^2.0.1", - "lodash": "^4.17.4", - "word-wrap": "^1.2.3", - "yargs": "^16.0.2" - }, - "bin": { - "electron-installer-debian": "src/cli.js" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-installer-debian/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-installer-debian/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/electron-installer-debian/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-installer-debian/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "optional": true - }, - "node_modules/electron-installer-debian/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/electron-installer-debian/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-debian/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-dmg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-4.0.0.tgz", - "integrity": "sha512-g3W6XnyUa7QGrAF7ViewHdt6bXV2KYU1Pm1CY3pZpp+H6mOjCHHAhf/iZAxtaX1ERCb+SQHz7xSsAHuNH9I8ZQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^4.3.2", - "minimist": "^1.1.1" - }, - "bin": { - "electron-installer-dmg": "bin/electron-installer-dmg.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "optionalDependencies": { - "appdmg": "^0.6.4" - } - }, - "node_modules/electron-installer-redhat": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", - "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", - "dev": true, - "optional": true, - "os": [ - "darwin", - "linux" - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "debug": "^4.1.1", - "electron-installer-common": "^0.10.2", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "word-wrap": "^1.2.3", - "yargs": "^16.0.2" - }, - "bin": { - "electron-installer-redhat": "src/cli.js" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-installer-redhat/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-installer-redhat/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/electron-installer-redhat/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-installer-redhat/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "optional": true - }, - "node_modules/electron-installer-redhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-redhat/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-redhat/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-redhat/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/electron-installer-redhat/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-redhat/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==" - }, - "node_modules/electron-winstaller": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", - "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.21", - "temp": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "@electron/windows-sign": "^1.1.2" - } - }, - "node_modules/electron-winstaller/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/electron-winstaller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optional": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-winstaller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/electron/node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/electron/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/electron/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/electron/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true, - "optional": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", - "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.2.5", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", - "dev": true, - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", - "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" - }, - "node_modules/fast-unique-numbers": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.7.tgz", - "integrity": "sha512-K6hYNu8ZsVb7mwmd9OKxHmw4aLa+IFiBxt1e/FZVFFta94ZgNAHqIgUtDzd7AJaVoo/CoNTgr6sj1Dbj3PQPKg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.2.0" - } - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-event-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/fetch-event-stream/-/fetch-event-stream-0.1.5.tgz", - "integrity": "sha512-V1PWovkspxQfssq/NnxoEyQo1DV+MRK/laPuPblIZmSjMN8P5u46OhlFQznSr9p/t0Sp8Uc6SbM3yCMfr0KU8g==" - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-selector": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", - "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", - "dependencies": { - "tslib": "^2.0.3" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", - "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/flora-colossus": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", - "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/flora-colossus/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fluent-ffmpeg": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", - "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", - "dependencies": { - "async": "^0.2.9", - "which": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/fluent-ffmpeg/node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, - "node_modules/fluent-ffmpeg/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/fmix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", - "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", - "dev": true, - "optional": true, - "dependencies": { - "imul": "^1.0.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "11.1.7", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.7.tgz", - "integrity": "sha512-cW11Pu53eDAXUEhv5hEiWuIXWhfkbV32PlgVISn7jRdcAiVrJ1S03YQQ0/DzoswGYYwKi4qYmHHjCzAH52eSdQ==", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-temp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", - "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", - "dev": true, - "optional": true, - "dependencies": { - "random-path": "^0.1.0" - } - }, - "node_modules/fs-xattr": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", - "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/galactus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", - "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "flora-colossus": "^2.0.0", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/galactus/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", - "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "optional": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gaxios/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-property": "^1.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-folder-size": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", - "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", - "dev": true, - "optional": true, - "dependencies": { - "gar": "^1.0.4", - "tiny-each-async": "2.0.3" - }, - "bin": { - "get-folder-size": "bin/get-folder-size" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-installed-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", - "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", - "dev": true, - "dependencies": { - "global-modules": "1.0.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-node-dimensions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz", - "integrity": "sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ==" - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-package-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", - "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", - "dev": true, - "dependencies": { - "bluebird": "^3.1.1", - "debug": "^2.2.0", - "lodash.get": "^4.0.0", - "read-pkg-up": "^2.0.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/get-package-info/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/get-package-info/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" - }, - "node_modules/google-auth-library": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", - "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.3.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-auth-library/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-auth-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/google-p12-pem": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", - "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", - "deprecated": "Package is no longer maintained", - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/groq-sdk": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.5.0.tgz", - "integrity": "sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "node_modules/groq-sdk/node_modules/@types/node": { - "version": "18.19.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", - "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/gtoken": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", - "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", - "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hash-wasm": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.11.0.tgz", - "integrity": "sha512-HVusNXlVqHe0fzIzdQOGolnFN6mX/fqcrSAOcTBXdvzrXVHwTz11vXeKRmkR5gTuwVpvHZEIyKoePDvuAR+XwQ==" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==" - }, - "node_modules/hls.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", - "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-url-attributes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", - "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", - "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imul": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/indexeddb-fs": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/indexeddb-fs/-/indexeddb-fs-2.1.5.tgz", - "integrity": "sha512-4TDdof4ou+l1P3O9D+U09DAc2VQ/bWzgKBxC3nQ9qqMhNR2Y3p8JDgELzkY3bwLP8JULMTf2UHsjnYpiKExH2w==", - "dependencies": { - "jsonschema": "^1.4.1" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-hotkey": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", - "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-my-ip-valid": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", - "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", - "dev": true, - "optional": true - }, - "node_modules/is-my-json-valid": { - "version": "2.20.6", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", - "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", - "dev": true, - "optional": true, - "dependencies": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^5.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "dev": true, - "optional": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", - "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-base64": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", - "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" - }, - "node_modules/js-tiktoken": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.12.tgz", - "integrity": "sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==", - "dependencies": { - "base64-js": "^1.5.1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsdom": { - "version": "24.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", - "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", - "dev": true, - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/listr2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", - "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", - "dev": true, - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.396.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.396.0.tgz", - "integrity": "sha512-N/zP+9vEfEYHiMWMpjwH/M5diaV0e4UFe07BpgdzaRYce5QvXi87hixf7F0Xqdr3zuX/9u7H/2D4MVXIK22O0A==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/macos-alias": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", - "integrity": "sha512-zIUs3+qpml+w3wiRuADutd7XIO8UABqksot10Utl/tji4UxZzLG4fWDC+yJZoO8/Ehg5RqsvSRE/6TS5AEOeWw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "nan": "^2.4.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mediainfo.js": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/mediainfo.js/-/mediainfo.js-0.3.2.tgz", - "integrity": "sha512-SC8z72ESV1z2lq2zfheoo9zgcoqjeBn0mzq6MhIn3aqlkh3RV84FwOiMtYA0HWY7mi1igM89Jcll4r2sk/yyZA==", - "dependencies": { - "yargs": "^17.7.2" - }, - "bin": { - "mediainfo.js": "dist/esm/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlt-xml": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mlt-xml/-/mlt-xml-2.0.2.tgz", - "integrity": "sha512-UkbC0IaWS1LAIAm99/UukRq1htYTgBsalxUtBAVMUJn7LZl6EqpziU7Sv6dgoeo1UtXsUkWBAc37gwHOdPkoJA==" - }, - "node_modules/monaco-editor": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", - "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/msw": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.5.tgz", - "integrity": "sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==", - "hasInstallScript": true, - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.7.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/type-fest": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", - "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/murmur-32": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", - "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", - "dev": true, - "optional": true, - "dependencies": { - "encode-utf8": "^1.0.3", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "dev": true, - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", - "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", - "dependencies": { - "@next/env": "14.2.5", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.5", - "@next/swc-darwin-x64": "14.2.5", - "@next/swc-linux-arm64-gnu": "14.2.5", - "@next/swc-linux-arm64-musl": "14.2.5", - "@next/swc-linux-x64-gnu": "14.2.5", - "@next/swc-linux-x64-musl": "14.2.5", - "@next/swc-win32-arm64-msvc": "14.2.5", - "@next/swc-win32-ia32-msvc": "14.2.5", - "@next/swc-win32-x64-msvc": "14.2.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", - "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18", - "react-dom": "^16.8 || ^17 || ^18" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-api-version": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", - "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", - "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz", - "integrity": "sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==" - }, - "node_modules/onnxruntime-node": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz", - "integrity": "sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww==", - "hasInstallScript": true, - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "onnxruntime-common": "1.18.0", - "tar": "^7.0.1" - } - }, - "node_modules/onnxruntime-node/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/onnxruntime-node/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "optional": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/onnxruntime-node/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "optional": true, - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/onnxruntime-node/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "optional": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "optional": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "optional": true, - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.18.0.tgz", - "integrity": "sha512-o1UKj4ABIj1gmG7ae0RKJ3/GT+3yoF0RRpfDfeoe0huzRW4FDRLfbkDETmdFAvnJEXuYDE0YT+hhkia0352StQ==", - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.18.0", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/openai": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.55.2.tgz", - "integrity": "sha512-Z81nbAPvlLl5eDLNldkixAayhUzbbCbOef/dqqW3uuN0Fkgj5GZn2kgUDTqGPOp2RHtcOYMfZltXNPoC6kEkTQ==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", - "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", - "dev": true, - "dependencies": { - "author-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", - "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "~0.5.0" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pe-library": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", - "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==", - "dev": true, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, - "node_modules/playwright": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", - "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", - "devOptional": true, - "dependencies": { - "playwright-core": "1.46.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", - "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", - "devOptional": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "engines": { - "node": ">=14.19.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-css-variables": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz", - "integrity": "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==", - "dependencies": { - "balanced-match": "^1.0.0", - "escape-string-regexp": "^1.0.3", - "extend": "^3.0.1" - }, - "peerDependencies": { - "postcss": "^8.2.6" - } - }, - "node_modules/postcss-css-variables/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postject": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", - "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", - "dev": true, - "dependencies": { - "commander": "^9.4.0" - }, - "bin": { - "postject": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/postject/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.5.tgz", - "integrity": "sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==", - "dev": true, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig-melody": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig-melody": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-uuid": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/pure-uuid/-/pure-uuid-1.8.1.tgz", - "integrity": "sha512-PIwHXU7NZb/wTBwUfzCSjI85tfwx6DQOm74sRLtNLH8KHsFZEvAQbBQdz7E5ij8SNSv9WGdQPWiiM6NpNIeNfA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", - "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", - "dependencies": { - "decode-uri-component": "^0.4.1", - "filter-obj": "^5.1.0", - "split-on-first": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/random-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", - "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", - "dev": true, - "optional": true, - "dependencies": { - "base32-encode": "^0.1.0 || ^1.0.0", - "murmur-32": "^0.1.0 || ^0.2.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-composer": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", - "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-device-frameset": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/react-device-frameset/-/react-device-frameset-1.3.4.tgz", - "integrity": "sha512-M9VUa2up9TFOgsELHBFRkZf8ER0AyOYF5+5qbtYseQCZfg6XUxuNDX5VsJNfMGu6Zz6x9Dgh4rfFDFONK9H7dg==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-drag-drop-files": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/react-drag-drop-files/-/react-drag-drop-files-2.3.10.tgz", - "integrity": "sha512-Fv614W9+OtXFB5O+gjompTxQZLYGO7wJeT4paETGiXtiADB9yPOMGYD4A3PMCTY9Be874/wcpl+2dm3MvCIRzg==", - "dependencies": { - "prop-types": "^15.7.2", - "styled-components": "^5.3.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/react-error-boundary": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", - "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-hook-consent": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/react-hook-consent/-/react-hook-consent-3.5.3.tgz", - "integrity": "sha512-/HUD/zw2fJbERVHIMYwbfI5WStizTjgVX7qFS8QLaFTdGOSJ7RLa7zMYrnieqW7KqtL5qriUhxySaATfanAvfA==", - "dependencies": { - "object-hash": "^3.0.0", - "react-toggle": "^4.1.3" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-hotkeys-hook": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.5.0.tgz", - "integrity": "sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==", - "peerDependencies": { - "react": ">=16.8.1", - "react-dom": ">=16.8.1" - } - }, - "node_modules/react-icons": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", - "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "peer": true - }, - "node_modules/react-markdown": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", - "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-measure": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/react-measure/-/react-measure-2.5.2.tgz", - "integrity": "sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA==", - "dependencies": { - "@babel/runtime": "^7.2.0", - "get-node-dimensions": "^1.2.1", - "prop-types": "^15.6.2", - "resize-observer-polyfill": "^1.5.0" - }, - "peerDependencies": { - "react": ">0.13.0", - "react-dom": ">0.13.0" - } - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-reflex": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/react-reflex/-/react-reflex-4.2.6.tgz", - "integrity": "sha512-MLGty/ii/BTipKZ47dfs8Ue5g1xqgCxUCDM34ruEr0UVJuXGDzcSX9wPMzRcv4dUR+1tw4hm4c3a6V6hLO2XcA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.5.8", - "react-measure": "^2.0.2" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", - "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-speakup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-speakup/-/react-speakup-1.0.0.tgz", - "integrity": "sha512-uZlLfBrWcdlw9fC6N5NY14GA8olnXh7DNaWNQya1osBPIE2nd/URv3nc6+yXeIlu55bwdGYSPoyAXEo5znN1hg==", - "peerDependencies": { - "react": ">=16" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-toggle": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.3.tgz", - "integrity": "sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==", - "dependencies": { - "classnames": "^2.2.5" - }, - "peerDependencies": { - "prop-types": ">= 15.3.0 < 19", - "react": ">= 15.3.0 < 19", - "react-dom": ">= 15.3.0 < 19" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", - "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", - "dependencies": { - "debounce": "^1.2.1" - }, - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - } - }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", - "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replicate": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/replicate/-/replicate-0.32.0.tgz", - "integrity": "sha512-XOJBnV/FpRsz/r7DEj8KL4pdDk9BpptkljGOhKmjlZGdNcBvt532GxxmjT4ZaqdExg7STxrh1JHhI91zg+CZTw==", - "engines": { - "git": ">=2.11.0", - "node": ">=18.0.0", - "npm": ">=7.19.0", - "yarn": ">=1.7.0" - }, - "optionalDependencies": { - "readable-stream": ">=4.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resedit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.2.tgz", - "integrity": "sha512-UKTnq602iVe+W5SyRAQx/WdWMnlDiONfXBLFg/ur4QE4EQQ8eP7Jgm5mNXdK12kKawk1vvXPja2iXKqZiGDW6Q==", - "dev": true, - "dependencies": { - "pe-library": "^1.0.1" - }, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", - "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", - "dev": true, - "dependencies": { - "get-installed-path": "^2.0.3" - }, - "engines": { - "node": ">=4", - "npm": ">=2" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/robot3": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/robot3/-/robot3-0.4.1.tgz", - "integrity": "sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==" - }, - "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semiver": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", - "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/sharp": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", - "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.0" - }, - "engines": { - "libvips": ">=8.15.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sonner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", - "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true - }, - "node_modules/split-on-first": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", - "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/standardized-audio-context": { - "version": "25.3.75", - "resolved": "https://registry.npmjs.org/standardized-audio-context/-/standardized-audio-context-25.3.75.tgz", - "integrity": "sha512-N7/Si1d0kuo1umRnWOsQESqxJlkMxBZfdfNRo5HeE7pA0lmo6PNrMkOSiM0NutFxpwA+KcPexo5JkTWWAAUaNQ==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "automation-events": "^7.0.7", - "tslib": "^2.6.3" - } - }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "node_modules/stats-gl": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", - "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", - "dependencies": { - "@types/three": "^0.163.0" - } - }, - "node_modules/stats-gl/node_modules/@types/three": { - "version": "0.163.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", - "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", - "dependencies": { - "@tweenjs/tween.js": "~23.1.1", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, - "node_modules/styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dev": true - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tailwind-merge": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", - "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwind-scrollbar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", - "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", - "dev": true, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "3.x" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz", - "integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dev": true, - "optional": true, - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/textlinestream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/textlinestream/-/textlinestream-1.1.1.tgz", - "integrity": "sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/three": { - "version": "0.164.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.164.1.tgz", - "integrity": "sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==" - }, - "node_modules/three-mesh-bvh": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", - "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", - "peerDependencies": { - "three": ">= 0.151.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.32.1", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", - "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" - }, - "node_modules/tiny-each-async": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", - "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", - "dev": true, - "optional": true - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "optional": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/tn1150": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", - "integrity": "sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==", - "dev": true, - "optional": true, - "dependencies": { - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/to-data-view": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", - "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", - "dev": true, - "optional": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/troika-three-text": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", - "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.49.0", - "troika-worker-utils": "^0.49.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", - "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", - "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/tw-to-css": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.12.tgz", - "integrity": "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw==", - "dependencies": { - "postcss": "8.4.31", - "postcss-css-variables": "0.18.0", - "tailwindcss": "3.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tw-to-css/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/tw-to-css/node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-file-picker": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/use-file-picker/-/use-file-picker-2.1.2.tgz", - "integrity": "sha512-ZEIzRi1wXeIXDWr5i55gRBVER8rTkSGskDUY94bciTTAZJHlBnOTRLL/LDYjgz6d+US3yELHnRvtBhLxFGtB0A==", - "dependencies": { - "file-selector": "0.2.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16" - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/usehooks-ts": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.16.0.tgz", - "integrity": "sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w==", - "dependencies": { - "lodash.debounce": "^4.0.8" - }, - "engines": { - "node": ">=16.15.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/username": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", - "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "mem": "^4.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuid-random": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/uuid-random/-/uuid-random-1.3.2.tgz", - "integrity": "sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", - "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.40", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vitest": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-audio-beat-detector": { - "version": "8.2.12", - "resolved": "https://registry.npmjs.org/web-audio-beat-detector/-/web-audio-beat-detector-8.2.12.tgz", - "integrity": "sha512-wno9QdH3UPtQNu8VSi82z6Q6QiSURI0nRjtlLkfVZ+qvM8ITVq9c+VZFJpbEKR8FsehkVN8i44vqu39zh+m7/g==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3", - "web-audio-beat-detector-broker": "^4.1.11", - "web-audio-beat-detector-worker": "^5.2.54" - } - }, - "node_modules/web-audio-beat-detector-broker": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/web-audio-beat-detector-broker/-/web-audio-beat-detector-broker-4.1.11.tgz", - "integrity": "sha512-meOMbFMmLnAogLW7GiPo0teQho9RitsaB47NPIUy2WMfth4PCps2hgIQoW2DXtNwU0R4p0YEEpZnioXFoRlHqg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "fast-unique-numbers": "^9.0.7", - "standardized-audio-context": "^25.3.75", - "tslib": "^2.6.3", - "web-audio-beat-detector-worker": "^5.2.54" - } - }, - "node_modules/web-audio-beat-detector-worker": { - "version": "5.2.54", - "resolved": "https://registry.npmjs.org/web-audio-beat-detector-worker/-/web-audio-beat-detector-worker-5.2.54.tgz", - "integrity": "sha512-rFAKJhxUgEpRxJYaWjIDMhQ7tZ6E41LwTQ4GZ3mh95BjBOGpTLMiy+26vBTd2Xkc7E0VWyzhmPNb5/5aBxO6ZQ==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-or-npm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", - "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.5", - "pkg-dir": "^4.2.0" - }, - "bin": { - "yarn-or-npm": "bin/index.js", - "yon": "bin/index.js" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/yarn-or-npm/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/yarn-or-npm/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yarn-or-npm/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/yarn-or-npm/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-or-npm/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-or-npm/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoga-layout": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.1.0.tgz", - "integrity": "sha512-auzJ8lEovThZIpR8wLGWNo/JEj4VTO79q9/gOJ0dWb3shAYPFdX3t9VN0fC0v+jeQF77STUdCzebLwRMqzn5gQ==" - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", - "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", - "peerDependencies": { - "zod": "^3.23.3" - } - }, - "node_modules/zustand": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", - "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true + "name": "@clapper/monorepo", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@clapper/monorepo", + "version": "1.0.0", + "hasInstallScript": true, + "workspaces": [ + "packages/*" + ] + }, + "node_modules/@aitube/clap": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.2.3.tgz", + "integrity": "sha512-qT0wI6R5BrkIWDr1Dog/GPMYjKnwy5glwO3MibPcM0BWJVQlbj0cy0qbwH+wZPC1ZmRZnaJPlhCEj5e3/U6UsA==", + "license": "MIT", + "dependencies": { + "pure-uuid": "^1.8.1" + }, + "peerDependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/@aitube/clapper-services": { + "version": "0.2.3-2", + "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.2.3-2.tgz", + "integrity": "sha512-Qd6Riridk4FVcTjlscxw5wsbUgojwi1wkTIjlgPluhT5J5kLyEJQL/hmT2gBDBRsB4kyieVNZiGflgXnauDENw==", + "license": "MIT", + "peerDependencies": { + "@aitube/clap": "0.2.3", + "@aitube/timeline": "0.2.3", + "@monaco-editor/react": "4.6.0", + "monaco-editor": "0.50.0", + "react": "*", + "react-dom": "*", + "zustand": "4.5.2" + } + }, + "node_modules/@aitube/timeline": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.2.3.tgz", + "integrity": "sha512-zr9G5t/koz/vwXxKHs2qFot5gSau72J+luTfBK0o1tgf/TK/+yP6ACO3QbO8kAmkqa6wtWuBHdVXkVceB8z7Rw==", + "license": "MIT", + "dependencies": { + "date-fns": "^3.6.0", + "react-virtualized-auto-sizer": "^1.0.24" + }, + "peerDependencies": { + "@aitube/clap": "0.2.3", + "@radix-ui/react-slider": "^1.1.2", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.105.4", + "@react-three/fiber": "^8.16.2", + "clsx": "^2.1.1", + "react": "*", + "react-dom": "*", + "tailwind-merge": "^2.4.0", + "tailwindcss": "^3.4.6", + "three": "^0.164.1", + "zustand": "4.5.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@clapper/app": { + "resolved": "packages/app", + "link": true + }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@huggingface/jinja": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.0.tgz", + "integrity": "sha512-GLJzso0M07ZncFkrJMIXVU4os6GFbPocD4g8fMQPMGJubf48FtGOsUORH2rtFdXPIPelz8SLBMn8ZRmOTwXm9Q==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", + "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", + "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", + "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", + "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", + "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", + "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.31", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", + "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", + "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", + "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", + "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.1.1" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", + "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", + "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==", + "license": "Apache-2.0" + }, + "node_modules/@monaco-editor/loader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", + "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", + "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.4.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "license": "MIT", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", + "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.4.tgz", + "integrity": "sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.4.tgz", + "integrity": "sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.4", + "@react-spring/shared": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.4.tgz", + "integrity": "sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==", + "license": "MIT" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.4.tgz", + "integrity": "sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.4.tgz", + "integrity": "sha512-HKUhrrvWW7F/MAroObOloqcYyFqsUHp1ANIDvPVxk9cSh7veW7gQbJm2Sc7Ka+L4gVJEwSkS+MRfr8kk+sRZBw==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.4", + "@react-spring/core": "~9.7.4", + "@react-spring/shared": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.4.tgz", + "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==", + "license": "MIT" + }, + "node_modules/@react-three/drei": { + "version": "9.109.5", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.5.tgz", + "integrity": "sha512-Ftw2d01N+83aXTOOMA5y8hF2KBU0w7gBEctyjeHJihUyRuLBdfcgfu5c1OhBjhrdy23ycSYRINaeLkqUBPDFxQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==", + "license": "MIT" + }, + "node_modules/@react-three/drei/node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==", + "license": "MIT" + }, + "node_modules/@react-three/drei/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "license": "MIT", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.17.5", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.5.tgz", + "integrity": "sha512-7uqtTWQrNIKW6wbgF0CQiDuo7uHoRd96lGBKsdRa+j/s268kqO4MBsxynLUpg6F/+mir5SEt9zJ3Up+lOjz/dg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/debounce": "^1.2.1", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "debounce": "^1.2.1", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "license": "MIT", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/debounce": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", + "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", + "license": "MIT" + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz", + "integrity": "sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.18.2" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", + "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==", + "license": "MIT" + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comfydeploy": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/comfydeploy/-/comfydeploy-0.0.21.tgz", + "integrity": "sha512-v5i6igitVWN6jmDlg35g8XyJuGsToD1sbhEZIz4nM3F6gSXZf2YjJzL/wzabsHlOtHhKsO/vdQAXuvO7/w8deQ==", + "license": "MIT", + "dependencies": { + "zod": "^3.22.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/detect-gpu": { + "version": "5.0.43", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.43.tgz", + "integrity": "sha512-KVcUS/YzsZIBIACz6p2xpuBpAjaY4wiELImJ7M8rb9i16NE6frnVpSV/UBpkK6DYj4Wd3NJeE4sghcaypuM8bg==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatbuffers": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", + "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==", + "license": "SEE LICENSE IN LICENSE.txt" + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", + "license": "MIT" + }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==", + "license": "Apache-2.0" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "license": "MIT", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/monaco-editor": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", + "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/onnxruntime-common": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz", + "integrity": "sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz", + "integrity": "sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "onnxruntime-common": "1.18.0", + "tar": "^7.0.1" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "license": "Apache-2.0", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protobufjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/pure-uuid": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/pure-uuid/-/pure-uuid-1.8.1.tgz", + "integrity": "sha512-PIwHXU7NZb/wTBwUfzCSjI85tfwx6DQOm74sRLtNLH8KHsFZEvAQbBQdz7E5ij8SNSv9WGdQPWiiM6NpNIeNfA==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-error-boundary": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", + "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", + "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", + "license": "MIT", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", + "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-s390x": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-wasm32": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" + }, + "node_modules/stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "license": "MIT", + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/tailwind-merge": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", + "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", + "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "optional": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.164.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.164.1.tgz", + "integrity": "sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==", + "license": "MIT" + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.32.2", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.2.tgz", + "integrity": "sha512-ZN25Na/Xg7APhGKwJ1zhGdhZDsDGGnnm1k5Z+9LLlnfsFye4jigvbN3eA/Ta8hQmBNmEHXoozpmpKK1x8dCePQ==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/undici-types": { + "version": "6.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", + "integrity": "sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==", + "license": "MIT" + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", + "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "packages/app": { + "name": "@clapper/app", + "version": "0.0.8", + "license": "GPL-3.0-only", + "dependencies": { + "@aitube/broadway": "0.2.3", + "@aitube/clap": "0.2.3", + "@aitube/clapper-services": "0.2.3-2", + "@aitube/client": "0.2.3", + "@aitube/engine": "0.2.3", + "@aitube/timeline": "0.2.3", + "@fal-ai/serverless-client": "^0.13.0", + "@ffmpeg/ffmpeg": "^0.12.10", + "@ffmpeg/util": "^0.12.1", + "@gradio/client": "^1.5.0", + "@huggingface/hub": "^0.15.1", + "@huggingface/inference": "^2.8.0", + "@langchain/anthropic": "^0.2.14", + "@langchain/cohere": "^0.2.2", + "@langchain/core": "^0.2.23", + "@langchain/google-vertexai": "^0.0.25", + "@langchain/groq": "^0.0.16", + "@langchain/mistralai": "^0.0.28", + "@langchain/openai": "^0.2.6", + "@monaco-editor/react": "^4.6.0", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-menubar": "^1.0.4", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-progress": "^1.0.3", + "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-tooltip": "^1.0.7", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.106.0", + "@react-three/fiber": "^8.16.6", + "@react-three/uikit": "^0.3.4", + "@react-three/uikit-lucide": "^0.3.4", + "@saintno/comfyui-sdk": "^0.1.11", + "@tailwindcss/container-queries": "^0.1.1", + "@types/dom-speech-recognition": "^0.0.4", + "@types/pngjs": "^6.0.5", + "@xenova/transformers": "github:xenova/transformers.js#v3", + "@xyflow/react": "^12.0.3", + "autoprefixer": "10.4.19", + "base64-arraybuffer": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "^0.2.1", + "comfydeploy": "^0.0.21", + "date-fns": "^3.6.0", + "dotenv": "^16.4.5", + "fflate": "^0.8.2", + "fluent-ffmpeg": "^2.1.3", + "framer-motion": "11.1.7", + "fs-extra": "^11.2.0", + "is-hotkey": "^0.2.0", + "lucide-react": "^0.396.0", + "mediainfo.js": "^0.3.2", + "mlt-xml": "^2.0.2", + "monaco-editor": "^0.50.0", + "next": "^14.2.5", + "next-themes": "^0.3.0", + "pngjs": "^7.0.0", + "qs": "^6.12.1", + "query-string": "^9.0.0", + "react": "^18.3.1", + "react-device-frameset": "^1.3.4", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.3.1", + "react-drag-drop-files": "^2.3.10", + "react-error-boundary": "^4.0.13", + "react-hook-consent": "^3.5.3", + "react-hotkeys-hook": "^4.5.0", + "react-icons": "^5.2.1", + "react-markdown": "^9.0.1", + "react-reflex": "^4.2.6", + "react-speakup": "^1.0.0", + "remark-gfm": "^4.0.0", + "replicate": "^0.32.0", + "sharp": "0.33.4", + "sonner": "^1.5.0", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "three": "^0.164.1", + "ts-node": "^10.9.2", + "use-file-picker": "^2.1.2", + "usehooks-ts": "^2.14.0", + "uuid": "^9.0.1", + "web-audio-beat-detector": "^8.2.12", + "yaml": "^2.4.5", + "zustand": "4.5.2", + "zx": "^8.1.4" + }, + "devDependencies": { + "@electron-forge/cli": "^7.4.0", + "@electron-forge/maker-deb": "^7.4.0", + "@electron-forge/maker-dmg": "^7.4.0", + "@electron-forge/maker-rpm": "^7.4.0", + "@electron-forge/maker-squirrel": "^7.4.0", + "@electron-forge/maker-zip": "^7.4.0", + "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", + "@electron-forge/publisher-github": "^7.4.0", + "@playwright/test": "^1.45.1", + "@testing-library/react": "^16.0.0", + "@types/fluent-ffmpeg": "^2.1.24", + "@types/is-hotkey": "^0.1.10", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "@types/uuid": "^9.0.8", + "@vitejs/plugin-react": "^4.3.1", + "@webgpu/types": "^0.1.44", + "electron": "^31.2.1", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "eslint-config-prettier": "^9.1.0", + "jsdom": "^24.1.0", + "node-gyp": "^10.2.0", + "postcss": "^8", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwind-scrollbar": "^3.1.0", + "tailwindcss": "^3.4.3", + "typescript": "^5.5.0", + "vitest": "^2.0.2" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-libvips-win32-ia32": "1.0.2", + "@img/sharp-libvips-win32-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "packages/app/node_modules/@aitube/broadway": { + "version": "0.2.3", + "license": "MIT", + "dependencies": { + "@datagica/parse-entities": "^0.3.0", + "@datagica/parse-names": "^0.0.8", + "indexeddb-fs": "^2.1.5" + }, + "peerDependencies": { + "@aitube/clap": "0.2.3", + "@aitube/colors": "0.2.3" + } + }, + "packages/app/node_modules/@aitube/client": { + "version": "0.2.3", + "license": "MIT", + "dependencies": { + "query-string": "^9.0.0" + }, + "peerDependencies": { + "@aitube/clap": "0.2.3" + } + }, + "packages/app/node_modules/@aitube/colors": { + "version": "0.2.3", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@aitube/clap": "0.2.3" + } + }, + "packages/app/node_modules/@aitube/engine": { + "version": "0.2.3", + "license": "MIT", + "peerDependencies": { + "@aitube/clap": "0.2.3" + } + }, + "packages/app/node_modules/@ampproject/remapping": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "packages/app/node_modules/@anthropic-ai/sdk": { + "version": "0.22.0", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + } + }, + "packages/app/node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.43", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "packages/app/node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "packages/app/node_modules/@aws-crypto/crc32/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "packages/app/node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "packages/app/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/client-sagemaker": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/client-sso": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "packages/app/node_modules/@aws-sdk/client-sts": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/core": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.2", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.622.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "packages/app/node_modules/@aws-sdk/credential-providers": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/credential-provider-cognito-identity": "3.624.0", + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/protocol-http": { + "version": "3.374.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/protocol-http/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4": { + "version": "3.374.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/signature-v4": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/signature-v4": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^1.1.0", + "@smithy/is-array-buffer": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "@smithy/util-uri-escape": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/types": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-middleware": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-utf8": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "packages/app/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "packages/app/node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "packages/app/node_modules/@babel/code-frame": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/compat-data": { + "version": "7.25.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/core": { + "version": "7.25.2", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "packages/app/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/app/node_modules/@babel/generator": { + "version": "7.25.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/app/node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "packages/app/node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/helpers": { + "version": "7.25.0", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/highlight": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "packages/app/node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "packages/app/node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "packages/app/node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/@babel/parser": { + "version": "7.25.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "packages/app/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/app/node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/app/node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/app/node_modules/@babel/template": { + "version": "7.25.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/traverse": { + "version": "7.25.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@babel/types": { + "version": "7.25.2", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "license": "ISC", + "dependencies": { + "cookie": "^0.5.0" + } + }, + "packages/app/node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "packages/app/node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, + "packages/app/node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "packages/app/node_modules/@datagica/fast-index": { + "version": "0.1.0", + "license": "GPL-3.0" + }, + "packages/app/node_modules/@datagica/parse-entities": { + "version": "0.3.0", + "license": "GPL-3.0", + "dependencies": { + "@datagica/treegram": "^0.3.0" + } + }, + "packages/app/node_modules/@datagica/parse-names": { + "version": "0.0.8", + "license": "GPL-3.0", + "dependencies": { + "@datagica/parse-entities": "^0.2.7" + } + }, + "packages/app/node_modules/@datagica/parse-names/node_modules/@datagica/fast-index": { + "version": "0.0.7", + "license": "GPL-3.0" + }, + "packages/app/node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities": { + "version": "0.2.8", + "license": "GPL-3.0", + "dependencies": { + "@datagica/treegram": "^0.2.8" + } + }, + "packages/app/node_modules/@datagica/parse-names/node_modules/@datagica/treegram": { + "version": "0.2.9", + "license": "GPL-3.0", + "dependencies": { + "@datagica/fast-index": "^0.0.7", + "@datagica/tokenize": "^0.0.2" + } + }, + "packages/app/node_modules/@datagica/tokenize": { + "version": "0.0.2", + "license": "GPL-3.0" + }, + "packages/app/node_modules/@datagica/treegram": { + "version": "0.3.0", + "license": "GPL-3.0", + "dependencies": { + "@datagica/fast-index": "^0.1.0", + "@datagica/tokenize": "^0.0.2" + } + }, + "packages/app/node_modules/@electron-forge/cli": { + "version": "7.4.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@electron/get": "^3.0.0", + "chalk": "^4.0.0", + "commander": "^4.1.1", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "listr2": "^7.0.2", + "semver": "^7.2.1" + }, + "bin": { + "electron-forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/cli/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/core": { + "version": "7.4.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core-utils": "7.4.0", + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/plugin-base": "7.4.0", + "@electron-forge/publisher-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "@electron-forge/template-vite": "7.4.0", + "@electron-forge/template-vite-typescript": "7.4.0", + "@electron-forge/template-webpack": "7.4.0", + "@electron-forge/template-webpack-typescript": "7.4.0", + "@electron-forge/tracer": "7.4.0", + "@electron/get": "^3.0.0", + "@electron/packager": "^18.3.1", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "fast-glob": "^3.2.7", + "filenamify": "^4.1.0", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5", + "interpret": "^3.1.1", + "listr2": "^7.0.2", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "rechoir": "^0.8.0", + "resolve-package": "^1.0.1", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/core-utils": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "semver": "^7.2.1", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/core-utils/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/core/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/maker-base": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "fs-extra": "^10.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/maker-base/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/maker-deb": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-debian": "^3.2.0" + } + }, + "packages/app/node_modules/@electron-forge/maker-dmg": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-dmg": "^4.0.0" + } + }, + "packages/app/node_modules/@electron-forge/maker-dmg/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/maker-rpm": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-redhat": "^3.2.0" + } + }, + "packages/app/node_modules/@electron-forge/maker-squirrel": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-winstaller": "^5.3.0" + } + }, + "packages/app/node_modules/@electron-forge/maker-squirrel/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/maker-zip": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "cross-zip": "^4.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/maker-zip/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/plugin-auto-unpack-natives": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/plugin-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/plugin-base": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/publisher-base": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/publisher-github": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/publisher-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@octokit/core": "^3.2.4", + "@octokit/plugin-retry": "^3.0.9", + "@octokit/request-error": "^2.0.5", + "@octokit/rest": "^18.0.11", + "@octokit/types": "^6.1.2", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "mime-types": "^2.1.25" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/publisher-github/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/shared-types": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/tracer": "7.4.0", + "@electron/packager": "^18.3.1", + "@electron/rebuild": "^3.2.10", + "listr2": "^7.0.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/template-base": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/template-base/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/template-vite": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/template-vite-typescript": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/template-vite-typescript/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/template-vite/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/template-webpack": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/template-webpack-typescript": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "packages/app/node_modules/@electron-forge/template-webpack-typescript/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/template-webpack/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron-forge/tracer": { + "version": "7.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chrome-trace-event": "^1.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "packages/app/node_modules/@electron/asar": { + "version": "3.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "packages/app/node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/@electron/get": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "packages/app/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "packages/app/node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/app/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/app/node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "packages/app/node_modules/@electron/notarize": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/app/node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/@electron/osx-sign": { + "version": "1.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "packages/app/node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron/packager": { + "version": "18.3.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^3.0.0", + "@electron/notarize": "^2.1.0", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^2.0.1", + "@electron/windows-sign": "^1.0.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "resedit": "^2.0.0", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 16.13.0" + }, + "funding": { + "url": "https://github.com/electron/packager?sponsor=1" + } + }, + "packages/app/node_modules/@electron/rebuild": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/@electron/rebuild/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/node-gyp": { + "version": "9.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@electron/rebuild/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/@electron/universal": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "packages/app/node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/app/node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/@electron/windows-sign": { + "version": "1.1.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "packages/app/node_modules/@emotion/is-prop-valid": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "packages/app/node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "packages/app/node_modules/@emotion/stylis": { + "version": "0.8.5", + "license": "MIT" + }, + "packages/app/node_modules/@emotion/unitless": { + "version": "0.7.5", + "license": "MIT" + }, + "packages/app/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "packages/app/node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/app/node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@eslint/js": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@fal-ai/serverless-client": { + "version": "0.13.0", + "license": "MIT", + "dependencies": { + "@msgpack/msgpack": "^3.0.0-beta2", + "eventsource-parser": "^1.1.2", + "robot3": "^0.4.1", + "uuid-random": "^1.3.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "packages/app/node_modules/@ffmpeg/ffmpeg": { + "version": "0.12.10", + "license": "MIT", + "dependencies": { + "@ffmpeg/types": "^0.12.2" + }, + "engines": { + "node": ">=18.x" + } + }, + "packages/app/node_modules/@ffmpeg/types": { + "version": "0.12.2", + "license": "MIT", + "engines": { + "node": ">=16.x" + } + }, + "packages/app/node_modules/@ffmpeg/util": { + "version": "0.12.1", + "license": "MIT", + "engines": { + "node": ">=18.x" + } + }, + "packages/app/node_modules/@floating-ui/core": { + "version": "1.6.7", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.7" + } + }, + "packages/app/node_modules/@floating-ui/dom": { + "version": "1.6.10", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" + } + }, + "packages/app/node_modules/@floating-ui/react-dom": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "packages/app/node_modules/@floating-ui/utils": { + "version": "0.2.7", + "license": "MIT" + }, + "packages/app/node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/@gradio/client": { + "version": "1.5.0", + "license": "ISC", + "dependencies": { + "@types/eventsource": "^1.1.15", + "bufferutil": "^4.0.7", + "eventsource": "^2.0.2", + "fetch-event-stream": "^0.1.5", + "msw": "^2.2.1", + "semiver": "^1.1.0", + "textlinestream": "^1.1.1", + "typescript": "^5.0.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "packages/app/node_modules/@huggingface/hub": { + "version": "0.15.1", + "license": "MIT", + "dependencies": { + "@huggingface/tasks": "^0.10.6", + "hash-wasm": "^4.9.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@huggingface/inference": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@huggingface/tasks": "^0.11.2" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@huggingface/inference/node_modules/@huggingface/tasks": { + "version": "0.11.8", + "license": "MIT" + }, + "packages/app/node_modules/@huggingface/tasks": { + "version": "0.10.22", + "license": "MIT" + }, + "packages/app/node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "packages/app/node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "packages/app/node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "packages/app/node_modules/@img/sharp-libvips-win32-ia32": { + "version": "1.0.2", + "license": "LGPL-3.0-or-later", + "optional": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "packages/app/node_modules/@img/sharp-libvips-win32-x64": { + "version": "1.0.2", + "license": "LGPL-3.0-or-later", + "optional": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "packages/app/node_modules/@inquirer/confirm": { + "version": "3.1.22", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@inquirer/core": { + "version": "9.0.10", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.2", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.1.0", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.1.0", + "license": "MIT", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "packages/app/node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@inquirer/core/node_modules/undici-types": { + "version": "6.13.0", + "license": "MIT" + }, + "packages/app/node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/@inquirer/figures": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@inquirer/type": { + "version": "1.5.2", + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/anthropic": { + "version": "0.2.14", + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "^0.22.0", + "@langchain/core": ">=0.2.21 <0.3.0", + "fast-xml-parser": "^4.4.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/cohere": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "cohere-ai": "^7.10.5", + "uuid": "^10.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/cohere/node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/app/node_modules/@langchain/core": { + "version": "0.2.23", + "license": "MIT", + "dependencies": { + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "~0.1.39", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/core/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "packages/app/node_modules/@langchain/core/node_modules/langsmith": { + "version": "0.1.41", + "license": "MIT", + "dependencies": { + "@types/uuid": "^9.0.1", + "commander": "^10.0.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@langchain/core": "*", + "langchain": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "langchain": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "packages/app/node_modules/@langchain/core/node_modules/langsmith/node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/app/node_modules/@langchain/core/node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/app/node_modules/@langchain/google-common": { + "version": "0.0.25", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "uuid": "^10.0.0", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/google-common/node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/app/node_modules/@langchain/google-gauth": { + "version": "0.0.25", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/google-common": "~0.0.25", + "google-auth-library": "^8.9.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/google-vertexai": { + "version": "0.0.25", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/google-gauth": "~0.0.25" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/groq": { + "version": "0.0.16", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/openai": "~0.2.6", + "groq-sdk": "^0.5.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.5" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/mistralai": { + "version": "0.0.28", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@mistralai/mistralai": "^0.4.0", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@langchain/mistralai/node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "packages/app/node_modules/@langchain/openai": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "js-tiktoken": "^1.0.12", + "openai": "^4.55.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "packages/app/node_modules/@mistralai/mistralai": { + "version": "0.4.0", + "license": "ISC", + "dependencies": { + "node-fetch": "^2.6.7" + } + }, + "packages/app/node_modules/@msgpack/msgpack": { + "version": "3.0.0-beta2", + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/@mswjs/interceptors": { + "version": "0.29.1", + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@next/env": { + "version": "14.2.5", + "license": "MIT" + }, + "packages/app/node_modules/@next/eslint-plugin-next": { + "version": "14.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "10.3.10" + } + }, + "packages/app/node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/app/node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/@next/swc-darwin-arm64": { + "version": "14.2.5", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/@npmcli/agent": { + "version": "2.2.2", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "packages/app/node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/@npmcli/fs": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/@octokit/auth-token": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "packages/app/node_modules/@octokit/core": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "packages/app/node_modules/@octokit/endpoint": { + "version": "6.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "packages/app/node_modules/@octokit/graphql": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "packages/app/node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.40.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "packages/app/node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "packages/app/node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.16.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.39.0", + "deprecation": "^2.3.1" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "packages/app/node_modules/@octokit/plugin-retry": { + "version": "3.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "bottleneck": "^2.15.3" + } + }, + "packages/app/node_modules/@octokit/request": { + "version": "5.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "packages/app/node_modules/@octokit/request-error": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "packages/app/node_modules/@octokit/rest": { + "version": "18.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "packages/app/node_modules/@octokit/types": { + "version": "6.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "packages/app/node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "license": "MIT" + }, + "packages/app/node_modules/@open-draft/logger": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "packages/app/node_modules/@open-draft/until": { + "version": "2.1.0", + "license": "MIT" + }, + "packages/app/node_modules/@playwright/test": { + "version": "1.46.0", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@pmndrs/uikit": { + "version": "0.3.13", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@preact/signals-core": "^1.5.1", + "inline-style-parser": "^0.2.3", + "node-html-parser": "^6.1.13", + "tw-to-css": "^0.0.12", + "yoga-layout": "^3.0.4" + }, + "peerDependencies": { + "three": ">=0.160" + } + }, + "packages/app/node_modules/@preact/signals-core": { + "version": "1.8.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "packages/app/node_modules/@radix-ui/react-accordion": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collapsible": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-avatar": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-checkbox": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-collapsible": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, + "packages/app/node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-menubar": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-progress": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-scroll-area": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-toast": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-tooltip": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@radix-ui/rect": { + "version": "1.1.0", + "license": "MIT" + }, + "packages/app/node_modules/@react-dnd/asap": { + "version": "5.0.2", + "license": "MIT" + }, + "packages/app/node_modules/@react-dnd/invariant": { + "version": "4.0.2", + "license": "MIT" + }, + "packages/app/node_modules/@react-dnd/shallowequal": { + "version": "4.0.2", + "license": "MIT" + }, + "packages/app/node_modules/@react-three/uikit": { + "version": "0.3.13", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@pmndrs/uikit": "^0.3.13", + "@preact/signals-core": "^1.5.1", + "chalk": "^5.3.0", + "commander": "^12.0.0", + "ora": "^8.0.1", + "prettier": "^3.2.5", + "prompts": "^2.4.2", + "zod": "^3.22.4", + "zustand": "^4.5.2" + }, + "bin": { + "uikit": "dist/cli/index.js" + }, + "peerDependencies": { + "@react-three/fiber": ">=8", + "react": ">=18" + } + }, + "packages/app/node_modules/@react-three/uikit-lucide": { + "version": "0.3.13", + "dependencies": { + "@react-three/uikit": "^0.3.13" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/commander": { + "version": "12.1.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/emoji-regex": { + "version": "10.3.0", + "license": "MIT" + }, + "packages/app/node_modules/@react-three/uikit/node_modules/is-interactive": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/is-unicode-supported": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/log-symbols": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/ora": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/string-width": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/@react-three/uikit/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "packages/app/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "packages/app/node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/@saintno/comfyui-sdk": { + "version": "0.1.11", + "license": "ISC", + "dependencies": { + "@types/node": "^22.2.0", + "bun-types": "^1.1.22", + "ws": "^8.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "packages/app/node_modules/@saintno/comfyui-sdk/node_modules/@types/node": { + "version": "22.2.0", + "license": "MIT", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "packages/app/node_modules/@saintno/comfyui-sdk/node_modules/undici-types": { + "version": "6.13.0", + "license": "MIT" + }, + "packages/app/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "packages/app/node_modules/@smithy/abort-controller": { + "version": "3.1.1", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/config-resolver": { + "version": "3.0.5", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/core": { + "version": "2.3.2", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/credential-provider-imds": { + "version": "3.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/eventstream-codec": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "packages/app/node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { + "version": "1.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@smithy/hash-node": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/invalid-dependency": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/middleware-content-length": { + "version": "3.0.5", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/middleware-retry": { + "version": "3.0.14", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/property-provider": { + "version": "3.1.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/signature-v4": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/smithy-client": { + "version": "3.1.12", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/types": { + "version": "3.3.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/url-parser": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "packages/app/node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.14", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/app/node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.14", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/app/node_modules/@smithy/util-endpoints": { + "version": "2.0.5", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-middleware": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-retry": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-stream": { + "version": "3.1.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@smithy/util-waiter": { + "version": "3.1.2", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "packages/app/node_modules/@swc/helpers": { + "version": "0.5.5", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "packages/app/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/@tailwindcss/container-queries": { + "version": "0.1.1", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.2.0" + } + }, + "packages/app/node_modules/@testing-library/dom": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/@testing-library/react": { + "version": "16.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/@tsconfig/node10": { + "version": "1.0.11", + "license": "MIT" + }, + "packages/app/node_modules/@tsconfig/node12": { + "version": "1.0.11", + "license": "MIT" + }, + "packages/app/node_modules/@tsconfig/node14": { + "version": "1.0.3", + "license": "MIT" + }, + "packages/app/node_modules/@tsconfig/node16": { + "version": "1.0.4", + "license": "MIT" + }, + "packages/app/node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "peer": true + }, + "packages/app/node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "packages/app/node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "packages/app/node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "packages/app/node_modules/@types/babel__traverse": { + "version": "7.20.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "packages/app/node_modules/@types/cacheable-request": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "packages/app/node_modules/@types/cookie": { + "version": "0.6.0", + "license": "MIT" + }, + "packages/app/node_modules/@types/d3-color": { + "version": "3.1.3", + "license": "MIT" + }, + "packages/app/node_modules/@types/d3-drag": { + "version": "3.0.7", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "packages/app/node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "packages/app/node_modules/@types/d3-selection": { + "version": "3.0.10", + "license": "MIT" + }, + "packages/app/node_modules/@types/d3-transition": { + "version": "3.0.8", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "packages/app/node_modules/@types/d3-zoom": { + "version": "3.0.8", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "packages/app/node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "packages/app/node_modules/@types/dom-speech-recognition": { + "version": "0.0.4", + "license": "MIT" + }, + "packages/app/node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "packages/app/node_modules/@types/estree-jsx": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "packages/app/node_modules/@types/eventsource": { + "version": "1.1.15", + "license": "MIT" + }, + "packages/app/node_modules/@types/fluent-ffmpeg": { + "version": "2.1.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/fs-extra": { + "version": "9.0.13", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "packages/app/node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/@types/is-hotkey": { + "version": "0.1.10", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/@types/jsonfile": { + "version": "6.1.4", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/keyv": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/mdast": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "packages/app/node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/@types/ms": { + "version": "0.7.34", + "license": "MIT" + }, + "packages/app/node_modules/@types/mute-stream": { + "version": "0.0.4", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/node": { + "version": "20.14.14", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "packages/app/node_modules/@types/node-fetch": { + "version": "2.6.11", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "packages/app/node_modules/@types/pngjs": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/react-dom": { + "version": "18.3.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "packages/app/node_modules/@types/responselike": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "packages/app/node_modules/@types/statuses": { + "version": "2.0.5", + "license": "MIT" + }, + "packages/app/node_modules/@types/tough-cookie": { + "version": "4.0.5", + "license": "MIT" + }, + "packages/app/node_modules/@types/unist": { + "version": "3.0.2", + "license": "MIT" + }, + "packages/app/node_modules/@types/uuid": { + "version": "9.0.8", + "license": "MIT" + }, + "packages/app/node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "license": "MIT" + }, + "packages/app/node_modules/@types/ws": { + "version": "8.5.12", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "packages/app/node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/app/node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/app/node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/app/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/app/node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/app/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/app/node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "license": "ISC" + }, + "packages/app/node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "packages/app/node_modules/@vitest/expect": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/@vitest/runner": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/@vitest/snapshot": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/@vitest/spy": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/@vitest/utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/@webgpu/types": { + "version": "0.1.44", + "dev": true, + "license": "BSD-3-Clause" + }, + "packages/app/node_modules/@xenova/transformers": { + "version": "3.0.0-alpha.0", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.3.0", + "onnxruntime-web": "^1.18.0", + "sharp": "^0.33.2" + }, + "optionalDependencies": { + "onnxruntime-node": "^1.18.0" + } + }, + "packages/app/node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "packages/app/node_modules/@xyflow/react": { + "version": "12.0.4", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.37", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "packages/app/node_modules/@xyflow/system": { + "version": "0.0.37", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "packages/app/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "packages/app/node_modules/acorn": { + "version": "8.12.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "packages/app/node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "packages/app/node_modules/acorn-walk": { + "version": "8.3.3", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "packages/app/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "packages/app/node_modules/agentkeepalive": { + "version": "4.5.0", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "packages/app/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/app/node_modules/ansi-escapes": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/appdmg": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" + }, + "bin": { + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" + } + }, + "packages/app/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/are-we-there-yet": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "packages/app/node_modules/aria-hidden": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "packages/app/node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/array-includes": { + "version": "3.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/arrify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/asar": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + }, + "optionalDependencies": { + "@types/glob": "^7.1.1" + } + }, + "packages/app/node_modules/asar/node_modules/commander": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/async": { + "version": "1.5.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "packages/app/node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "packages/app/node_modules/author-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "packages/app/node_modules/automation-events": { + "version": "7.0.7", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "packages/app/node_modules/autoprefixer": { + "version": "10.4.19", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "packages/app/node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/axe-core": { + "version": "4.10.0", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/axobject-query": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "packages/app/node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "packages/app/node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/base32-encode": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-data-view": "^1.1.0" + } + }, + "packages/app/node_modules/base64-arraybuffer": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "packages/app/node_modules/before-after-hook": { + "version": "2.2.3", + "dev": true, + "license": "Apache-2.0" + }, + "packages/app/node_modules/bignumber.js": { + "version": "9.1.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/app/node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "packages/app/node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "packages/app/node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "packages/app/node_modules/boolean": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/bottleneck": { + "version": "2.19.5", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/bowser": { + "version": "2.11.0", + "license": "MIT" + }, + "packages/app/node_modules/bplist-creator": { + "version": "0.0.8", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, + "packages/app/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/app/node_modules/browserslist": { + "version": "4.23.3", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "packages/app/node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/app/node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "packages/app/node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/bufferutil": { + "version": "4.0.8", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "packages/app/node_modules/bun-types": { + "version": "1.1.22", + "license": "MIT", + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "packages/app/node_modules/bun-types/node_modules/@types/node": { + "version": "20.12.14", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "packages/app/node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "packages/app/node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/cacache": { + "version": "18.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "packages/app/node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/app/node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/cacache/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "packages/app/node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/cacheable-lookup": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "packages/app/node_modules/cacheable-request": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/call-bind": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/camelize": { + "version": "1.0.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/caniuse-lite": { + "version": "1.0.30001651", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "packages/app/node_modules/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/chai": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/app/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/app/node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/check-error": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "packages/app/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/chrome-trace-event": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "packages/app/node_modules/chromium-pickle-js": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/class-variance-authority": { + "version": "0.7.0", + "license": "Apache-2.0", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "packages/app/node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/classcat": { + "version": "5.0.5", + "license": "MIT" + }, + "packages/app/node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "packages/app/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/cli-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/cli-spinners": { + "version": "2.9.2", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/cli-truncate": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/cli-width": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "packages/app/node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "packages/app/node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/app/node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "packages/app/node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "packages/app/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "packages/app/node_modules/clone-response": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/cmdk": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "1.0.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.0", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-slot": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-portal": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-primitive": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-slot": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/app/node_modules/cmdk/node_modules/react-remove-scroll": { + "version": "2.5.4", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/cohere-ai": { + "version": "7.11.2", + "dependencies": { + "@aws-sdk/client-sagemaker": "^3.583.0", + "@aws-sdk/credential-providers": "^3.583.0", + "@aws-sdk/protocol-http": "^3.374.0", + "@aws-sdk/signature-v4": "^3.374.0", + "form-data": "^4.0.0", + "form-data-encoder": "^4.0.2", + "formdata-node": "^6.0.3", + "js-base64": "3.7.2", + "node-fetch": "2.7.0", + "qs": "6.11.2", + "readable-stream": "^4.5.2", + "url-join": "4.0.1" + } + }, + "packages/app/node_modules/cohere-ai/node_modules/form-data-encoder": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "packages/app/node_modules/cohere-ai/node_modules/formdata-node": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "packages/app/node_modules/cohere-ai/node_modules/qs": { + "version": "6.11.2", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/color-convert": { + "version": "0.5.3", + "dev": true, + "optional": true + }, + "packages/app/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "packages/app/node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/app/node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/compare-version": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "packages/app/node_modules/cookie": { + "version": "0.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/app/node_modules/create-require": { + "version": "1.1.1", + "license": "MIT" + }, + "packages/app/node_modules/cross-dirname": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/cross-zip": { + "version": "4.0.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.10" + } + }, + "packages/app/node_modules/css-color-keywords": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "packages/app/node_modules/css-to-react-native": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "packages/app/node_modules/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "packages/app/node_modules/cssstyle": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/d3-color": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-dispatch": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-drag": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-ease": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-interpolate": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-selection": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-timer": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/d3-transition": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "packages/app/node_modules/d3-zoom": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "packages/app/node_modules/data-urls": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/data-view-buffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/data-view-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/data-view-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/debug": { + "version": "4.3.6", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "packages/app/node_modules/decamelize": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/decode-named-character-reference": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/decode-uri-component": { + "version": "0.4.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "packages/app/node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/deep-equal": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "packages/app/node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/deprecation": { + "version": "2.3.1", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT" + }, + "packages/app/node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/diff": { + "version": "4.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "packages/app/node_modules/dir-compare": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "packages/app/node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/dnd-core": { + "version": "16.0.1", + "license": "MIT", + "dependencies": { + "@react-dnd/asap": "^5.0.1", + "@react-dnd/invariant": "^4.0.1", + "redux": "^4.2.0" + } + }, + "packages/app/node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "packages/app/node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "peer": true + }, + "packages/app/node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "packages/app/node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "packages/app/node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "packages/app/node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "packages/app/node_modules/dotenv": { + "version": "16.4.5", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "packages/app/node_modules/ds-store": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "bplist-creator": "~0.0.3", + "macos-alias": "~0.2.5", + "tn1150": "^0.1.0" + } + }, + "packages/app/node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "packages/app/node_modules/electron": { + "version": "31.3.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "packages/app/node_modules/electron-installer-common": { + "version": "0.10.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "asar": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" + }, + "optionalDependencies": { + "@types/fs-extra": "^9.0.1" + } + }, + "packages/app/node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/electron-installer-common/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-installer-debian": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-debian": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/electron-installer-debian/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-installer-debian/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-installer-dmg": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "debug": "^4.3.2", + "minimist": "^1.1.1" + }, + "bin": { + "electron-installer-dmg": "bin/electron-installer-dmg.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "optionalDependencies": { + "appdmg": "^0.6.4" + } + }, + "packages/app/node_modules/electron-installer-redhat": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-redhat": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-installer-redhat/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/electron-to-chromium": { + "version": "1.5.5", + "license": "ISC" + }, + "packages/app/node_modules/electron-winstaller": { + "version": "5.4.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "packages/app/node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "packages/app/node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/app/node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "packages/app/node_modules/electron/node_modules/@electron/get": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "packages/app/node_modules/electron/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "packages/app/node_modules/electron/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/app/node_modules/electron/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/app/node_modules/electron/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "packages/app/node_modules/encode-utf8": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/encoding": { + "version": "0.1.13", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "packages/app/node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "packages/app/node_modules/enhanced-resolve": { + "version": "5.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "packages/app/node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "packages/app/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "packages/app/node_modules/es-abstract": { + "version": "1.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/es-get-iterator": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/es-iterator-helpers": { + "version": "1.0.19", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/es-object-atoms": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/es-set-tostringtag": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "packages/app/node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "packages/app/node_modules/escalade": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/eslint": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/app/node_modules/eslint-config-next": { + "version": "14.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "14.2.5", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/app/node_modules/eslint-config-prettier": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "packages/app/node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "packages/app/node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "packages/app/node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "packages/app/node_modules/eslint-module-utils": { + "version": "2.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "packages/app/node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "packages/app/node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "packages/app/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "packages/app/node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/app/node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "packages/app/node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "packages/app/node_modules/eslint-plugin-react": { + "version": "7.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "packages/app/node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "packages/app/node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/app/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/app/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/app/node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/app/node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "packages/app/node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "packages/app/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "packages/app/node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "packages/app/node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/eventemitter3": { + "version": "5.0.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "packages/app/node_modules/eventsource": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "packages/app/node_modules/eventsource-parser": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=14.18" + } + }, + "packages/app/node_modules/execa": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "packages/app/node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "packages/app/node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/execa/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "packages/app/node_modules/expand-tilde": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/exponential-backoff": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0" + }, + "packages/app/node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "packages/app/node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "packages/app/node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "packages/app/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/fast-text-encoding": { + "version": "1.0.6", + "license": "Apache-2.0" + }, + "packages/app/node_modules/fast-unique-numbers": { + "version": "9.0.7", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "packages/app/node_modules/fast-xml-parser": { + "version": "4.4.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "packages/app/node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "packages/app/node_modules/fetch-event-stream": { + "version": "0.1.5", + "license": "MIT" + }, + "packages/app/node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "packages/app/node_modules/file-selector": { + "version": "0.2.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "packages/app/node_modules/filename-reserved-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/filenamify": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/filter-obj": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "packages/app/node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/flora-colossus": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "packages/app/node_modules/flora-colossus/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/fluent-ffmpeg/node_modules/async": { + "version": "0.2.10" + }, + "packages/app/node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "packages/app/node_modules/fmix": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "imul": "^1.0.0" + } + }, + "packages/app/node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "packages/app/node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/form-data-encoder": { + "version": "1.7.2", + "license": "MIT" + }, + "packages/app/node_modules/formdata-node": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "packages/app/node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/fraction.js": { + "version": "4.3.7", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "packages/app/node_modules/framer-motion": { + "version": "11.1.7", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "packages/app/node_modules/fs-extra": { + "version": "11.2.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "packages/app/node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/fs-temp": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "random-path": "^0.1.0" + } + }, + "packages/app/node_modules/fs-xattr": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "engines": { + "node": ">=8.6.0" + } + }, + "packages/app/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "packages/app/node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/galactus": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "packages/app/node_modules/galactus/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/gar": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/gauge": { + "version": "4.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/gaxios": { + "version": "5.1.3", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/gaxios/node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/gcp-metadata": { + "version": "5.3.0", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/generate-function": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "packages/app/node_modules/generate-object-property": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, + "packages/app/node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "packages/app/node_modules/get-east-asian-width": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/get-folder-size": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, + "packages/app/node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/app/node_modules/get-installed-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "global-modules": "1.0.0" + } + }, + "packages/app/node_modules/get-intrinsic": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/get-node-dimensions": { + "version": "1.2.1", + "license": "MIT" + }, + "packages/app/node_modules/get-nonce": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/get-package-info": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "packages/app/node_modules/get-package-info/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "packages/app/node_modules/get-package-info/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/get-stream": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/get-symbol-description": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/get-tsconfig": { + "version": "4.7.6", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "packages/app/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/global-agent": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "packages/app/node_modules/global-modules": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/global-prefix": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "packages/app/node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/google-auth-library": { + "version": "8.9.0", + "license": "Apache-2.0", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/google-auth-library/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/google-auth-library/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "packages/app/node_modules/google-p12-pem": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "packages/app/node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/got": { + "version": "11.8.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "packages/app/node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "packages/app/node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/graphql": { + "version": "16.9.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "packages/app/node_modules/groq-sdk": { + "version": "0.5.0", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + } + }, + "packages/app/node_modules/groq-sdk/node_modules/@types/node": { + "version": "18.19.44", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "packages/app/node_modules/gtoken": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "packages/app/node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/has-proto": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/hash-wasm": { + "version": "4.11.0", + "license": "MIT" + }, + "packages/app/node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/hast-util-whitespace": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "packages/app/node_modules/headers-polyfill": { + "version": "4.0.3", + "license": "MIT" + }, + "packages/app/node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "packages/app/node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "packages/app/node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/html-url-attributes": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "packages/app/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/http2-wrapper": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "packages/app/node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "packages/app/node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "packages/app/node_modules/iconv-lite": { + "version": "0.6.3", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/ignore": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/app/node_modules/image-size": { + "version": "0.7.5", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "packages/app/node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/imul": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "packages/app/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/indexeddb-fs": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "jsonschema": "^1.4.1" + } + }, + "packages/app/node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "packages/app/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/inline-style-parser": { + "version": "0.2.3", + "license": "MIT" + }, + "packages/app/node_modules/internal-slot": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "packages/app/node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "packages/app/node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "packages/app/node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-array-buffer": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/is-async-function": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-data-view": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/is-finalizationregistry": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/is-generator-function": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/is-hotkey": { + "version": "0.2.0", + "license": "MIT" + }, + "packages/app/node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-my-ip-valid": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/is-my-json-valid": { + "version": "2.20.6", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "packages/app/node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-node-process": { + "version": "1.2.0", + "license": "MIT" + }, + "packages/app/node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/is-property": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-stream": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-weakset": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/isbinaryfile": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "packages/app/node_modules/iterator.prototype": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "packages/app/node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "packages/app/node_modules/js-base64": { + "version": "3.7.2", + "license": "BSD-3-Clause" + }, + "packages/app/node_modules/js-tiktoken": { + "version": "1.0.12", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "packages/app/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "packages/app/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/jsdom": { + "version": "24.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "packages/app/node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/json-bigint": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "packages/app/node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "optional": true + }, + "packages/app/node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/app/node_modules/jsonpointer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/jsonschema": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "packages/app/node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "packages/app/node_modules/junk": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/jwa": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "packages/app/node_modules/jws": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "packages/app/node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "packages/app/node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/language-subtag-registry": { + "version": "0.3.23", + "dev": true, + "license": "CC0-1.0" + }, + "packages/app/node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "packages/app/node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/app/node_modules/listr2": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/load-json-file": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "packages/app/node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "packages/app/node_modules/lodash.get": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/lodash.throttle": { + "version": "4.1.1", + "license": "MIT" + }, + "packages/app/node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/log-update": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/app/node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "packages/app/node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/loupe": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "packages/app/node_modules/lowercase-keys": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "packages/app/node_modules/lucide-react": { + "version": "0.396.0", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "packages/app/node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "packages/app/node_modules/macos-alias": { + "version": "0.2.11", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.4.0" + } + }, + "packages/app/node_modules/magic-string": { + "version": "0.30.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "packages/app/node_modules/make-error": { + "version": "1.3.6", + "license": "ISC" + }, + "packages/app/node_modules/make-fetch-happen": { + "version": "13.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "packages/app/node_modules/map-age-cleaner": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/markdown-table": { + "version": "3.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/matcher": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/mediainfo.js": { + "version": "0.3.2", + "license": "BSD-2-Clause", + "dependencies": { + "yargs": "^17.7.2" + }, + "bin": { + "mediainfo.js": "dist/esm/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "packages/app/node_modules/mem": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/micromark": { + "version": "4.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-factory-label": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-factory-title": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-encode": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "packages/app/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "packages/app/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "packages/app/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "packages/app/node_modules/micromark-util-types": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "packages/app/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/app/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/app/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/mimic-response": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/app/node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "packages/app/node_modules/minipass-fetch": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "packages/app/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/app/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/app/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/mlt-xml": { + "version": "2.0.2", + "license": "MIT" + }, + "packages/app/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "packages/app/node_modules/msw": { + "version": "2.3.5", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.7.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/app/node_modules/msw/node_modules/type-fest": { + "version": "4.24.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/murmur-32": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "encode-utf8": "^1.0.3", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "packages/app/node_modules/mustache": { + "version": "4.2.0", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "packages/app/node_modules/mute-stream": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/nan": { + "version": "2.20.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/app/node_modules/next": { + "version": "14.2.5", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.5", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "packages/app/node_modules/next-themes": { + "version": "0.3.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, + "packages/app/node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "packages/app/node_modules/nice-try": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/node-abi": { + "version": "3.65.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/node-api-version": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "packages/app/node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "packages/app/node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "packages/app/node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "packages/app/node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "packages/app/node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "packages/app/node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "packages/app/node_modules/node-gyp": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "packages/app/node_modules/node-gyp-build": { + "version": "4.8.1", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "packages/app/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/app/node_modules/node-gyp/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "packages/app/node_modules/node-gyp/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "packages/app/node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/node-html-parser": { + "version": "6.1.13", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "packages/app/node_modules/node-releases": { + "version": "2.0.18", + "license": "MIT" + }, + "packages/app/node_modules/nopt": { + "version": "7.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "packages/app/node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "packages/app/node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/normalize-url": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/npmlog": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/app/node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "packages/app/node_modules/nwsapi": { + "version": "2.2.12", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/object-inspect": { + "version": "1.13.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/object-is": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/object.entries": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/object.values": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "packages/app/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/onnxruntime-web": { + "version": "1.18.0", + "license": "MIT", + "dependencies": { + "flatbuffers": "^1.12.0", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.18.0", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "packages/app/node_modules/openai": { + "version": "4.55.2", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "packages/app/node_modules/openai/node_modules/@types/node": { + "version": "18.19.43", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "packages/app/node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/app/node_modules/ora": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/outvariant": { + "version": "1.4.3", + "license": "MIT" + }, + "packages/app/node_modules/p-cancelable": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/p-defer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/p-is-promise": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/p-queue": { + "version": "6.6.2", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "packages/app/node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/p-timeout": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/parse-author": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/parse-color": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "packages/app/node_modules/parse-entities": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "license": "MIT" + }, + "packages/app/node_modules/parse-json": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/parse5": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "packages/app/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/path-to-regexp": { + "version": "6.2.2", + "license": "MIT" + }, + "packages/app/node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/pathval": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "packages/app/node_modules/pe-library": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "packages/app/node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/playwright": { + "version": "1.46.0", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "packages/app/node_modules/playwright-core": { + "version": "1.46.0", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/plist": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "packages/app/node_modules/pngjs": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "packages/app/node_modules/possible-typed-array-names": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/postcss-css-variables": { + "version": "0.18.0", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "escape-string-regexp": "^1.0.3", + "extend": "^3.0.1" + }, + "peerDependencies": { + "postcss": "^8.2.6" + } + }, + "packages/app/node_modules/postcss-css-variables/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "packages/app/node_modules/postject": { + "version": "1.0.0-alpha.6", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "packages/app/node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/app/node_modules/prettier": { + "version": "3.3.3", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "packages/app/node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "packages/app/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "packages/app/node_modules/proc-log": { + "version": "4.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "packages/app/node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "packages/app/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/app/node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "packages/app/node_modules/property-information": { + "version": "6.5.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "packages/app/node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "packages/app/node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/query-string": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/querystringify": { + "version": "2.2.0", + "license": "MIT" + }, + "packages/app/node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/random-path": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "base32-encode": "^0.1.0 || ^1.0.0", + "murmur-32": "^0.1.0 || ^0.2.0" + } + }, + "packages/app/node_modules/react-device-frameset": { + "version": "1.3.4", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "packages/app/node_modules/react-dnd": { + "version": "16.0.1", + "license": "MIT", + "dependencies": { + "@react-dnd/invariant": "^4.0.1", + "@react-dnd/shallowequal": "^4.0.1", + "dnd-core": "^16.0.1", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" + }, + "peerDependencies": { + "@types/hoist-non-react-statics": ">= 3.3.1", + "@types/node": ">= 12", + "@types/react": ">= 16", + "react": ">= 16.14" + }, + "peerDependenciesMeta": { + "@types/hoist-non-react-statics": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/react-dnd-html5-backend": { + "version": "16.0.1", + "license": "MIT", + "dependencies": { + "dnd-core": "^16.0.1" + } + }, + "packages/app/node_modules/react-drag-drop-files": { + "version": "2.3.10", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2", + "styled-components": "^5.3.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "packages/app/node_modules/react-hook-consent": { + "version": "3.5.3", + "license": "MIT", + "dependencies": { + "object-hash": "^3.0.0", + "react-toggle": "^4.1.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "packages/app/node_modules/react-hotkeys-hook": { + "version": "4.5.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.1", + "react-dom": ">=16.8.1" + } + }, + "packages/app/node_modules/react-icons": { + "version": "5.2.1", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "packages/app/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT", + "peer": true + }, + "packages/app/node_modules/react-markdown": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "packages/app/node_modules/react-measure": { + "version": "2.5.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.2.0", + "get-node-dimensions": "^1.2.1", + "prop-types": "^15.6.2", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": ">0.13.0", + "react-dom": ">0.13.0" + } + }, + "packages/app/node_modules/react-reflex": { + "version": "4.2.6", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "lodash.throttle": "^4.1.1", + "prop-types": "^15.5.8", + "react-measure": "^2.0.2" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "packages/app/node_modules/react-refresh": { + "version": "0.14.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/react-remove-scroll": { + "version": "2.5.7", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/react-speakup": { + "version": "1.0.0", + "license": "ISC", + "peerDependencies": { + "react": ">=16" + } + }, + "packages/app/node_modules/react-style-singleton": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/react-toggle": { + "version": "4.1.3", + "license": "MIT", + "dependencies": { + "classnames": "^2.2.5" + }, + "peerDependencies": { + "prop-types": ">= 15.3.0 < 19", + "react": ">= 15.3.0 < 19", + "react-dom": ">= 15.3.0 < 19" + } + }, + "packages/app/node_modules/read-binary-file-arch": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "packages/app/node_modules/read-pkg": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/readable-stream": { + "version": "4.5.2", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/app/node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "packages/app/node_modules/redux": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "packages/app/node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/remark-gfm": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/remark-parse": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/remark-rehype": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/remark-stringify": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "packages/app/node_modules/replicate": { + "version": "0.32.0", + "license": "Apache-2.0", + "engines": { + "git": ">=2.11.0", + "node": ">=18.0.0", + "npm": ">=7.19.0", + "yarn": ">=1.7.0" + }, + "optionalDependencies": { + "readable-stream": ">=4.0.0" + } + }, + "packages/app/node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "packages/app/node_modules/resedit": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^1.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "packages/app/node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "license": "MIT" + }, + "packages/app/node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/resolve-dir": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/resolve-package": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-installed-path": "^2.0.3" + }, + "engines": { + "node": ">=4", + "npm": ">=2" + } + }, + "packages/app/node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "packages/app/node_modules/responselike": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/restore-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/app/node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/roarr": { + "version": "2.15.4", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "packages/app/node_modules/robot3": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "packages/app/node_modules/rollup": { + "version": "4.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, + "packages/app/node_modules/rrweb-cssom": { + "version": "0.7.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/safe-array-concat": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "packages/app/node_modules/safe-regex-test": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/safer-buffer": { + "version": "2.1.2", + "devOptional": true, + "license": "MIT" + }, + "packages/app/node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "packages/app/node_modules/semiver": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/semver-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/serialize-error": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "packages/app/node_modules/side-channel": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "packages/app/node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "packages/app/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/slice-ansi": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "packages/app/node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/app/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "packages/app/node_modules/socks": { + "version": "2.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "packages/app/node_modules/socks-proxy-agent": { + "version": "8.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/app/node_modules/sonner": { + "version": "1.5.0", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "packages/app/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "packages/app/node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/app/node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "packages/app/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "packages/app/node_modules/spdx-license-ids": { + "version": "3.0.18", + "dev": true, + "license": "CC0-1.0" + }, + "packages/app/node_modules/split-on-first": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "packages/app/node_modules/ssri": { + "version": "10.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/standardized-audio-context": { + "version": "25.3.75", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "automation-events": "^7.0.7", + "tslib": "^2.6.3" + } + }, + "packages/app/node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "packages/app/node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/stdin-discarder": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/stream-buffers": { + "version": "2.2.0", + "dev": true, + "license": "Unlicense", + "optional": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "packages/app/node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "packages/app/node_modules/strict-event-emitter": { + "version": "0.5.1", + "license": "MIT" + }, + "packages/app/node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "packages/app/node_modules/string.prototype.includes": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "packages/app/node_modules/string.prototype.matchall": { + "version": "4.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "packages/app/node_modules/string.prototype.trim": { + "version": "1.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/string.prototype.trimend": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/stringify-entities": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/strip-eof": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/strip-outer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "packages/app/node_modules/strnum": { + "version": "1.0.5", + "license": "MIT" + }, + "packages/app/node_modules/style-to-object": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "packages/app/node_modules/styled-components": { + "version": "5.3.11", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "packages/app/node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/styled-jsx": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "packages/app/node_modules/sudo-prompt": { + "version": "9.2.1", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/sumchecker": { + "version": "3.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "packages/app/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/tailwind-scrollbar": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "3.x" + } + }, + "packages/app/node_modules/tailwindcss-animate": { + "version": "1.0.7", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "packages/app/node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/tar": { + "version": "6.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "packages/app/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/temp": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "packages/app/node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "packages/app/node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "packages/app/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/textlinestream": { + "version": "1.1.1", + "license": "MIT" + }, + "packages/app/node_modules/tiny-each-async": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/tinypool": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "packages/app/node_modules/tinyrainbow": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/tinyspy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/tmp": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14.14" + } + }, + "packages/app/node_modules/tmp-promise": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "packages/app/node_modules/tn1150": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "unorm": "^1.4.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "packages/app/node_modules/to-data-view": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "packages/app/node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/tough-cookie": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "packages/app/node_modules/tr46": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/trim-repeated": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "packages/app/node_modules/trough": { + "version": "2.2.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "packages/app/node_modules/ts-node": { + "version": "10.9.2", + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "packages/app/node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "license": "MIT" + }, + "packages/app/node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "packages/app/node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "packages/app/node_modules/tw-to-css": { + "version": "0.0.12", + "license": "MIT", + "dependencies": { + "postcss": "8.4.31", + "postcss-css-variables": "0.18.0", + "tailwindcss": "3.3.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/app/node_modules/tw-to-css/node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "packages/app/node_modules/tw-to-css/node_modules/tailwindcss": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/app/node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/app/node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/typed-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/app/node_modules/typed-array-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/typed-array-length": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/typescript": { + "version": "5.5.4", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/app/node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "packages/app/node_modules/unified": { + "version": "11.0.5", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "packages/app/node_modules/unist-util-is": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/unist-util-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/unist-util-remove-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/unist-util-visit": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/universal-user-agent": { + "version": "6.0.1", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "packages/app/node_modules/unorm": { + "version": "1.6.0", + "dev": true, + "license": "MIT or GPL-2.0", + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "packages/app/node_modules/update-browserslist-db": { + "version": "1.1.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "packages/app/node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "packages/app/node_modules/url-join": { + "version": "4.0.1", + "license": "MIT" + }, + "packages/app/node_modules/url-parse": { + "version": "1.5.10", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "packages/app/node_modules/use-callback-ref": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/use-file-picker": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "file-selector": "0.2.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "packages/app/node_modules/use-sidecar": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "packages/app/node_modules/usehooks-ts": { + "version": "2.16.0", + "license": "MIT", + "dependencies": { + "lodash.debounce": "^4.0.8" + }, + "engines": { + "node": ">=16.15.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "packages/app/node_modules/username": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "mem": "^4.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/uuid-random": { + "version": "1.3.2", + "license": "MIT" + }, + "packages/app/node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "license": "MIT" + }, + "packages/app/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "packages/app/node_modules/vfile": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/vfile-message": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "packages/app/node_modules/vite": { + "version": "5.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "packages/app/node_modules/vite-node": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/app/node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "packages/app/node_modules/vitest": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.5", + "@vitest/pretty-format": "^2.0.5", + "@vitest/runner": "2.0.5", + "@vitest/snapshot": "2.0.5", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.5", + "@vitest/ui": "2.0.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "packages/app/node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "packages/app/node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/app/node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "packages/app/node_modules/web-audio-beat-detector": { + "version": "8.2.12", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3", + "web-audio-beat-detector-broker": "^4.1.11", + "web-audio-beat-detector-worker": "^5.2.54" + } + }, + "packages/app/node_modules/web-audio-beat-detector-broker": { + "version": "4.1.11", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "fast-unique-numbers": "^9.0.7", + "standardized-audio-context": "^25.3.75", + "tslib": "^2.6.3", + "web-audio-beat-detector-worker": "^5.2.54" + } + }, + "packages/app/node_modules/web-audio-beat-detector-worker": { + "version": "5.2.54", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3" + } + }, + "packages/app/node_modules/web-streams-polyfill": { + "version": "3.3.3", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "packages/app/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/whatwg-encoding": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/whatwg-url": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/which-builtin-type": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/which-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/app/node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "packages/app/node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "packages/app/node_modules/ws": { + "version": "8.18.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "packages/app/node_modules/xml-name-validator": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "packages/app/node_modules/xmlbuilder": { + "version": "15.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "packages/app/node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "packages/app/node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4" + } + }, + "packages/app/node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "packages/app/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "packages/app/node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "packages/app/node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "packages/app/node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "packages/app/node_modules/yarn-or-npm": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "bin": { + "yarn-or-npm": "bin/index.js", + "yon": "bin/index.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "packages/app/node_modules/yarn-or-npm/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "packages/app/node_modules/yarn-or-npm/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "packages/app/node_modules/yarn-or-npm/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "packages/app/node_modules/yarn-or-npm/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/yarn-or-npm/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "packages/app/node_modules/yarn-or-npm/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "packages/app/node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "packages/app/node_modules/yn": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/app/node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/app/node_modules/yoga-layout": { + "version": "3.1.0", + "license": "MIT" + }, + "packages/app/node_modules/zod-to-json-schema": { + "version": "3.23.2", + "license": "ISC", + "peerDependencies": { + "zod": "^3.23.3" + } + }, + "packages/app/node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/app/node_modules/zx": { + "version": "8.1.4", + "license": "Apache-2.0", + "bin": { + "zx": "build/cli.js" + }, + "engines": { + "node": ">= 12.17.0" + }, + "optionalDependencies": { + "@types/fs-extra": ">=11", + "@types/node": ">=20" + } + }, + "packages/app/node_modules/zx/node_modules/@types/fs-extra": { + "version": "11.0.4", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/zx": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/zx/-/zx-8.1.4.tgz", - "integrity": "sha512-QFDYYpnzdpRiJ3dL2102Cw26FpXpWshW4QLTGxiYfIcwdAqg084jRCkK/kuP/NOSkxOjydRwNFG81qzA5r1a6w==", - "bin": { - "zx": "build/cli.js" - }, - "engines": { - "node": ">= 12.17.0" - }, - "optionalDependencies": { - "@types/fs-extra": ">=11", - "@types/node": ">=20" - } - }, - "node_modules/zx/node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "optional": true, - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } } - } } diff --git a/package.json b/package.json index 195b3627..7b3bdcc4 100644 --- a/package.json +++ b/package.json @@ -1,195 +1,18 @@ { - "name": "clapper", - "version": "0.0.8", - "private": true, - "description": "🎬 Clapper", - "license": "GPL-3.0-only", - "main": "main.js", - "files": [ - "./main.js" - ], - "directories": { - "src:": "./src", - "public:": "./public" - }, - "scripts": { - "dev": "npm i && npm run checks && next dev", - "build": "npm i && npm run prepare && npm run checks && rm -Rf out && next build && npm run build:copyassets", - "build:ci": "rm -Rf out && npm run prepare && next build && npm run build:copyassets", - "build:copyassets": "cp -R public .next/standalone/public && cp -R .next/static .next/standalone/.next/static", - "prepare": "cp -R node_modules/mediainfo.js/dist/MediaInfoModule.wasm public/wasm/", - "start": "next start", - "start:prod": "node .next/standalone/server.js", - "checks": "npm run format:fix && npm run lint", - "format": "prettier --check --ignore-path .gitignore ./src/", - "format:fix": "prettier --write --ignore-path .gitignore ./src/", - "lint": "next lint", - "lint:fix": "next lint --fix", - "test": "npm run build && npm run test:unit:ci", - "test_TEMPORARY_DISABLED": "npm run build && npm run test:unit:ci && npm run test:e2e", - "test:unit:ci": "vitest run", - "test:unit:watch": "vitest", - "test:e2e": "npx playwright test", - "electron": "npm run build && electron .", - "electron:start": "npm run build && electron-forge start", - "electron:package": "npm run build && electron-forge package", - "electron:make": "npm run build && electron-forge make" - }, - "dependencies": { - "@aitube/broadway": "0.2.3", - "@aitube/clap": "0.2.3", - "@aitube/clapper-services": "0.2.3-2", - "@aitube/client": "0.2.3", - "@aitube/engine": "0.2.3", - "@aitube/timeline": "0.2.3", - "@fal-ai/serverless-client": "^0.13.0", - "@ffmpeg/ffmpeg": "^0.12.10", - "@ffmpeg/util": "^0.12.1", - "@gradio/client": "^1.5.0", - "@huggingface/hub": "^0.15.1", - "@huggingface/inference": "^2.8.0", - "@langchain/anthropic": "^0.2.14", - "@langchain/cohere": "^0.2.2", - "@langchain/core": "^0.2.23", - "@langchain/google-vertexai": "^0.0.25", - "@langchain/groq": "^0.0.16", - "@langchain/mistralai": "^0.0.28", - "@langchain/openai": "^0.2.6", - "@monaco-editor/react": "^4.6.0", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-menubar": "^1.0.4", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-progress": "^1.0.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-tooltip": "^1.0.7", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.106.0", - "@react-three/fiber": "^8.16.6", - "@react-three/uikit": "^0.3.4", - "@react-three/uikit-lucide": "^0.3.4", - "@saintno/comfyui-sdk": "^0.1.11", - "@tailwindcss/container-queries": "^0.1.1", - "@types/dom-speech-recognition": "^0.0.4", - "@types/pngjs": "^6.0.5", - "@xenova/transformers": "github:xenova/transformers.js#v3", - "@xyflow/react": "^12.0.3", - "autoprefixer": "10.4.19", - "base64-arraybuffer": "^1.0.2", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^0.2.1", - "comfydeploy": "^0.0.21", - "date-fns": "^3.6.0", - "dotenv": "^16.4.5", - "fflate": "^0.8.2", - "fluent-ffmpeg": "^2.1.3", - "framer-motion": "11.1.7", - "fs-extra": "^11.2.0", - "is-hotkey": "^0.2.0", - "lucide-react": "^0.396.0", - "mediainfo.js": "^0.3.2", - "mlt-xml": "^2.0.2", - "monaco-editor": "^0.50.0", - "next": "^14.2.5", - "next-themes": "^0.3.0", - "pngjs": "^7.0.0", - "qs": "^6.12.1", - "query-string": "^9.0.0", - "react": "^18.3.1", - "react-device-frameset": "^1.3.4", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-drag-drop-files": "^2.3.10", - "react-error-boundary": "^4.0.13", - "react-hook-consent": "^3.5.3", - "react-hotkeys-hook": "^4.5.0", - "react-icons": "^5.2.1", - "react-markdown": "^9.0.1", - "react-reflex": "^4.2.6", - "react-speakup": "^1.0.0", - "remark-gfm": "^4.0.0", - "replicate": "^0.32.0", - "sharp": "0.33.4", - "sonner": "^1.5.0", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "three": "^0.164.1", - "ts-node": "^10.9.2", - "use-file-picker": "^2.1.2", - "usehooks-ts": "^2.14.0", - "uuid": "^9.0.1", - "web-audio-beat-detector": "^8.2.12", - "yaml": "^2.4.5", - "zustand": "4.5.2", - "zx": "^8.1.4" - }, - "devDependencies": { - "@electron-forge/cli": "^7.4.0", - "@electron-forge/maker-deb": "^7.4.0", - "@electron-forge/maker-dmg": "^7.4.0", - "@electron-forge/maker-rpm": "^7.4.0", - "@electron-forge/maker-squirrel": "^7.4.0", - "@electron-forge/maker-zip": "^7.4.0", - "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", - "@electron-forge/publisher-github": "^7.4.0", - "@playwright/test": "^1.45.1", - "@testing-library/react": "^16.0.0", - "@types/fluent-ffmpeg": "^2.1.24", - "@types/is-hotkey": "^0.1.10", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@types/uuid": "^9.0.8", - "@vitejs/plugin-react": "^4.3.1", - "@webgpu/types": "^0.1.44", - "electron": "^31.2.1", - "eslint": "^8", - "eslint-config-next": "14.2.5", - "eslint-config-prettier": "^9.1.0", - "jsdom": "^24.1.0", - "node-gyp": "^10.2.0", - "postcss": "^8", - "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.5", - "tailwind-scrollbar": "^3.1.0", - "tailwindcss": "^3.4.3", - "typescript": "^5.5.0", - "vitest": "^2.0.2" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-libvips-win32-ia32": "1.0.2", - "@img/sharp-libvips-win32-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" + "name": "@clapper/monorepo", + "version": "1.0.0", + "private": true, + "description": "A monorepo for the Clapper project. Individual packages are in the packages directory.", + "workspaces": [ + "packages/*" + ], + "scripts": { + "install": "npm install --workspaces", + "dev": "npm install && npm run dev --workspaces", + "start": "npm run start --workspaces", + "build": "npm install && npm run build --workspaces", + "test": "npm run test --workspaces", + "format": "npm run format --workspaces" + } } -} + \ No newline at end of file diff --git a/.env.example b/packages/app/.env.example similarity index 100% rename from .env.example rename to packages/app/.env.example diff --git a/.eslintrc.json b/packages/app/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to packages/app/.eslintrc.json diff --git a/.gitattributes b/packages/app/.gitattributes similarity index 100% rename from .gitattributes rename to packages/app/.gitattributes diff --git a/packages/app/.gitignore b/packages/app/.gitignore new file mode 100644 index 00000000..e6875095 --- /dev/null +++ b/packages/app/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +/sandbox/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/packages/app/.nvmrc b/packages/app/.nvmrc new file mode 100644 index 00000000..1efe0ac6 --- /dev/null +++ b/packages/app/.nvmrc @@ -0,0 +1 @@ +v20.15.1 diff --git a/.prettierrc.json b/packages/app/.prettierrc.json similarity index 100% rename from .prettierrc.json rename to packages/app/.prettierrc.json diff --git a/Dockerfile b/packages/app/Dockerfile similarity index 100% rename from Dockerfile rename to packages/app/Dockerfile diff --git a/packages/app/LICENSE.txt b/packages/app/LICENSE.txt new file mode 100644 index 00000000..e72bfdda --- /dev/null +++ b/packages/app/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/components.json b/packages/app/components.json similarity index 100% rename from components.json rename to packages/app/components.json diff --git a/forge.config.js b/packages/app/forge.config.js similarity index 100% rename from forge.config.js rename to packages/app/forge.config.js diff --git a/main.js b/packages/app/main.js similarity index 100% rename from main.js rename to packages/app/main.js diff --git a/next.config.js b/packages/app/next.config.js similarity index 100% rename from next.config.js rename to packages/app/next.config.js diff --git a/packages/app/package-lock.json b/packages/app/package-lock.json new file mode 100644 index 00000000..ff73b9cc --- /dev/null +++ b/packages/app/package-lock.json @@ -0,0 +1,21714 @@ +{ + "name": "clapper", + "version": "0.0.8", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "clapper", + "version": "0.0.8", + "license": "GPL-3.0-only", + "dependencies": { + "@aitube/broadway": "0.2.3", + "@aitube/clap": "0.2.3", + "@aitube/clapper-services": "0.2.3-2", + "@aitube/client": "0.2.3", + "@aitube/engine": "0.2.3", + "@aitube/timeline": "0.2.3", + "@fal-ai/serverless-client": "^0.13.0", + "@ffmpeg/ffmpeg": "^0.12.10", + "@ffmpeg/util": "^0.12.1", + "@gradio/client": "^1.5.0", + "@huggingface/hub": "^0.15.1", + "@huggingface/inference": "^2.8.0", + "@langchain/anthropic": "^0.2.14", + "@langchain/cohere": "^0.2.2", + "@langchain/core": "^0.2.23", + "@langchain/google-vertexai": "^0.0.25", + "@langchain/groq": "^0.0.16", + "@langchain/mistralai": "^0.0.28", + "@langchain/openai": "^0.2.6", + "@monaco-editor/react": "^4.6.0", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-menubar": "^1.0.4", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-progress": "^1.0.3", + "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-tooltip": "^1.0.7", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.106.0", + "@react-three/fiber": "^8.16.6", + "@react-three/uikit": "^0.3.4", + "@react-three/uikit-lucide": "^0.3.4", + "@saintno/comfyui-sdk": "^0.1.11", + "@tailwindcss/container-queries": "^0.1.1", + "@types/dom-speech-recognition": "^0.0.4", + "@types/pngjs": "^6.0.5", + "@xenova/transformers": "github:xenova/transformers.js#v3", + "@xyflow/react": "^12.0.3", + "autoprefixer": "10.4.19", + "base64-arraybuffer": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "^0.2.1", + "comfydeploy": "^0.0.21", + "date-fns": "^3.6.0", + "dotenv": "^16.4.5", + "fflate": "^0.8.2", + "fluent-ffmpeg": "^2.1.3", + "framer-motion": "11.1.7", + "fs-extra": "^11.2.0", + "is-hotkey": "^0.2.0", + "lucide-react": "^0.396.0", + "mediainfo.js": "^0.3.2", + "mlt-xml": "^2.0.2", + "monaco-editor": "^0.50.0", + "next": "^14.2.5", + "next-themes": "^0.3.0", + "pngjs": "^7.0.0", + "qs": "^6.12.1", + "query-string": "^9.0.0", + "react": "^18.3.1", + "react-device-frameset": "^1.3.4", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.3.1", + "react-drag-drop-files": "^2.3.10", + "react-error-boundary": "^4.0.13", + "react-hook-consent": "^3.5.3", + "react-hotkeys-hook": "^4.5.0", + "react-icons": "^5.2.1", + "react-markdown": "^9.0.1", + "react-reflex": "^4.2.6", + "react-speakup": "^1.0.0", + "remark-gfm": "^4.0.0", + "replicate": "^0.32.0", + "sharp": "0.33.4", + "sonner": "^1.5.0", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "three": "^0.164.1", + "ts-node": "^10.9.2", + "use-file-picker": "^2.1.2", + "usehooks-ts": "^2.14.0", + "uuid": "^9.0.1", + "web-audio-beat-detector": "^8.2.12", + "yaml": "^2.4.5", + "zustand": "4.5.2", + "zx": "^8.1.4" + }, + "devDependencies": { + "@electron-forge/cli": "^7.4.0", + "@electron-forge/maker-deb": "^7.4.0", + "@electron-forge/maker-dmg": "^7.4.0", + "@electron-forge/maker-rpm": "^7.4.0", + "@electron-forge/maker-squirrel": "^7.4.0", + "@electron-forge/maker-zip": "^7.4.0", + "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", + "@electron-forge/publisher-github": "^7.4.0", + "@playwright/test": "^1.45.1", + "@testing-library/react": "^16.0.0", + "@types/fluent-ffmpeg": "^2.1.24", + "@types/is-hotkey": "^0.1.10", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "@types/uuid": "^9.0.8", + "@vitejs/plugin-react": "^4.3.1", + "@webgpu/types": "^0.1.44", + "electron": "^31.2.1", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "eslint-config-prettier": "^9.1.0", + "jsdom": "^24.1.0", + "node-gyp": "^10.2.0", + "postcss": "^8", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwind-scrollbar": "^3.1.0", + "tailwindcss": "^3.4.3", + "typescript": "^5.5.0", + "vitest": "^2.0.2" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-libvips-win32-ia32": "1.0.2", + "@img/sharp-libvips-win32-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "node_modules/@aitube/broadway": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/broadway/-/broadway-0.2.3.tgz", + "integrity": "sha512-zuJ8zsVbTury3Phw7flMit8TnlnlLaSympkuxdR1Aea5YeZOOZmJh5+S/Y1f+xkcj9wox2ej8J8XGfIJWbd3RA==", + "dependencies": { + "@datagica/parse-entities": "^0.3.0", + "@datagica/parse-names": "^0.0.8", + "indexeddb-fs": "^2.1.5" + }, + "peerDependencies": { + "@aitube/clap": "0.2.3", + "@aitube/colors": "0.2.3" + } + }, + "node_modules/@aitube/clap": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.2.3.tgz", + "integrity": "sha512-qT0wI6R5BrkIWDr1Dog/GPMYjKnwy5glwO3MibPcM0BWJVQlbj0cy0qbwH+wZPC1ZmRZnaJPlhCEj5e3/U6UsA==", + "dependencies": { + "pure-uuid": "^1.8.1" + }, + "peerDependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/@aitube/clapper-services": { + "version": "0.2.3-2", + "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.2.3-2.tgz", + "integrity": "sha512-Qd6Riridk4FVcTjlscxw5wsbUgojwi1wkTIjlgPluhT5J5kLyEJQL/hmT2gBDBRsB4kyieVNZiGflgXnauDENw==", + "peerDependencies": { + "@aitube/clap": "0.2.3", + "@aitube/timeline": "0.2.3", + "@monaco-editor/react": "4.6.0", + "monaco-editor": "0.50.0", + "react": "*", + "react-dom": "*", + "zustand": "4.5.2" + } + }, + "node_modules/@aitube/client": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/client/-/client-0.2.3.tgz", + "integrity": "sha512-REgFjqvK2I+Qe4tbabHwtU5uNxQwOHMXY2XQAIN34Ff7wrd4Y4vaWB3EZ37l/yKgt7Bd3kldp2ddDt09osedMQ==", + "dependencies": { + "query-string": "^9.0.0" + }, + "peerDependencies": { + "@aitube/clap": "0.2.3" + } + }, + "node_modules/@aitube/colors": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/colors/-/colors-0.2.3.tgz", + "integrity": "sha512-bqie0eFUG/UA62lhJIibCVPdBNyudqE9YF6HoWMY2JpFtjV3EHJlla3NuXtTgfTgs7XGcmtTyqoXtmPsRSHZtw==", + "peer": true, + "peerDependencies": { + "@aitube/clap": "0.2.3" + } + }, + "node_modules/@aitube/engine": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/engine/-/engine-0.2.3.tgz", + "integrity": "sha512-y6KktN1BU5L/WFC5rrNwx0CHdQYM9xPJX1fTPZVDYfZC/6NJhn1Rm1SAnV1SkkP+3NCDQBabKvUivjmZY0CFDw==", + "peerDependencies": { + "@aitube/clap": "0.2.3" + } + }, + "node_modules/@aitube/timeline": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.2.3.tgz", + "integrity": "sha512-zr9G5t/koz/vwXxKHs2qFot5gSau72J+luTfBK0o1tgf/TK/+yP6ACO3QbO8kAmkqa6wtWuBHdVXkVceB8z7Rw==", + "dependencies": { + "date-fns": "^3.6.0", + "react-virtualized-auto-sizer": "^1.0.24" + }, + "peerDependencies": { + "@aitube/clap": "0.2.3", + "@radix-ui/react-slider": "^1.1.2", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.105.4", + "@react-three/fiber": "^8.16.2", + "clsx": "^2.1.1", + "react": "*", + "react-dom": "*", + "tailwind-merge": "^2.4.0", + "tailwindcss": "^3.4.6", + "three": "^0.164.1", + "zustand": "4.5.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.624.0.tgz", + "integrity": "sha512-imw3bNptHdhcogU3lwSVlQJsRpTxnkT4bQbchS/qX6+fF0Pk6ERZ+Q0YjzitPqTjkeyAWecUT4riyqv2djo+5w==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.624.0.tgz", + "integrity": "sha512-J04HAxGhC3dQRn43aPcPL6C+uW0wd0gR/dehFqJJA+XvSNLxa9HEiTjYUHCHUY+iaLQn5QCk7ICKRosynhQkxw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", + "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", + "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", + "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", + "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", + "dependencies": { + "@smithy/core": "^2.3.2", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.624.0.tgz", + "integrity": "sha512-gbXaxZP29yzMmEUzsGqUrHpKBnfMBtemvrlufJbaz/MGJNIa5qtJQp7n1LMI5R49DBVUN9s/e9Rf5liyMvlHiw==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.622.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", + "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", + "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", + "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", + "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.624.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.624.0.tgz", + "integrity": "sha512-SX+F5x/w8laQkhXLd1oww2lTuBDJSxzXWyxuOi25a9s4bMDs0V/wOj885Vr6h8QEGi3F8jZ8aWLwpsm2yuk9BA==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/credential-provider-cognito-identity": "3.624.0", + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.374.0.tgz", + "integrity": "sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==", + "deprecated": "This package has moved to @smithy/protocol-http", + "dependencies": { + "@smithy/protocol-http": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", + "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.374.0.tgz", + "integrity": "sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==", + "deprecated": "This package has moved to @smithy/signature-v4", + "dependencies": { + "@smithy/signature-v4": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/signature-v4": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", + "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", + "dependencies": { + "@smithy/eventstream-codec": "^1.1.0", + "@smithy/is-array-buffer": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "@smithy/util-uri-escape": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "dependencies": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", + "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-middleware": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", + "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", + "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", + "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@datagica/fast-index": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@datagica/fast-index/-/fast-index-0.1.0.tgz", + "integrity": "sha512-e6jK4wWGROc8lgps2agayuKXQIqOjvTL8brgFLEtzUzYwdVbzfc8foOW4SpmA43/desLU1YgoASredFmmFWqcQ==" + }, + "node_modules/@datagica/parse-entities": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@datagica/parse-entities/-/parse-entities-0.3.0.tgz", + "integrity": "sha512-Ai/SZAANZ4sUpcAIeW8C7M5I5tVymKengXaKYiNtmJmWBl79e+VBWUPxcv2DLmIcZ5CQxWnJUgSVyQ9NIfyQUw==", + "dependencies": { + "@datagica/treegram": "^0.3.0" + } + }, + "node_modules/@datagica/parse-names": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@datagica/parse-names/-/parse-names-0.0.8.tgz", + "integrity": "sha512-wfpGYgJIB35XOPlb4CFC148XrYcbXN+ZP3pt/mSJbxF46tyacgfZ+9+KHfDK0M0H6eKx7Ngm1DhYCbAY3JyXyA==", + "dependencies": { + "@datagica/parse-entities": "^0.2.7" + } + }, + "node_modules/@datagica/parse-names/node_modules/@datagica/fast-index": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@datagica/fast-index/-/fast-index-0.0.7.tgz", + "integrity": "sha512-S0bBOIh15KRjQkUvmGijhPci8K+/k0yw5oatGwDGPL1AOVoJNkXt8d8Dnt71k7uWr1S2k4akIlytkh9V3TrlQw==" + }, + "node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@datagica/parse-entities/-/parse-entities-0.2.8.tgz", + "integrity": "sha512-RP0ol+uG7jzpWR3kBZMtoQ3/8F71Sjrt/3LtDp6By3/8EA5wxeHCXwy8iqFQUpQiC0L1K9sjg0wRjKqLwECw2g==", + "dependencies": { + "@datagica/treegram": "^0.2.8" + } + }, + "node_modules/@datagica/parse-names/node_modules/@datagica/treegram": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@datagica/treegram/-/treegram-0.2.9.tgz", + "integrity": "sha512-IDhQUFmA8TqkjBnJtXRXFTPOPmorJswFEw7k5YCbxvLj7O2hqojs5pfCaS31rdOe0VXxmde+AFidUZqVtLaR6w==", + "dependencies": { + "@datagica/fast-index": "^0.0.7", + "@datagica/tokenize": "^0.0.2" + } + }, + "node_modules/@datagica/tokenize": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@datagica/tokenize/-/tokenize-0.0.2.tgz", + "integrity": "sha512-MmZwlj5yzp3HzFSFEYOCvzC/IURsaQmRuLKy5rfoOzPk7NPHYnq0Vct9MxeZ+3jjRoTHI/PpUlDKKF93ngVe7Q==" + }, + "node_modules/@datagica/treegram": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@datagica/treegram/-/treegram-0.3.0.tgz", + "integrity": "sha512-iZAqiQI1jsgI+MYwbCRhKUpev+eIVyP0JZoL/E7rJE0k5V5yTbunt7K/KyyLYRpGfRIkzaDga1qfr8wrskeJIQ==", + "dependencies": { + "@datagica/fast-index": "^0.1.0", + "@datagica/tokenize": "^0.0.2" + } + }, + "node_modules/@electron-forge/cli": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.4.0.tgz", + "integrity": "sha512-a+zZv3ja/IxkJzNyx4sOHSZv6DPV85S0PEVF6pcRjUpbDL5r+DxjRFsNc0Nq4UIWyFm1nw7RWoPdd9uDst4Tvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "@electron-forge/core": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@electron/get": "^3.0.0", + "chalk": "^4.0.0", + "commander": "^4.1.1", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "listr2": "^7.0.2", + "semver": "^7.2.1" + }, + "bin": { + "electron-forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/cli/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/core": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.4.0.tgz", + "integrity": "sha512-pYHKpB2CKeQgWsb+gox+FPkEvP+6Q2zGj2eZtgZRtKppoWIXrHIpOtcm6FllJ/gZ5u4AsQzVIYReAHGaBa0osw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "@electron-forge/core-utils": "7.4.0", + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/plugin-base": "7.4.0", + "@electron-forge/publisher-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "@electron-forge/template-vite": "7.4.0", + "@electron-forge/template-vite-typescript": "7.4.0", + "@electron-forge/template-webpack": "7.4.0", + "@electron-forge/template-webpack-typescript": "7.4.0", + "@electron-forge/tracer": "7.4.0", + "@electron/get": "^3.0.0", + "@electron/packager": "^18.3.1", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "fast-glob": "^3.2.7", + "filenamify": "^4.1.0", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5", + "interpret": "^3.1.1", + "listr2": "^7.0.2", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "rechoir": "^0.8.0", + "resolve-package": "^1.0.1", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/core-utils": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.4.0.tgz", + "integrity": "sha512-9RLG0F9SX466TpkaTcW+V15KmnGuTpmr7NKMRlngtHXmnkBUJz4Mxp1x33WZLgL90dJrxrRgHSfVBtA4lstDPw==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "semver": "^7.2.1", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/core-utils/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-base": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.4.0.tgz", + "integrity": "sha512-LwWS4VPdwjISl1KpLhmM1Qr1M3sRTTQ/RsX+GlFd7cQ1W/FsgxMjaTG4Od1d+a5CGVTh3s6X2g99TSUfxjOveg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "fs-extra": "^10.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/maker-base/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-deb": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.4.0.tgz", + "integrity": "sha512-npWea3IpGeu96xNqJpsCOYX6V4E+HY6u/okeTUzUOMX96UteT14MecdUefMam158glRTX84k2ryh7WcBoOa4mg==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-debian": "^3.2.0" + } + }, + "node_modules/@electron-forge/maker-dmg": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.4.0.tgz", + "integrity": "sha512-xRCMNtnpvQNwrDYvwbVFegnErnIMpHGZANrjwushlH9+Fsu60DFvf5s3AVkgsYdQTqlY7wYRG1mziYZmRlPAIw==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-dmg": "^4.0.0" + } + }, + "node_modules/@electron-forge/maker-dmg/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-rpm": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.4.0.tgz", + "integrity": "sha512-N64Yh/K/91GzIk28T1jKsCGgYaquDuhXcEJW+TkVyP5tPZ9aTz9SjXLBxAg8WhcroArAZEsVyPOFKthmFzAUuA==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-redhat": "^3.2.0" + } + }, + "node_modules/@electron-forge/maker-squirrel": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.4.0.tgz", + "integrity": "sha512-mCQyufnSNfjffiKho59ZqVg4W601zGOl6h01OyfDwjOU/G4iQtpnnDEOXGe26q7OVT5ORb1WDnfyGgBeJ6Ge7g==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-winstaller": "^5.3.0" + } + }, + "node_modules/@electron-forge/maker-squirrel/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/maker-zip": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.4.0.tgz", + "integrity": "sha512-UGbMdpuK/P29x1FFRWNOs3bNz+7QNFWVWyTM5hcWqib66cNuUmoaPifQyuwW2POIrIohrxlzLK87/i9Zc8g4dA==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "cross-zip": "^4.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/maker-zip/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/plugin-auto-unpack-natives": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.4.0.tgz", + "integrity": "sha512-jJ/v2blH32bcvdlJbeeW/yO99K9SduW8yrS7zuFN6y+B1cmzLd+S7L8oCcOghFDMAlYjQaBlnCe/nMJbT9mN4g==", + "dev": true, + "dependencies": { + "@electron-forge/plugin-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/plugin-base": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.4.0.tgz", + "integrity": "sha512-LcTNtEc2YaWvhhqWVIfdJ+J0/krSgc2dqYAHhOH2aLUSm9End3dKO/PZ1Y6DPsiPiJKHnSLBJ/XBN/16NY4Sjw==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/publisher-base": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.4.0.tgz", + "integrity": "sha512-PiJk4RfaC55SnVnteLW2ZIQNM9DpGOi6YoUn5t8i9UcVp2rFIdya7bJY/b9u1hwubm4d5+TdypMVEuJjM44CJQ==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/publisher-github": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-github/-/publisher-github-7.4.0.tgz", + "integrity": "sha512-hrxKNssJyU8Yuz0qv384y5RKojMG0nWeG7/kidjp8PX/RnqjGRU/JJ0Worl28g8LGiLt5R5JIfNLngLaFMn8tg==", + "dev": true, + "dependencies": { + "@electron-forge/publisher-base": "7.4.0", + "@electron-forge/shared-types": "7.4.0", + "@octokit/core": "^3.2.4", + "@octokit/plugin-retry": "^3.0.9", + "@octokit/request-error": "^2.0.5", + "@octokit/rest": "^18.0.11", + "@octokit/types": "^6.1.2", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "mime-types": "^2.1.25" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/publisher-github/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/shared-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.4.0.tgz", + "integrity": "sha512-5Ehy6enUjBaU08odf9u9TOhmOVXlqobzMvKUixtkdAWgV1XZAUJmn+p21xhj0IkO92MQiXMGv66w9pDNjRT8uQ==", + "dev": true, + "dependencies": { + "@electron-forge/tracer": "7.4.0", + "@electron/packager": "^18.3.1", + "@electron/rebuild": "^3.2.10", + "listr2": "^7.0.2" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-base": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.4.0.tgz", + "integrity": "sha512-3YWdRSGzQfQPQkQxStn2wkJ/SuNGGKo9slwFJGvqMV+Pbx3/M/hYi9sMXOuaqVZgeaBp8Ap27yFPxaIIOC3vcA==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-base/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-vite": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.4.0.tgz", + "integrity": "sha512-YPVyCGiBKmZPCxK/Bd2louV3PBcxI2nT2+tRKP+mlEHOWrxbZIfmZSR2lIAFvK/ALKlwUKROdmlwyi7ZcdT7JQ==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.4.0.tgz", + "integrity": "sha512-wdByG807VWcUd81E6572b/G/Ki8gb+GrCIWxO7Cl3qBa+yNaU1sHhBwB1RyTbQy1r8ubSBtsWrRD1J/yzHKWoQ==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-vite/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-webpack": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.4.0.tgz", + "integrity": "sha512-W558AEGwQrwEtKIbIJPPs0LIsaC/1Vncj5NgqKehEMJjBb0KQq4hwBu/6dauQrfun4jRCOp7LV+OVrf5XPJ7QA==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-webpack-typescript": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.4.0.tgz", + "integrity": "sha512-O5gwjNSGFNRdJWyiCtevcOBDPAMhgOPvLORh9qR1GcjyTutWwHWmZzycqH+MmkhpQPgrAYDEeipXcOQhSbzNZA==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "7.4.0", + "@electron-forge/template-base": "7.4.0", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 16.4.0" + } + }, + "node_modules/@electron-forge/template-webpack-typescript/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/template-webpack/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron-forge/tracer": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.4.0.tgz", + "integrity": "sha512-F4jbnDn4yIZjmky1FZ6rgBKTM05AZQQfHkyJW2hdS4pDKJjdKAqWytoZKDi1/S6Cr6tN+DD0TFGD3V0i6HPHYQ==", + "dev": true, + "dependencies": { + "chrome-trace-event": "^1.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", + "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/packager": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.3.tgz", + "integrity": "sha512-hGXzwbUdxv49XvlYwlVPC6W6j6WaXUAzKkYyyTeiwdhxvHFMfQSEJxVHsQpqMFzZZ7wrr7iqiokOFZ/qkgEzUQ==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^3.0.0", + "@electron/notarize": "^2.1.0", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^2.0.1", + "@electron/windows-sign": "^1.0.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "resedit": "^2.0.0", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 16.13.0" + }, + "funding": { + "url": "https://github.com/electron/packager?sponsor=1" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", + "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/@electron/rebuild/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@electron/rebuild/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/rebuild/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/rebuild/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@electron/rebuild/node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@electron/rebuild/node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@electron/rebuild/node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/@electron/rebuild/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@electron/rebuild/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@electron/rebuild/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@electron/universal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.3.tgz", + "integrity": "sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw==", + "dev": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fal-ai/serverless-client": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fal-ai/serverless-client/-/serverless-client-0.13.0.tgz", + "integrity": "sha512-Nkb/5YXJIPQHzM79+fRb1LZ1zQLSSvNhDVL2l62sN6/H4XqAWueIOqAAvPF8ds39uSGn8nF1WQV1mt7raVMlWw==", + "dependencies": { + "@msgpack/msgpack": "^3.0.0-beta2", + "eventsource-parser": "^1.1.2", + "robot3": "^0.4.1", + "uuid-random": "^1.3.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@ffmpeg/ffmpeg": { + "version": "0.12.10", + "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.10.tgz", + "integrity": "sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ==", + "dependencies": { + "@ffmpeg/types": "^0.12.2" + }, + "engines": { + "node": ">=18.x" + } + }, + "node_modules/@ffmpeg/types": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.2.tgz", + "integrity": "sha512-NJtxwPoLb60/z1Klv0ueshguWQ/7mNm106qdHkB4HL49LXszjhjCCiL+ldHJGQ9ai2Igx0s4F24ghigy//ERdA==", + "engines": { + "node": ">=16.x" + } + }, + "node_modules/@ffmpeg/util": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@ffmpeg/util/-/util-0.12.1.tgz", + "integrity": "sha512-10jjfAKWaDyb8+nAkijcsi9wgz/y26LOc1NKJradNMyCIl6usQcBbhkjX5qhALrSBcOy6TOeksunTYa+a03qNQ==", + "engines": { + "node": ">=18.x" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", + "dependencies": { + "@floating-ui/utils": "^0.2.7" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@gradio/client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@gradio/client/-/client-1.5.0.tgz", + "integrity": "sha512-ZQ1coiujVZjVfas0zyyFgVQOocUL+pnYJagRNfLTzCsJ0m/DXGngELhGTM/QjIVkJGVDuhUyY5VCM7vD1n4LDQ==", + "dependencies": { + "@types/eventsource": "^1.1.15", + "bufferutil": "^4.0.7", + "eventsource": "^2.0.2", + "fetch-event-stream": "^0.1.5", + "msw": "^2.2.1", + "semiver": "^1.1.0", + "textlinestream": "^1.1.1", + "typescript": "^5.0.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@huggingface/hub": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-0.15.1.tgz", + "integrity": "sha512-uHb4aFkJDoGfLeRHfFTjkI36Z8IV6Z1c+KzhMDqUSC56opyr7Mn1Nsx7Rri/C7KDwROhQfBp/fOOqqjTzn6Cgg==", + "dependencies": { + "@huggingface/tasks": "^0.10.6", + "hash-wasm": "^4.9.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/inference": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@huggingface/inference/-/inference-2.8.0.tgz", + "integrity": "sha512-Ti681P1qckcCAqgzmL53jBnluPuZGelmMIuXNjgAwC5+RIjF4S0SDQu6oy44ZTwekwNp2ETaZ2sXsOk+45aC4w==", + "dependencies": { + "@huggingface/tasks": "^0.11.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/inference/node_modules/@huggingface/tasks": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.11.8.tgz", + "integrity": "sha512-HOdx2vwhd/rCmy6gpDPiUbsXD+vwVpYSS/h2Tx+yV1uMDfS98MWl/TvoVGV+u5cJWTFbvdiTHMXIuw8B6JbHuQ==" + }, + "node_modules/@huggingface/jinja": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.0.tgz", + "integrity": "sha512-GLJzso0M07ZncFkrJMIXVU4os6GFbPocD4g8fMQPMGJubf48FtGOsUORH2rtFdXPIPelz8SLBMn8ZRmOTwXm9Q==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/tasks": { + "version": "0.10.22", + "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.10.22.tgz", + "integrity": "sha512-sCtp+A6sq6NXoUU7NXuXWoVNNjKddk1GTQIh3cJ6illF8S4zmFoerCVRvFf19BdgICGvF+RVZiv9sGGK9KRDTg==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", + "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", + "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-win32-ia32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-win32-ia32/-/sharp-libvips-win32-ia32-1.0.2.tgz", + "integrity": "sha512-NDMPtXP7TTnm7588hpVwzUm48oMH3GOP8UKZLeBpL4yTLY89Jya3QBuKTVkh22GJGs8rV0ben7raSWXWsfMyww==", + "optional": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-win32-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-win32-x64/-/sharp-libvips-win32-x64-1.0.2.tgz", + "integrity": "sha512-rpNEXU8TJSrwmYh/pOoKNxsYcnA92MfuUmNWEz7Twb2kRffK23zIIIIf2Km3wqLhbLR2hqvGB5g2avN9SMQTvg==", + "optional": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", + "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", + "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", + "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", + "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", + "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", + "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", + "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/confirm": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", + "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", + "dependencies": { + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", + "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", + "dependencies": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.2", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.1.0", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", + "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "optional": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@langchain/anthropic": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.14.tgz", + "integrity": "sha512-qTFlsMej8SE0hz6IrqcQTkza/TGnlc7Tq/9W65TjQGLX51rGCYkprbLfpTi/LL9gahdB9VvB2Q5knUL0/N/xtQ==", + "dependencies": { + "@anthropic-ai/sdk": "^0.22.0", + "@langchain/core": ">=0.2.21 <0.3.0", + "fast-xml-parser": "^4.4.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/cohere": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@langchain/cohere/-/cohere-0.2.2.tgz", + "integrity": "sha512-XbH6vBnPz0dmJaTMKMFriFhh4eYiajYrEg7Jr0bdejj7s7lxhST92znNrJezi76LjSTtDQo3PyLBKDktk8OxKw==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "cohere-ai": "^7.10.5", + "uuid": "^10.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/cohere/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/core": { + "version": "0.2.23", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.23.tgz", + "integrity": "sha512-elPg6WpAkxWEIGC9u38F2anbzqfYYEy32lJdsd9dtChcHSFmFLlXqa+SnpO3R772gUuJmcu+Pd+fCvmRFy029w==", + "dependencies": { + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "~0.1.39", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@langchain/core/node_modules/langsmith": { + "version": "0.1.41", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.41.tgz", + "integrity": "sha512-8R7s/225Pxmv0ipMfd6sqmWVsfHLQivYlQZ0vx5K+ReoknummTenQlVK8gapk3kqRMnzkrouuRHMhWjMR6RgUA==", + "dependencies": { + "@types/uuid": "^9.0.1", + "commander": "^10.0.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@langchain/core": "*", + "langchain": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "langchain": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "node_modules/@langchain/core/node_modules/langsmith/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/core/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/google-common": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@langchain/google-common/-/google-common-0.0.25.tgz", + "integrity": "sha512-5k9WrEAVT7po+NBa+36Xr2mkZzbw5JAV9kkdi4hjE3mCK8KS8s1kIqkbKZ4wfYCCP59ZcPs5MZayzbNdq8Dhag==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "uuid": "^10.0.0", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/google-common/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/google-gauth": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@langchain/google-gauth/-/google-gauth-0.0.25.tgz", + "integrity": "sha512-M6kFGZNDGwYNQvr0kNCMQEWvxk8P8yGDk/KQul9UjjWrAmJuJ8qsVEtucvTzFIppj4ee6LR5CGxSJSmIynKMhQ==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/google-common": "~0.0.25", + "google-auth-library": "^8.9.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/google-vertexai": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@langchain/google-vertexai/-/google-vertexai-0.0.25.tgz", + "integrity": "sha512-hXiTz7gsTXou8CXZVauDmFZWzsjIKUTBUa9hPgpxj/Rh3/EV6esixI9+HWVn20kATjaZ7bY1aD8RI0+krQ52vw==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/google-gauth": "~0.0.25" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/groq": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@langchain/groq/-/groq-0.0.16.tgz", + "integrity": "sha512-rwD57PzT54clE4WigMzTMmA9rIifXq82uQ9nqFHJ4hfDV38P2lbQ1/N21QE0+L8c9oKvdY+TVm0vlilxV4w22A==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/openai": "~0.2.6", + "groq-sdk": "^0.5.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/mistralai": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-0.0.28.tgz", + "integrity": "sha512-6+6AUlRtNTw+fZatbrYNBaZn2Qgn8s+EMBhrpmT5pG4n5usQ57zIKT9VKfv4nJOauBF9J3+3+GiA4bwC8tmkNw==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@mistralai/mistralai": "^0.4.0", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/mistralai/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/openai": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.6.tgz", + "integrity": "sha512-LZgSzHOZPJGsZr2ZXJICqZo1GN0kUyP9/RN+T45g7HDdMRfS5Df7fJgY9w7EIfznT83Q0Ywhz+At/UvWMR3xhw==", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "js-tiktoken": "^1.0.12", + "openai": "^4.55.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, + "node_modules/@mistralai/mistralai": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.4.0.tgz", + "integrity": "sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==", + "dependencies": { + "node-fetch": "^2.6.7" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", + "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", + "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", + "dependencies": { + "@monaco-editor/loader": "^1.4.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/@msgpack/msgpack": { + "version": "3.0.0-beta2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", + "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", + "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@next/env": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", + "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", + "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.40.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", + "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.39.0", + "deprecation": "^2.3.1" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz", + "integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "bottleneck": "^2.15.3" + } + }, + "node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", + "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", + "devOptional": true, + "dependencies": { + "playwright": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@pmndrs/uikit": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@pmndrs/uikit/-/uikit-0.3.13.tgz", + "integrity": "sha512-DxKE1kHBnp6C7Bp57KwfPcM4BSwlE+7sbyntwzIyIBHPqH2786nEeZNn5hkYMIw9Gjw1ioEXRLoyIZ16UwYGfQ==", + "dependencies": { + "@preact/signals-core": "^1.5.1", + "inline-style-parser": "^0.2.3", + "node-html-parser": "^6.1.13", + "tw-to-css": "^0.0.12", + "yoga-layout": "^3.0.4" + }, + "peerDependencies": { + "three": ">=0.160" + } + }, + "node_modules/@preact/signals-core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", + "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.0.tgz", + "integrity": "sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collapsible": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz", + "integrity": "sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", + "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz", + "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.1.tgz", + "integrity": "sha512-V05Hryq/BE2m+rs8d5eLfrS0jmSWSDHEbG7jEyLA5D5J9jTvWj/o3v3xDN9YsOlH6QIkJgiaNDaP+S4T1rdykw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.0.tgz", + "integrity": "sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz", + "integrity": "sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", + "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", + "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", + "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", + "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@react-dnd/asap": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", + "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" + }, + "node_modules/@react-dnd/invariant": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", + "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", + "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" + }, + "node_modules/@react-spring/animated": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.4.tgz", + "integrity": "sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==", + "dependencies": { + "@react-spring/shared": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.4.tgz", + "integrity": "sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==", + "dependencies": { + "@react-spring/animated": "~9.7.4", + "@react-spring/shared": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.4.tgz", + "integrity": "sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.4.tgz", + "integrity": "sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==", + "dependencies": { + "@react-spring/rafz": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.4.tgz", + "integrity": "sha512-HKUhrrvWW7F/MAroObOloqcYyFqsUHp1ANIDvPVxk9cSh7veW7gQbJm2Sc7Ka+L4gVJEwSkS+MRfr8kk+sRZBw==", + "dependencies": { + "@react-spring/animated": "~9.7.4", + "@react-spring/core": "~9.7.4", + "@react-spring/shared": "~9.7.4", + "@react-spring/types": "~9.7.4" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.4.tgz", + "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==" + }, + "node_modules/@react-three/drei": { + "version": "9.109.5", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.5.tgz", + "integrity": "sha512-Ftw2d01N+83aXTOOMA5y8hF2KBU0w7gBEctyjeHJihUyRuLBdfcgfu5c1OhBjhrdy23ycSYRINaeLkqUBPDFxQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "node_modules/@react-three/drei/node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-three/drei/node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "node_modules/@react-three/drei/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "8.16.8", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", + "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@react-three/uikit": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@react-three/uikit/-/uikit-0.3.13.tgz", + "integrity": "sha512-tS6JFpKygxJSCr0z3K7KEv+VFkBQckDgcOpQzcqaCHgDNf/jGr1uudieqCCct31hChO6bosIq42SRhIvR//DnA==", + "dependencies": { + "@pmndrs/uikit": "^0.3.13", + "@preact/signals-core": "^1.5.1", + "chalk": "^5.3.0", + "commander": "^12.0.0", + "ora": "^8.0.1", + "prettier": "^3.2.5", + "prompts": "^2.4.2", + "zod": "^3.22.4", + "zustand": "^4.5.2" + }, + "bin": { + "uikit": "dist/cli/index.js" + }, + "peerDependencies": { + "@react-three/fiber": ">=8", + "react": ">=18" + } + }, + "node_modules/@react-three/uikit-lucide": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@react-three/uikit-lucide/-/uikit-lucide-0.3.13.tgz", + "integrity": "sha512-VFdwvR7YTPlia4o8rsiIbrB6k2d31Bkm/gcEqS/1+J6kkXaLOwGCE0jmmPu3/4um7bsUK83Ni1/KiafhsmBnOQ==", + "dependencies": { + "@react-three/uikit": "^0.3.13" + } + }, + "node_modules/@react-three/uikit/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@react-three/uikit/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-three/uikit/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-three/uikit/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/@react-three/uikit/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-three/uikit/node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-three/uikit/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-three/uikit/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-three/uikit/node_modules/ora": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-three/uikit/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-three/uikit/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "dev": true + }, + "node_modules/@saintno/comfyui-sdk": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@saintno/comfyui-sdk/-/comfyui-sdk-0.1.11.tgz", + "integrity": "sha512-k8Wui1ejYKOKhEF4WvNiNz3DTCtg+zJSnwKBKP6AHn9xOp+73mNF7F+TXXTTTuq9SCVNQdalEXTkDS6uDnEmxg==", + "dependencies": { + "@types/node": "^22.2.0", + "bun-types": "^1.1.22", + "ws": "^8.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/@saintno/comfyui-sdk/node_modules/@types/node": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", + "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "node_modules/@saintno/comfyui-sdk/node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", + "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", + "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", + "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", + "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", + "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", + "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", + "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", + "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", + "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", + "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "dependencies": { + "@smithy/types": "^3.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", + "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", + "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", + "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", + "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", + "dependencies": { + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "dependencies": { + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", + "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "dependencies": { + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", + "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tailwindcss/container-queries": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", + "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", + "peerDependencies": { + "tailwindcss": ">=3.2.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/react": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", + "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/dom-speech-recognition": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.4.tgz", + "integrity": "sha512-zf2GwV/G6TdaLwpLDcGTIkHnXf8JEf/viMux+khqKQKDa8/8BAUtXXZS563GnvJ4Fg0PBLGAaFf2GekEVSZ6GQ==" + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/eventsource": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-1.1.15.tgz", + "integrity": "sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==" + }, + "node_modules/@types/fluent-ffmpeg": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.25.tgz", + "integrity": "sha512-a9/Jtv/RVaCG4lUwWIcuClWE5eXJFoFS/oHOecOv/RS8n+lQdJzcJVmDlxA8Xbk4B82YpO88Dijcoljb6sYTcA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/is-hotkey": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.10.tgz", + "integrity": "sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "optional": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, + "node_modules/@types/pngjs": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", + "integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==" + }, + "node_modules/@types/three": { + "version": "0.167.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", + "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" + }, + "node_modules/@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", + "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", + "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.44", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.44.tgz", + "integrity": "sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ==", + "dev": true + }, + "node_modules/@xenova/transformers": { + "version": "3.0.0-alpha.0", + "resolved": "git+ssh://git@github.com/xenova/transformers.js.git#222b94ed69158798c463d5fb374efbe44da199da", + "dependencies": { + "@huggingface/jinja": "^0.3.0", + "onnxruntime-web": "^1.18.0", + "sharp": "^0.33.2" + }, + "optionalDependencies": { + "onnxruntime-node": "^1.18.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xyflow/react": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.0.4.tgz", + "integrity": "sha512-eeQzw1gIbLKOB55rp2+20uB1PASDUf1q6zy2VsgugnuPEcL/olVMX3WT42XxyG8m3rcbUiHlq2NSmPTFWEjiUQ==", + "dependencies": { + "@xyflow/system": "0.0.37", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.37.tgz", + "integrity": "sha512-hSIhezhxgftPUpC+xiQVIorcRILZUOWlLjpYPTyGWRu8s4RJvM4GqvrsFmD5OnMKXLgpU7/PqqUibDVO67oWQQ==", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/appdmg": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", + "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" + }, + "bin": { + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", + "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", + "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", + "dev": true, + "optional": true, + "dependencies": { + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + }, + "optionalDependencies": { + "@types/glob": "^7.1.1" + } + }, + "node_modules/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "optional": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/automation-events": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/automation-events/-/automation-events-7.0.7.tgz", + "integrity": "sha512-eg7aK2P0jrq4QqnZRWXOQJDYs6lxZXK/erfZ/WPTVPP/YQlgt+J0KvIzTo86zYszkru2J/QCW1FFJYgJVd7TgA==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base32-encode": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", + "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "dev": true, + "optional": true, + "dependencies": { + "to-data-view": "^1.1.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, + "optional": true + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "optional": true, + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bun-types": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.22.tgz", + "integrity": "sha512-PBgj4pQd+1WZJ8kWCho7D6i1RMS9/6WkiRikIfqYFzFomfyWZET32Wy83xK2zmF9HiKXd2+bjtVahJ6546oraA==", + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "node_modules/bun-types/node_modules/@types/node": { + "version": "20.12.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", + "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "optional": true + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", + "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", + "dependencies": { + "@radix-ui/react-dialog": "1.0.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", + "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.0", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-slot": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", + "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", + "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-portal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", + "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", + "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-slot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", + "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", + "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/react-remove-scroll": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", + "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cohere-ai": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.11.2.tgz", + "integrity": "sha512-IImDbZLg+kApTH9KswRAEGd0dRuZiChnsqC8gf6RepuklLuSxEkqto4uwSQQSUTj50Ns4uN7yaxzVyS6OmLpIg==", + "dependencies": { + "@aws-sdk/client-sagemaker": "^3.583.0", + "@aws-sdk/credential-providers": "^3.583.0", + "@aws-sdk/protocol-http": "^3.374.0", + "@aws-sdk/signature-v4": "^3.374.0", + "form-data": "^4.0.0", + "form-data-encoder": "^4.0.2", + "formdata-node": "^6.0.3", + "js-base64": "3.7.2", + "node-fetch": "2.7.0", + "qs": "6.11.2", + "readable-stream": "^4.5.2", + "url-join": "4.0.1" + } + }, + "node_modules/cohere-ai/node_modules/form-data-encoder": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", + "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cohere-ai/node_modules/formdata-node": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", + "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/cohere-ai/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true, + "optional": true + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comfydeploy": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/comfydeploy/-/comfydeploy-0.0.21.tgz", + "integrity": "sha512-v5i6igitVWN6jmDlg35g8XyJuGsToD1sbhEZIz4nM3F6gSXZf2YjJzL/wzabsHlOtHhKsO/vdQAXuvO7/w8deQ==", + "dependencies": { + "zod": "^3.22.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-zip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", + "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.10" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-gpu": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", + "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "optional": true + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dnd-core": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", + "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", + "dependencies": { + "@react-dnd/asap": "^5.0.1", + "@react-dnd/invariant": "^4.0.1", + "redux": "^4.2.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "peer": true + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, + "node_modules/ds-store": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", + "integrity": "sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==", + "dev": true, + "optional": true, + "dependencies": { + "bplist-creator": "~0.0.3", + "macos-alias": "~0.2.5", + "tn1150": "^0.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/electron": { + "version": "31.3.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.3.1.tgz", + "integrity": "sha512-9fiuWlRhBfygtcT+auRd/WdBK/f8LZZcrpx0RjpXhH2DPTP/PfnkC4JB1PW55qCbGbh4wAgkYbf4ExIag8oGCA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-installer-common": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", + "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", + "dev": true, + "optional": true, + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "asar": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" + }, + "optionalDependencies": { + "@types/fs-extra": "^9.0.1" + } + }, + "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-common/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", + "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", + "dev": true, + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-debian": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-debian/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/electron-installer-debian/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/electron-installer-debian/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/electron-installer-debian/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "optional": true + }, + "node_modules/electron-installer-debian/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/electron-installer-debian/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "optional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-dmg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-4.0.0.tgz", + "integrity": "sha512-g3W6XnyUa7QGrAF7ViewHdt6bXV2KYU1Pm1CY3pZpp+H6mOjCHHAhf/iZAxtaX1ERCb+SQHz7xSsAHuNH9I8ZQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^4.3.2", + "minimist": "^1.1.1" + }, + "bin": { + "electron-installer-dmg": "bin/electron-installer-dmg.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "optionalDependencies": { + "appdmg": "^0.6.4" + } + }, + "node_modules/electron-installer-redhat": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", + "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", + "dev": true, + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-redhat": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-redhat/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/electron-installer-redhat/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/electron-installer-redhat/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/electron-installer-redhat/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "optional": true + }, + "node_modules/electron-installer-redhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-redhat/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-redhat/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-redhat/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/electron-installer-redhat/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "optional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-redhat/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==" + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/electron/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/electron/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true, + "optional": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", + "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.2.5", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "dev": true, + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", + "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "node_modules/fast-unique-numbers": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.7.tgz", + "integrity": "sha512-K6hYNu8ZsVb7mwmd9OKxHmw4aLa+IFiBxt1e/FZVFFta94ZgNAHqIgUtDzd7AJaVoo/CoNTgr6sj1Dbj3PQPKg==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fetch-event-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/fetch-event-stream/-/fetch-event-stream-0.1.5.tgz", + "integrity": "sha512-V1PWovkspxQfssq/NnxoEyQo1DV+MRK/laPuPblIZmSjMN8P5u46OhlFQznSr9p/t0Sp8Uc6SbM3yCMfr0KU8g==" + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-selector": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", + "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatbuffers": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", + "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/flora-colossus/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", + "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fluent-ffmpeg/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "optional": true, + "dependencies": { + "imul": "^1.0.0" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "11.1.7", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.7.tgz", + "integrity": "sha512-cW11Pu53eDAXUEhv5hEiWuIXWhfkbV32PlgVISn7jRdcAiVrJ1S03YQQ0/DzoswGYYwKi4qYmHHjCzAH52eSdQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-temp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", + "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", + "dev": true, + "optional": true, + "dependencies": { + "random-path": "^0.1.0" + } + }, + "node_modules/fs-xattr": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", + "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/galactus/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "optional": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gaxios/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "optional": true, + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-installed-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", + "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", + "dev": true, + "dependencies": { + "global-modules": "1.0.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-node-dimensions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz", + "integrity": "sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ==" + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/get-package-info/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, + "node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-auth-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-auth-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "deprecated": "Package is no longer maintained", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/groq-sdk": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.5.0.tgz", + "integrity": "sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + } + }, + "node_modules/groq-sdk/node_modules/@types/node": { + "version": "18.19.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", + "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hash-wasm": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.11.0.tgz", + "integrity": "sha512-HVusNXlVqHe0fzIzdQOGolnFN6mX/fqcrSAOcTBXdvzrXVHwTz11vXeKRmkR5gTuwVpvHZEIyKoePDvuAR+XwQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==" + }, + "node_modules/hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexeddb-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/indexeddb-fs/-/indexeddb-fs-2.1.5.tgz", + "integrity": "sha512-4TDdof4ou+l1P3O9D+U09DAc2VQ/bWzgKBxC3nQ9qqMhNR2Y3p8JDgELzkY3bwLP8JULMTf2UHsjnYpiKExH2w==", + "dependencies": { + "jsonschema": "^1.4.1" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", + "dev": true, + "optional": true + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "dev": true, + "optional": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true, + "optional": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" + }, + "node_modules/js-tiktoken": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.12.tgz", + "integrity": "sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsdom": { + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", + "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", + "dev": true, + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/listr2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.396.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.396.0.tgz", + "integrity": "sha512-N/zP+9vEfEYHiMWMpjwH/M5diaV0e4UFe07BpgdzaRYce5QvXi87hixf7F0Xqdr3zuX/9u7H/2D4MVXIK22O0A==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, + "node_modules/macos-alias": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", + "integrity": "sha512-zIUs3+qpml+w3wiRuADutd7XIO8UABqksot10Utl/tji4UxZzLG4fWDC+yJZoO8/Ehg5RqsvSRE/6TS5AEOeWw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.4.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mediainfo.js": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mediainfo.js/-/mediainfo.js-0.3.2.tgz", + "integrity": "sha512-SC8z72ESV1z2lq2zfheoo9zgcoqjeBn0mzq6MhIn3aqlkh3RV84FwOiMtYA0HWY7mi1igM89Jcll4r2sk/yyZA==", + "dependencies": { + "yargs": "^17.7.2" + }, + "bin": { + "mediainfo.js": "dist/esm/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlt-xml": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mlt-xml/-/mlt-xml-2.0.2.tgz", + "integrity": "sha512-UkbC0IaWS1LAIAm99/UukRq1htYTgBsalxUtBAVMUJn7LZl6EqpziU7Sv6dgoeo1UtXsUkWBAc37gwHOdPkoJA==" + }, + "node_modules/monaco-editor": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", + "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/msw": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.5.tgz", + "integrity": "sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==", + "hasInstallScript": true, + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.7.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", + "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/murmur-32": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", + "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", + "dev": true, + "optional": true, + "dependencies": { + "encode-utf8": "^1.0.3", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", + "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", + "dependencies": { + "@next/env": "14.2.5", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", + "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onnxruntime-common": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz", + "integrity": "sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==" + }, + "node_modules/onnxruntime-node": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz", + "integrity": "sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww==", + "hasInstallScript": true, + "optional": true, + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "onnxruntime-common": "1.18.0", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-node/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/onnxruntime-node/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "optional": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/onnxruntime-node/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "optional": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/onnxruntime-node/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/onnxruntime-node/node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "optional": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/onnxruntime-node/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "optional": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/onnxruntime-node/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "optional": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/onnxruntime-node/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "optional": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.18.0.tgz", + "integrity": "sha512-o1UKj4ABIj1gmG7ae0RKJ3/GT+3yoF0RRpfDfeoe0huzRW4FDRLfbkDETmdFAvnJEXuYDE0YT+hhkia0352StQ==", + "dependencies": { + "flatbuffers": "^1.12.0", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.18.0", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/openai": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.55.2.tgz", + "integrity": "sha512-Z81nbAPvlLl5eDLNldkixAayhUzbbCbOef/dqqW3uuN0Fkgj5GZn2kgUDTqGPOp2RHtcOYMfZltXNPoC6kEkTQ==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/pe-library": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", + "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==", + "dev": true, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/playwright": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", + "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", + "devOptional": true, + "dependencies": { + "playwright-core": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", + "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", + "devOptional": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-css-variables": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz", + "integrity": "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==", + "dependencies": { + "balanced-match": "^1.0.0", + "escape-string-regexp": "^1.0.3", + "extend": "^3.0.1" + }, + "peerDependencies": { + "postcss": "^8.2.6" + } + }, + "node_modules/postcss-css-variables/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.5.tgz", + "integrity": "sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-uuid": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/pure-uuid/-/pure-uuid-1.8.1.tgz", + "integrity": "sha512-PIwHXU7NZb/wTBwUfzCSjI85tfwx6DQOm74sRLtNLH8KHsFZEvAQbBQdz7E5ij8SNSv9WGdQPWiiM6NpNIeNfA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", + "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/random-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", + "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", + "dev": true, + "optional": true, + "dependencies": { + "base32-encode": "^0.1.0 || ^1.0.0", + "murmur-32": "^0.1.0 || ^0.2.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-device-frameset": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/react-device-frameset/-/react-device-frameset-1.3.4.tgz", + "integrity": "sha512-M9VUa2up9TFOgsELHBFRkZf8ER0AyOYF5+5qbtYseQCZfg6XUxuNDX5VsJNfMGu6Zz6x9Dgh4rfFDFONK9H7dg==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dnd": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", + "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", + "dependencies": { + "@react-dnd/invariant": "^4.0.1", + "@react-dnd/shallowequal": "^4.0.1", + "dnd-core": "^16.0.1", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" + }, + "peerDependencies": { + "@types/hoist-non-react-statics": ">= 3.3.1", + "@types/node": ">= 12", + "@types/react": ">= 16", + "react": ">= 16.14" + }, + "peerDependenciesMeta": { + "@types/hoist-non-react-statics": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-dnd-html5-backend": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", + "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", + "dependencies": { + "dnd-core": "^16.0.1" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-drag-drop-files": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/react-drag-drop-files/-/react-drag-drop-files-2.3.10.tgz", + "integrity": "sha512-Fv614W9+OtXFB5O+gjompTxQZLYGO7wJeT4paETGiXtiADB9yPOMGYD4A3PMCTY9Be874/wcpl+2dm3MvCIRzg==", + "dependencies": { + "prop-types": "^15.7.2", + "styled-components": "^5.3.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/react-error-boundary": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", + "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-hook-consent": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/react-hook-consent/-/react-hook-consent-3.5.3.tgz", + "integrity": "sha512-/HUD/zw2fJbERVHIMYwbfI5WStizTjgVX7qFS8QLaFTdGOSJ7RLa7zMYrnieqW7KqtL5qriUhxySaATfanAvfA==", + "dependencies": { + "object-hash": "^3.0.0", + "react-toggle": "^4.1.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-hotkeys-hook": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.5.0.tgz", + "integrity": "sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==", + "peerDependencies": { + "react": ">=16.8.1", + "react-dom": ">=16.8.1" + } + }, + "node_modules/react-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-measure": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/react-measure/-/react-measure-2.5.2.tgz", + "integrity": "sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA==", + "dependencies": { + "@babel/runtime": "^7.2.0", + "get-node-dimensions": "^1.2.1", + "prop-types": "^15.6.2", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": ">0.13.0", + "react-dom": ">0.13.0" + } + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-reflex": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/react-reflex/-/react-reflex-4.2.6.tgz", + "integrity": "sha512-MLGty/ii/BTipKZ47dfs8Ue5g1xqgCxUCDM34ruEr0UVJuXGDzcSX9wPMzRcv4dUR+1tw4hm4c3a6V6hLO2XcA==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "lodash.throttle": "^4.1.1", + "prop-types": "^15.5.8", + "react-measure": "^2.0.2" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-speakup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-speakup/-/react-speakup-1.0.0.tgz", + "integrity": "sha512-uZlLfBrWcdlw9fC6N5NY14GA8olnXh7DNaWNQya1osBPIE2nd/URv3nc6+yXeIlu55bwdGYSPoyAXEo5znN1hg==", + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-toggle": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.3.tgz", + "integrity": "sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==", + "dependencies": { + "classnames": "^2.2.5" + }, + "peerDependencies": { + "prop-types": ">= 15.3.0 < 19", + "react": ">= 15.3.0 < 19", + "react-dom": ">= 15.3.0 < 19" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, + "node_modules/react-virtualized-auto-sizer": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", + "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replicate": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/replicate/-/replicate-0.32.0.tgz", + "integrity": "sha512-XOJBnV/FpRsz/r7DEj8KL4pdDk9BpptkljGOhKmjlZGdNcBvt532GxxmjT4ZaqdExg7STxrh1JHhI91zg+CZTw==", + "engines": { + "git": ">=2.11.0", + "node": ">=18.0.0", + "npm": ">=7.19.0", + "yarn": ">=1.7.0" + }, + "optionalDependencies": { + "readable-stream": ">=4.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resedit": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.2.tgz", + "integrity": "sha512-UKTnq602iVe+W5SyRAQx/WdWMnlDiONfXBLFg/ur4QE4EQQ8eP7Jgm5mNXdK12kKawk1vvXPja2iXKqZiGDW6Q==", + "dev": true, + "dependencies": { + "pe-library": "^1.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", + "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", + "dev": true, + "dependencies": { + "get-installed-path": "^2.0.3" + }, + "engines": { + "node": ">=4", + "npm": ">=2" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/robot3": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/robot3/-/robot3-0.4.1.tgz", + "integrity": "sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==" + }, + "node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/sharp": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", + "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-s390x": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-wasm32": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonner": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", + "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "dev": true + }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/standardized-audio-context": { + "version": "25.3.75", + "resolved": "https://registry.npmjs.org/standardized-audio-context/-/standardized-audio-context-25.3.75.tgz", + "integrity": "sha512-N7/Si1d0kuo1umRnWOsQESqxJlkMxBZfdfNRo5HeE7pA0lmo6PNrMkOSiM0NutFxpwA+KcPexo5JkTWWAAUaNQ==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "automation-events": "^7.0.7", + "tslib": "^2.6.3" + } + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, + "node_modules/stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/styled-components": { + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tailwind-merge": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", + "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-scrollbar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", + "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", + "dev": true, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "3.x" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz", + "integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "optional": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/textlinestream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/textlinestream/-/textlinestream-1.1.1.tgz", + "integrity": "sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.164.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.164.1.tgz", + "integrity": "sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==" + }, + "node_modules/three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", + "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "node_modules/tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", + "dev": true, + "optional": true + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tn1150": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", + "integrity": "sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==", + "dev": true, + "optional": true, + "dependencies": { + "unorm": "^1.4.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "optional": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/tw-to-css": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.12.tgz", + "integrity": "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw==", + "dependencies": { + "postcss": "8.4.31", + "postcss-css-variables": "0.18.0", + "tailwindcss": "3.3.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tw-to-css/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/tw-to-css/node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-file-picker": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/use-file-picker/-/use-file-picker-2.1.2.tgz", + "integrity": "sha512-ZEIzRi1wXeIXDWr5i55gRBVER8rTkSGskDUY94bciTTAZJHlBnOTRLL/LDYjgz6d+US3yELHnRvtBhLxFGtB0A==", + "dependencies": { + "file-selector": "0.2.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/usehooks-ts": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.16.0.tgz", + "integrity": "sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w==", + "dependencies": { + "lodash.debounce": "^4.0.8" + }, + "engines": { + "node": ">=16.15.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "mem": "^4.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uuid-random": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/uuid-random/-/uuid-random-1.3.2.tgz", + "integrity": "sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", + "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitest": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", + "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.5", + "@vitest/pretty-format": "^2.0.5", + "@vitest/runner": "2.0.5", + "@vitest/snapshot": "2.0.5", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.5", + "@vitest/ui": "2.0.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-audio-beat-detector": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/web-audio-beat-detector/-/web-audio-beat-detector-8.2.12.tgz", + "integrity": "sha512-wno9QdH3UPtQNu8VSi82z6Q6QiSURI0nRjtlLkfVZ+qvM8ITVq9c+VZFJpbEKR8FsehkVN8i44vqu39zh+m7/g==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3", + "web-audio-beat-detector-broker": "^4.1.11", + "web-audio-beat-detector-worker": "^5.2.54" + } + }, + "node_modules/web-audio-beat-detector-broker": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/web-audio-beat-detector-broker/-/web-audio-beat-detector-broker-4.1.11.tgz", + "integrity": "sha512-meOMbFMmLnAogLW7GiPo0teQho9RitsaB47NPIUy2WMfth4PCps2hgIQoW2DXtNwU0R4p0YEEpZnioXFoRlHqg==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "fast-unique-numbers": "^9.0.7", + "standardized-audio-context": "^25.3.75", + "tslib": "^2.6.3", + "web-audio-beat-detector-worker": "^5.2.54" + } + }, + "node_modules/web-audio-beat-detector-worker": { + "version": "5.2.54", + "resolved": "https://registry.npmjs.org/web-audio-beat-detector-worker/-/web-audio-beat-detector-worker-5.2.54.tgz", + "integrity": "sha512-rFAKJhxUgEpRxJYaWjIDMhQ7tZ6E41LwTQ4GZ3mh95BjBOGpTLMiy+26vBTd2Xkc7E0VWyzhmPNb5/5aBxO6ZQ==", + "dependencies": { + "@babel/runtime": "^7.24.8", + "tslib": "^2.6.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yarn-or-npm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", + "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "bin": { + "yarn-or-npm": "bin/index.js", + "yon": "bin/index.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/yarn-or-npm/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/yarn-or-npm/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yarn-or-npm/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.1.0.tgz", + "integrity": "sha512-auzJ8lEovThZIpR8wLGWNo/JEj4VTO79q9/gOJ0dWb3shAYPFdX3t9VN0fC0v+jeQF77STUdCzebLwRMqzn5gQ==" + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", + "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", + "peerDependencies": { + "zod": "^3.23.3" + } + }, + "node_modules/zustand": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", + "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/zx": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/zx/-/zx-8.1.4.tgz", + "integrity": "sha512-QFDYYpnzdpRiJ3dL2102Cw26FpXpWshW4QLTGxiYfIcwdAqg084jRCkK/kuP/NOSkxOjydRwNFG81qzA5r1a6w==", + "bin": { + "zx": "build/cli.js" + }, + "engines": { + "node": ">= 12.17.0" + }, + "optionalDependencies": { + "@types/fs-extra": ">=11", + "@types/node": ">=20" + } + }, + "node_modules/zx/node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "optional": true, + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + } + } +} diff --git a/packages/app/package.json b/packages/app/package.json new file mode 100644 index 00000000..0fe7c484 --- /dev/null +++ b/packages/app/package.json @@ -0,0 +1,195 @@ +{ + "name": "@clapper/app", + "version": "0.0.8", + "private": true, + "description": "🎬 Clapper", + "license": "GPL-3.0-only", + "main": "main.js", + "files": [ + "./main.js" + ], + "directories": { + "src:": "./src", + "public:": "./public" + }, + "scripts": { + "dev": "npm run checks && next dev", + "build": "npm run prepare && npm run checks && rm -Rf out && next build && npm run build:copyassets", + "build:ci": "rm -Rf out && npm run prepare && next build && npm run build:copyassets", + "build:copyassets": "cp -R public .next/standalone/public && cp -R .next/static .next/standalone/.next/static", + "prepare": "cp -R node_modules/mediainfo.js/dist/MediaInfoModule.wasm public/wasm/", + "start": "next start", + "start:prod": "node .next/standalone/server.js", + "checks": "npm run format:fix && npm run lint", + "format": "prettier --check --ignore-path .gitignore ./src/", + "format:fix": "prettier --write --ignore-path .gitignore ./src/", + "lint": "next lint", + "lint:fix": "next lint --fix", + "test": "npm run build && npm run test:unit:ci", + "test_TEMPORARY_DISABLED": "npm run build && npm run test:unit:ci && npm run test:e2e", + "test:unit:ci": "vitest run", + "test:unit:watch": "vitest", + "test:e2e": "npx playwright test", + "electron": "npm run build && electron .", + "electron:start": "npm run build && electron-forge start", + "electron:package": "npm run build && electron-forge package", + "electron:make": "npm run build && electron-forge make" + }, + "dependencies": { + "@aitube/broadway": "0.2.3", + "@aitube/clap": "0.2.3", + "@aitube/clapper-services": "0.2.3-2", + "@aitube/client": "0.2.3", + "@aitube/engine": "0.2.3", + "@aitube/timeline": "0.2.3", + "@fal-ai/serverless-client": "^0.13.0", + "@ffmpeg/ffmpeg": "^0.12.10", + "@ffmpeg/util": "^0.12.1", + "@gradio/client": "^1.5.0", + "@huggingface/hub": "^0.15.1", + "@huggingface/inference": "^2.8.0", + "@langchain/anthropic": "^0.2.14", + "@langchain/cohere": "^0.2.2", + "@langchain/core": "^0.2.23", + "@langchain/google-vertexai": "^0.0.25", + "@langchain/groq": "^0.0.16", + "@langchain/mistralai": "^0.0.28", + "@langchain/openai": "^0.2.6", + "@monaco-editor/react": "^4.6.0", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-collapsible": "^1.0.3", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-menubar": "^1.0.4", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-progress": "^1.0.3", + "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slider": "^1.1.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-tooltip": "^1.0.7", + "@react-spring/three": "^9.7.3", + "@react-spring/types": "^9.7.3", + "@react-three/drei": "^9.106.0", + "@react-three/fiber": "^8.16.6", + "@react-three/uikit": "^0.3.4", + "@react-three/uikit-lucide": "^0.3.4", + "@saintno/comfyui-sdk": "^0.1.11", + "@tailwindcss/container-queries": "^0.1.1", + "@types/dom-speech-recognition": "^0.0.4", + "@types/pngjs": "^6.0.5", + "@xenova/transformers": "github:xenova/transformers.js#v3", + "@xyflow/react": "^12.0.3", + "autoprefixer": "10.4.19", + "base64-arraybuffer": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "^0.2.1", + "comfydeploy": "^0.0.21", + "date-fns": "^3.6.0", + "dotenv": "^16.4.5", + "fflate": "^0.8.2", + "fluent-ffmpeg": "^2.1.3", + "framer-motion": "11.1.7", + "fs-extra": "^11.2.0", + "is-hotkey": "^0.2.0", + "lucide-react": "^0.396.0", + "mediainfo.js": "^0.3.2", + "mlt-xml": "^2.0.2", + "monaco-editor": "^0.50.0", + "next": "^14.2.5", + "next-themes": "^0.3.0", + "pngjs": "^7.0.0", + "qs": "^6.12.1", + "query-string": "^9.0.0", + "react": "^18.3.1", + "react-device-frameset": "^1.3.4", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.3.1", + "react-drag-drop-files": "^2.3.10", + "react-error-boundary": "^4.0.13", + "react-hook-consent": "^3.5.3", + "react-hotkeys-hook": "^4.5.0", + "react-icons": "^5.2.1", + "react-markdown": "^9.0.1", + "react-reflex": "^4.2.6", + "react-speakup": "^1.0.0", + "remark-gfm": "^4.0.0", + "replicate": "^0.32.0", + "sharp": "0.33.4", + "sonner": "^1.5.0", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "three": "^0.164.1", + "ts-node": "^10.9.2", + "use-file-picker": "^2.1.2", + "usehooks-ts": "^2.14.0", + "uuid": "^9.0.1", + "web-audio-beat-detector": "^8.2.12", + "yaml": "^2.4.5", + "zustand": "4.5.2", + "zx": "^8.1.4" + }, + "devDependencies": { + "@electron-forge/cli": "^7.4.0", + "@electron-forge/maker-deb": "^7.4.0", + "@electron-forge/maker-dmg": "^7.4.0", + "@electron-forge/maker-rpm": "^7.4.0", + "@electron-forge/maker-squirrel": "^7.4.0", + "@electron-forge/maker-zip": "^7.4.0", + "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", + "@electron-forge/publisher-github": "^7.4.0", + "@playwright/test": "^1.45.1", + "@testing-library/react": "^16.0.0", + "@types/fluent-ffmpeg": "^2.1.24", + "@types/is-hotkey": "^0.1.10", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "@types/uuid": "^9.0.8", + "@vitejs/plugin-react": "^4.3.1", + "@webgpu/types": "^0.1.44", + "electron": "^31.2.1", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "eslint-config-prettier": "^9.1.0", + "jsdom": "^24.1.0", + "node-gyp": "^10.2.0", + "postcss": "^8", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwind-scrollbar": "^3.1.0", + "tailwindcss": "^3.4.3", + "typescript": "^5.5.0", + "vitest": "^2.0.2" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-libvips-win32-ia32": "1.0.2", + "@img/sharp-libvips-win32-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } +} diff --git a/playwright.config.ts b/packages/app/playwright.config.ts similarity index 100% rename from playwright.config.ts rename to packages/app/playwright.config.ts diff --git a/postcss.config.js b/packages/app/postcss.config.js similarity index 100% rename from postcss.config.js rename to packages/app/postcss.config.js diff --git a/public/.gitattributes b/packages/app/public/.gitattributes similarity index 100% rename from public/.gitattributes rename to packages/app/public/.gitattributes diff --git a/public/carriers/README.md b/packages/app/public/carriers/README.md similarity index 100% rename from public/carriers/README.md rename to packages/app/public/carriers/README.md diff --git a/public/datasets/baby-names-us-year-of-birth-full.csv b/packages/app/public/datasets/baby-names-us-year-of-birth-full.csv similarity index 100% rename from public/datasets/baby-names-us-year-of-birth-full.csv rename to packages/app/public/datasets/baby-names-us-year-of-birth-full.csv diff --git a/public/images/icons/interface/character.svg b/packages/app/public/images/icons/interface/character.svg similarity index 100% rename from public/images/icons/interface/character.svg rename to packages/app/public/images/icons/interface/character.svg diff --git a/public/images/icons/interface/characters.svg b/packages/app/public/images/icons/interface/characters.svg similarity index 100% rename from public/images/icons/interface/characters.svg rename to packages/app/public/images/icons/interface/characters.svg diff --git a/public/images/icons/interface/cloud.svg b/packages/app/public/images/icons/interface/cloud.svg similarity index 100% rename from public/images/icons/interface/cloud.svg rename to packages/app/public/images/icons/interface/cloud.svg diff --git a/public/images/icons/interface/community.svg b/packages/app/public/images/icons/interface/community.svg similarity index 100% rename from public/images/icons/interface/community.svg rename to packages/app/public/images/icons/interface/community.svg diff --git a/public/images/icons/interface/computer.svg b/packages/app/public/images/icons/interface/computer.svg similarity index 100% rename from public/images/icons/interface/computer.svg rename to packages/app/public/images/icons/interface/computer.svg diff --git a/public/images/icons/interface/cut.svg b/packages/app/public/images/icons/interface/cut.svg similarity index 100% rename from public/images/icons/interface/cut.svg rename to packages/app/public/images/icons/interface/cut.svg diff --git a/public/images/icons/interface/downloads.svg b/packages/app/public/images/icons/interface/downloads.svg similarity index 100% rename from public/images/icons/interface/downloads.svg rename to packages/app/public/images/icons/interface/downloads.svg diff --git a/public/images/icons/interface/film.svg b/packages/app/public/images/icons/interface/film.svg similarity index 100% rename from public/images/icons/interface/film.svg rename to packages/app/public/images/icons/interface/film.svg diff --git a/public/images/icons/interface/hidden.svg b/packages/app/public/images/icons/interface/hidden.svg similarity index 100% rename from public/images/icons/interface/hidden.svg rename to packages/app/public/images/icons/interface/hidden.svg diff --git a/public/images/icons/interface/image-to-image.svg b/packages/app/public/images/icons/interface/image-to-image.svg similarity index 100% rename from public/images/icons/interface/image-to-image.svg rename to packages/app/public/images/icons/interface/image-to-image.svg diff --git a/public/images/icons/interface/image.svg b/packages/app/public/images/icons/interface/image.svg similarity index 100% rename from public/images/icons/interface/image.svg rename to packages/app/public/images/icons/interface/image.svg diff --git a/public/images/icons/interface/imagefile.svg b/packages/app/public/images/icons/interface/imagefile.svg similarity index 100% rename from public/images/icons/interface/imagefile.svg rename to packages/app/public/images/icons/interface/imagefile.svg diff --git a/public/images/icons/interface/interpolate.svg b/packages/app/public/images/icons/interface/interpolate.svg similarity index 100% rename from public/images/icons/interface/interpolate.svg rename to packages/app/public/images/icons/interface/interpolate.svg diff --git a/public/images/icons/interface/location.svg b/packages/app/public/images/icons/interface/location.svg similarity index 100% rename from public/images/icons/interface/location.svg rename to packages/app/public/images/icons/interface/location.svg diff --git a/public/images/icons/interface/lora.svg b/packages/app/public/images/icons/interface/lora.svg similarity index 100% rename from public/images/icons/interface/lora.svg rename to packages/app/public/images/icons/interface/lora.svg diff --git a/public/images/icons/interface/misc.svg b/packages/app/public/images/icons/interface/misc.svg similarity index 100% rename from public/images/icons/interface/misc.svg rename to packages/app/public/images/icons/interface/misc.svg diff --git a/public/images/icons/interface/mute.svg b/packages/app/public/images/icons/interface/mute.svg similarity index 100% rename from public/images/icons/interface/mute.svg rename to packages/app/public/images/icons/interface/mute.svg diff --git a/public/images/icons/interface/project.svg b/packages/app/public/images/icons/interface/project.svg similarity index 100% rename from public/images/icons/interface/project.svg rename to packages/app/public/images/icons/interface/project.svg diff --git a/public/images/icons/interface/prompt.svg b/packages/app/public/images/icons/interface/prompt.svg similarity index 100% rename from public/images/icons/interface/prompt.svg rename to packages/app/public/images/icons/interface/prompt.svg diff --git a/public/images/icons/interface/screenplay.svg b/packages/app/public/images/icons/interface/screenplay.svg similarity index 100% rename from public/images/icons/interface/screenplay.svg rename to packages/app/public/images/icons/interface/screenplay.svg diff --git a/public/images/icons/interface/sound.svg b/packages/app/public/images/icons/interface/sound.svg similarity index 100% rename from public/images/icons/interface/sound.svg rename to packages/app/public/images/icons/interface/sound.svg diff --git a/public/images/icons/interface/soundfile.svg b/packages/app/public/images/icons/interface/soundfile.svg similarity index 100% rename from public/images/icons/interface/soundfile.svg rename to packages/app/public/images/icons/interface/soundfile.svg diff --git a/public/images/icons/interface/speech.svg b/packages/app/public/images/icons/interface/speech.svg similarity index 100% rename from public/images/icons/interface/speech.svg rename to packages/app/public/images/icons/interface/speech.svg diff --git a/public/images/icons/interface/team.svg b/packages/app/public/images/icons/interface/team.svg similarity index 100% rename from public/images/icons/interface/team.svg rename to packages/app/public/images/icons/interface/team.svg diff --git a/public/images/icons/interface/text-to-music.svg b/packages/app/public/images/icons/interface/text-to-music.svg similarity index 100% rename from public/images/icons/interface/text-to-music.svg rename to packages/app/public/images/icons/interface/text-to-music.svg diff --git a/public/images/icons/interface/text-to-video.svg b/packages/app/public/images/icons/interface/text-to-video.svg similarity index 100% rename from public/images/icons/interface/text-to-video.svg rename to packages/app/public/images/icons/interface/text-to-video.svg diff --git a/public/images/icons/interface/textfile.svg b/packages/app/public/images/icons/interface/textfile.svg similarity index 100% rename from public/images/icons/interface/textfile.svg rename to packages/app/public/images/icons/interface/textfile.svg diff --git a/public/images/icons/interface/transfer.svg b/packages/app/public/images/icons/interface/transfer.svg similarity index 100% rename from public/images/icons/interface/transfer.svg rename to packages/app/public/images/icons/interface/transfer.svg diff --git a/public/images/icons/interface/transition.svg b/packages/app/public/images/icons/interface/transition.svg similarity index 100% rename from public/images/icons/interface/transition.svg rename to packages/app/public/images/icons/interface/transition.svg diff --git a/public/images/icons/interface/unpute.svg b/packages/app/public/images/icons/interface/unpute.svg similarity index 100% rename from public/images/icons/interface/unpute.svg rename to packages/app/public/images/icons/interface/unpute.svg diff --git a/public/images/icons/interface/upscale.svg b/packages/app/public/images/icons/interface/upscale.svg similarity index 100% rename from public/images/icons/interface/upscale.svg rename to packages/app/public/images/icons/interface/upscale.svg diff --git a/public/images/icons/interface/vendor.svg b/packages/app/public/images/icons/interface/vendor.svg similarity index 100% rename from public/images/icons/interface/vendor.svg rename to packages/app/public/images/icons/interface/vendor.svg diff --git a/public/images/icons/interface/video-folder.svg b/packages/app/public/images/icons/interface/video-folder.svg similarity index 100% rename from public/images/icons/interface/video-folder.svg rename to packages/app/public/images/icons/interface/video-folder.svg diff --git a/public/images/icons/interface/video-to-video.svg b/packages/app/public/images/icons/interface/video-to-video.svg similarity index 100% rename from public/images/icons/interface/video-to-video.svg rename to packages/app/public/images/icons/interface/video-to-video.svg diff --git a/public/images/icons/interface/videofile.svg b/packages/app/public/images/icons/interface/videofile.svg similarity index 100% rename from public/images/icons/interface/videofile.svg rename to packages/app/public/images/icons/interface/videofile.svg diff --git a/public/images/icons/interface/visible.svg b/packages/app/public/images/icons/interface/visible.svg similarity index 100% rename from public/images/icons/interface/visible.svg rename to packages/app/public/images/icons/interface/visible.svg diff --git a/public/images/icons/segments/action.svg b/packages/app/public/images/icons/segments/action.svg similarity index 100% rename from public/images/icons/segments/action.svg rename to packages/app/public/images/icons/segments/action.svg diff --git a/public/images/icons/segments/camera.svg b/packages/app/public/images/icons/segments/camera.svg similarity index 100% rename from public/images/icons/segments/camera.svg rename to packages/app/public/images/icons/segments/camera.svg diff --git a/public/images/icons/segments/character.svg b/packages/app/public/images/icons/segments/character.svg similarity index 100% rename from public/images/icons/segments/character.svg rename to packages/app/public/images/icons/segments/character.svg diff --git a/public/images/icons/segments/depth.svg b/packages/app/public/images/icons/segments/depth.svg similarity index 100% rename from public/images/icons/segments/depth.svg rename to packages/app/public/images/icons/segments/depth.svg diff --git a/public/images/icons/segments/dialogue.svg b/packages/app/public/images/icons/segments/dialogue.svg similarity index 100% rename from public/images/icons/segments/dialogue.svg rename to packages/app/public/images/icons/segments/dialogue.svg diff --git a/public/images/icons/segments/effect.svg b/packages/app/public/images/icons/segments/effect.svg similarity index 100% rename from public/images/icons/segments/effect.svg rename to packages/app/public/images/icons/segments/effect.svg diff --git a/public/images/icons/segments/era.svg b/packages/app/public/images/icons/segments/era.svg similarity index 100% rename from public/images/icons/segments/era.svg rename to packages/app/public/images/icons/segments/era.svg diff --git a/public/images/icons/segments/event.svg b/packages/app/public/images/icons/segments/event.svg similarity index 100% rename from public/images/icons/segments/event.svg rename to packages/app/public/images/icons/segments/event.svg diff --git a/public/images/icons/segments/generic.svg b/packages/app/public/images/icons/segments/generic.svg similarity index 100% rename from public/images/icons/segments/generic.svg rename to packages/app/public/images/icons/segments/generic.svg diff --git a/public/images/icons/segments/interface.svg b/packages/app/public/images/icons/segments/interface.svg similarity index 100% rename from public/images/icons/segments/interface.svg rename to packages/app/public/images/icons/segments/interface.svg diff --git a/public/images/icons/segments/lighting.svg b/packages/app/public/images/icons/segments/lighting.svg similarity index 100% rename from public/images/icons/segments/lighting.svg rename to packages/app/public/images/icons/segments/lighting.svg diff --git a/public/images/icons/segments/location.svg b/packages/app/public/images/icons/segments/location.svg similarity index 100% rename from public/images/icons/segments/location.svg rename to packages/app/public/images/icons/segments/location.svg diff --git a/public/images/icons/segments/mesh.svg b/packages/app/public/images/icons/segments/mesh.svg similarity index 100% rename from public/images/icons/segments/mesh.svg rename to packages/app/public/images/icons/segments/mesh.svg diff --git a/public/images/icons/segments/music.svg b/packages/app/public/images/icons/segments/music.svg similarity index 100% rename from public/images/icons/segments/music.svg rename to packages/app/public/images/icons/segments/music.svg diff --git a/public/images/icons/segments/phenomenon.svg b/packages/app/public/images/icons/segments/phenomenon.svg similarity index 100% rename from public/images/icons/segments/phenomenon.svg rename to packages/app/public/images/icons/segments/phenomenon.svg diff --git a/public/images/icons/segments/sound.svg b/packages/app/public/images/icons/segments/sound.svg similarity index 100% rename from public/images/icons/segments/sound.svg rename to packages/app/public/images/icons/segments/sound.svg diff --git a/public/images/icons/segments/splat.svg b/packages/app/public/images/icons/segments/splat.svg similarity index 100% rename from public/images/icons/segments/splat.svg rename to packages/app/public/images/icons/segments/splat.svg diff --git a/public/images/icons/segments/storyboard.svg b/packages/app/public/images/icons/segments/storyboard.svg similarity index 100% rename from public/images/icons/segments/storyboard.svg rename to packages/app/public/images/icons/segments/storyboard.svg diff --git a/public/images/icons/segments/style.svg b/packages/app/public/images/icons/segments/style.svg similarity index 100% rename from public/images/icons/segments/style.svg rename to packages/app/public/images/icons/segments/style.svg diff --git a/public/images/icons/segments/time.svg b/packages/app/public/images/icons/segments/time.svg similarity index 100% rename from public/images/icons/segments/time.svg rename to packages/app/public/images/icons/segments/time.svg diff --git a/public/images/icons/segments/transition.svg b/packages/app/public/images/icons/segments/transition.svg similarity index 100% rename from public/images/icons/segments/transition.svg rename to packages/app/public/images/icons/segments/transition.svg diff --git a/public/images/icons/segments/video.svg b/packages/app/public/images/icons/segments/video.svg similarity index 100% rename from public/images/icons/segments/video.svg rename to packages/app/public/images/icons/segments/video.svg diff --git a/public/images/icons/segments/weather.svg b/packages/app/public/images/icons/segments/weather.svg similarity index 100% rename from public/images/icons/segments/weather.svg rename to packages/app/public/images/icons/segments/weather.svg diff --git a/public/images/logos/CL.icns b/packages/app/public/images/logos/CL.icns similarity index 100% rename from public/images/logos/CL.icns rename to packages/app/public/images/logos/CL.icns diff --git a/public/images/logos/CL.iconset/icon_128x128.png b/packages/app/public/images/logos/CL.iconset/icon_128x128.png similarity index 100% rename from public/images/logos/CL.iconset/icon_128x128.png rename to packages/app/public/images/logos/CL.iconset/icon_128x128.png diff --git a/public/images/logos/CL.iconset/icon_128x128@2x.png b/packages/app/public/images/logos/CL.iconset/icon_128x128@2x.png similarity index 100% rename from public/images/logos/CL.iconset/icon_128x128@2x.png rename to packages/app/public/images/logos/CL.iconset/icon_128x128@2x.png diff --git a/public/images/logos/CL.iconset/icon_16x16.png b/packages/app/public/images/logos/CL.iconset/icon_16x16.png similarity index 100% rename from public/images/logos/CL.iconset/icon_16x16.png rename to packages/app/public/images/logos/CL.iconset/icon_16x16.png diff --git a/public/images/logos/CL.iconset/icon_16x16@2x.png b/packages/app/public/images/logos/CL.iconset/icon_16x16@2x.png similarity index 100% rename from public/images/logos/CL.iconset/icon_16x16@2x.png rename to packages/app/public/images/logos/CL.iconset/icon_16x16@2x.png diff --git a/public/images/logos/CL.iconset/icon_256x256.png b/packages/app/public/images/logos/CL.iconset/icon_256x256.png similarity index 100% rename from public/images/logos/CL.iconset/icon_256x256.png rename to packages/app/public/images/logos/CL.iconset/icon_256x256.png diff --git a/public/images/logos/CL.iconset/icon_256x256@2x.png b/packages/app/public/images/logos/CL.iconset/icon_256x256@2x.png similarity index 100% rename from public/images/logos/CL.iconset/icon_256x256@2x.png rename to packages/app/public/images/logos/CL.iconset/icon_256x256@2x.png diff --git a/public/images/logos/CL.iconset/icon_32x32.png b/packages/app/public/images/logos/CL.iconset/icon_32x32.png similarity index 100% rename from public/images/logos/CL.iconset/icon_32x32.png rename to packages/app/public/images/logos/CL.iconset/icon_32x32.png diff --git a/public/images/logos/CL.iconset/icon_32x32@2x.png b/packages/app/public/images/logos/CL.iconset/icon_32x32@2x.png similarity index 100% rename from public/images/logos/CL.iconset/icon_32x32@2x.png rename to packages/app/public/images/logos/CL.iconset/icon_32x32@2x.png diff --git a/public/images/logos/CL.iconset/icon_512x512.png b/packages/app/public/images/logos/CL.iconset/icon_512x512.png similarity index 100% rename from public/images/logos/CL.iconset/icon_512x512.png rename to packages/app/public/images/logos/CL.iconset/icon_512x512.png diff --git a/public/images/logos/CL.iconset/icon_512x512@2x.png b/packages/app/public/images/logos/CL.iconset/icon_512x512@2x.png similarity index 100% rename from public/images/logos/CL.iconset/icon_512x512@2x.png rename to packages/app/public/images/logos/CL.iconset/icon_512x512@2x.png diff --git a/public/images/logos/CL.png b/packages/app/public/images/logos/CL.png similarity index 100% rename from public/images/logos/CL.png rename to packages/app/public/images/logos/CL.png diff --git a/public/images/logos/clapper.png b/packages/app/public/images/logos/clapper.png similarity index 100% rename from public/images/logos/clapper.png rename to packages/app/public/images/logos/clapper.png diff --git a/public/images/logos/logo-desaturated.png b/packages/app/public/images/logos/logo-desaturated.png similarity index 100% rename from public/images/logos/logo-desaturated.png rename to packages/app/public/images/logos/logo-desaturated.png diff --git a/public/images/logos/logo-discord-2.png b/packages/app/public/images/logos/logo-discord-2.png similarity index 100% rename from public/images/logos/logo-discord-2.png rename to packages/app/public/images/logos/logo-discord-2.png diff --git a/public/images/logos/logo-discord-3.png b/packages/app/public/images/logos/logo-discord-3.png similarity index 100% rename from public/images/logos/logo-discord-3.png rename to packages/app/public/images/logos/logo-discord-3.png diff --git a/public/images/logos/logo-no-bg.png b/packages/app/public/images/logos/logo-no-bg.png similarity index 100% rename from public/images/logos/logo-no-bg.png rename to packages/app/public/images/logos/logo-no-bg.png diff --git a/public/images/logos/logo-v2.png b/packages/app/public/images/logos/logo-v2.png similarity index 100% rename from public/images/logos/logo-v2.png rename to packages/app/public/images/logos/logo-v2.png diff --git a/public/images/logos/logo-v2.xcf b/packages/app/public/images/logos/logo-v2.xcf similarity index 100% rename from public/images/logos/logo-v2.xcf rename to packages/app/public/images/logos/logo-v2.xcf diff --git a/public/images/onboarding/get-started.png b/packages/app/public/images/onboarding/get-started.png similarity index 100% rename from public/images/onboarding/get-started.png rename to packages/app/public/images/onboarding/get-started.png diff --git a/public/images/onboarding/get-started.xcf b/packages/app/public/images/onboarding/get-started.xcf similarity index 100% rename from public/images/onboarding/get-started.xcf rename to packages/app/public/images/onboarding/get-started.xcf diff --git a/public/images/onboarding/pick-an-example.png b/packages/app/public/images/onboarding/pick-an-example.png similarity index 100% rename from public/images/onboarding/pick-an-example.png rename to packages/app/public/images/onboarding/pick-an-example.png diff --git a/public/images/onboarding/pick-an-example.xcf b/packages/app/public/images/onboarding/pick-an-example.xcf similarity index 100% rename from public/images/onboarding/pick-an-example.xcf rename to packages/app/public/images/onboarding/pick-an-example.xcf diff --git a/public/images/providers/anthropic.png b/packages/app/public/images/providers/anthropic.png similarity index 100% rename from public/images/providers/anthropic.png rename to packages/app/public/images/providers/anthropic.png diff --git a/public/images/providers/cohere.png b/packages/app/public/images/providers/cohere.png similarity index 100% rename from public/images/providers/cohere.png rename to packages/app/public/images/providers/cohere.png diff --git a/public/images/providers/comfyicu.png b/packages/app/public/images/providers/comfyicu.png similarity index 100% rename from public/images/providers/comfyicu.png rename to packages/app/public/images/providers/comfyicu.png diff --git a/public/images/providers/comfyui.png b/packages/app/public/images/providers/comfyui.png similarity index 100% rename from public/images/providers/comfyui.png rename to packages/app/public/images/providers/comfyui.png diff --git a/public/images/providers/elevenlabs.png b/packages/app/public/images/providers/elevenlabs.png similarity index 100% rename from public/images/providers/elevenlabs.png rename to packages/app/public/images/providers/elevenlabs.png diff --git a/public/images/providers/everartai.png b/packages/app/public/images/providers/everartai.png similarity index 100% rename from public/images/providers/everartai.png rename to packages/app/public/images/providers/everartai.png diff --git a/public/images/providers/falai.png b/packages/app/public/images/providers/falai.png similarity index 100% rename from public/images/providers/falai.png rename to packages/app/public/images/providers/falai.png diff --git a/public/images/providers/fireworks.png b/packages/app/public/images/providers/fireworks.png similarity index 100% rename from public/images/providers/fireworks.png rename to packages/app/public/images/providers/fireworks.png diff --git a/public/images/providers/google.png b/packages/app/public/images/providers/google.png similarity index 100% rename from public/images/providers/google.png rename to packages/app/public/images/providers/google.png diff --git a/public/images/providers/groq.png b/packages/app/public/images/providers/groq.png similarity index 100% rename from public/images/providers/groq.png rename to packages/app/public/images/providers/groq.png diff --git a/public/images/providers/hedra.png b/packages/app/public/images/providers/hedra.png similarity index 100% rename from public/images/providers/hedra.png rename to packages/app/public/images/providers/hedra.png diff --git a/public/images/providers/huggingface.png b/packages/app/public/images/providers/huggingface.png similarity index 100% rename from public/images/providers/huggingface.png rename to packages/app/public/images/providers/huggingface.png diff --git a/public/images/providers/kitsai.png b/packages/app/public/images/providers/kitsai.png similarity index 100% rename from public/images/providers/kitsai.png rename to packages/app/public/images/providers/kitsai.png diff --git a/public/images/providers/kuaishou.png b/packages/app/public/images/providers/kuaishou.png similarity index 100% rename from public/images/providers/kuaishou.png rename to packages/app/public/images/providers/kuaishou.png diff --git a/public/images/providers/leonardoai.png b/packages/app/public/images/providers/leonardoai.png similarity index 100% rename from public/images/providers/leonardoai.png rename to packages/app/public/images/providers/leonardoai.png diff --git a/public/images/providers/lumalabs.png b/packages/app/public/images/providers/lumalabs.png similarity index 100% rename from public/images/providers/lumalabs.png rename to packages/app/public/images/providers/lumalabs.png diff --git a/public/images/providers/midjourney.png b/packages/app/public/images/providers/midjourney.png similarity index 100% rename from public/images/providers/midjourney.png rename to packages/app/public/images/providers/midjourney.png diff --git a/public/images/providers/mistralai.png b/packages/app/public/images/providers/mistralai.png similarity index 100% rename from public/images/providers/mistralai.png rename to packages/app/public/images/providers/mistralai.png diff --git a/public/images/providers/modelslab.jpeg b/packages/app/public/images/providers/modelslab.jpeg similarity index 100% rename from public/images/providers/modelslab.jpeg rename to packages/app/public/images/providers/modelslab.jpeg diff --git a/public/images/providers/none.png b/packages/app/public/images/providers/none.png similarity index 100% rename from public/images/providers/none.png rename to packages/app/public/images/providers/none.png diff --git a/public/images/providers/openai.png b/packages/app/public/images/providers/openai.png similarity index 100% rename from public/images/providers/openai.png rename to packages/app/public/images/providers/openai.png diff --git a/public/images/providers/replicate.jpeg b/packages/app/public/images/providers/replicate.jpeg similarity index 100% rename from public/images/providers/replicate.jpeg rename to packages/app/public/images/providers/replicate.jpeg diff --git a/public/images/providers/runwayml.png b/packages/app/public/images/providers/runwayml.png similarity index 100% rename from public/images/providers/runwayml.png rename to packages/app/public/images/providers/runwayml.png diff --git a/public/images/providers/stabilityai.png b/packages/app/public/images/providers/stabilityai.png similarity index 100% rename from public/images/providers/stabilityai.png rename to packages/app/public/images/providers/stabilityai.png diff --git a/public/images/providers/suno.png b/packages/app/public/images/providers/suno.png similarity index 100% rename from public/images/providers/suno.png rename to packages/app/public/images/providers/suno.png diff --git a/public/images/providers/udio.png b/packages/app/public/images/providers/udio.png similarity index 100% rename from public/images/providers/udio.png rename to packages/app/public/images/providers/udio.png diff --git a/public/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/app/public/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap similarity index 100% rename from public/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap rename to packages/app/public/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap diff --git a/public/samples/claps/empty_project.clap b/packages/app/public/samples/claps/empty_project.clap similarity index 100% rename from public/samples/claps/empty_project.clap rename to packages/app/public/samples/claps/empty_project.clap diff --git a/public/samples/claps/empty_project.yaml b/packages/app/public/samples/claps/empty_project.yaml similarity index 100% rename from public/samples/claps/empty_project.yaml rename to packages/app/public/samples/claps/empty_project.yaml diff --git a/public/samples/claps/test.clap b/packages/app/public/samples/claps/test.clap similarity index 100% rename from public/samples/claps/test.clap rename to packages/app/public/samples/claps/test.clap diff --git a/public/samples/claps/wasteland.clap b/packages/app/public/samples/claps/wasteland.clap similarity index 100% rename from public/samples/claps/wasteland.clap rename to packages/app/public/samples/claps/wasteland.clap diff --git a/public/samples/scripts/Citizen Kane.txt b/packages/app/public/samples/scripts/Citizen Kane.txt similarity index 100% rename from public/samples/scripts/Citizen Kane.txt rename to packages/app/public/samples/scripts/Citizen Kane.txt diff --git a/public/samples/scripts/DISCLAIMER.md b/packages/app/public/samples/scripts/DISCLAIMER.md similarity index 100% rename from public/samples/scripts/DISCLAIMER.md rename to packages/app/public/samples/scripts/DISCLAIMER.md diff --git a/public/samples/scripts/Raiders of the Lost Ark.txt b/packages/app/public/samples/scripts/Raiders of the Lost Ark.txt similarity index 100% rename from public/samples/scripts/Raiders of the Lost Ark.txt rename to packages/app/public/samples/scripts/Raiders of the Lost Ark.txt diff --git a/public/samples/scripts/Rear Window.txt b/packages/app/public/samples/scripts/Rear Window.txt similarity index 100% rename from public/samples/scripts/Rear Window.txt rename to packages/app/public/samples/scripts/Rear Window.txt diff --git a/public/samples/scripts/Star Wars A New Hope.txt b/packages/app/public/samples/scripts/Star Wars A New Hope.txt similarity index 100% rename from public/samples/scripts/Star Wars A New Hope.txt rename to packages/app/public/samples/scripts/Star Wars A New Hope.txt diff --git a/public/samples/scripts/The Apery.txt b/packages/app/public/samples/scripts/The Apery.txt similarity index 100% rename from public/samples/scripts/The Apery.txt rename to packages/app/public/samples/scripts/The Apery.txt diff --git a/public/samples/scripts/The Goonies.txt b/packages/app/public/samples/scripts/The Goonies.txt similarity index 100% rename from public/samples/scripts/The Goonies.txt rename to packages/app/public/samples/scripts/The Goonies.txt diff --git a/public/samples/scripts/The Wizard Of Oz.txt b/packages/app/public/samples/scripts/The Wizard Of Oz.txt similarity index 100% rename from public/samples/scripts/The Wizard Of Oz.txt rename to packages/app/public/samples/scripts/The Wizard Of Oz.txt diff --git a/public/voices/README.md b/packages/app/public/voices/README.md similarity index 100% rename from public/voices/README.md rename to packages/app/public/voices/README.md diff --git a/public/wasm/MediaInfoModule.wasm b/packages/app/public/wasm/MediaInfoModule.wasm similarity index 100% rename from public/wasm/MediaInfoModule.wasm rename to packages/app/public/wasm/MediaInfoModule.wasm diff --git a/public/workers/captioning.worker.js b/packages/app/public/workers/captioning.worker.js similarity index 100% rename from public/workers/captioning.worker.js rename to packages/app/public/workers/captioning.worker.js diff --git a/src/app/api/assistant/askAnyAssistant.ts b/packages/app/src/app/api/assistant/askAnyAssistant.ts similarity index 100% rename from src/app/api/assistant/askAnyAssistant.ts rename to packages/app/src/app/api/assistant/askAnyAssistant.ts diff --git a/src/app/api/assistant/parseLangChainResponse.ts b/packages/app/src/app/api/assistant/parseLangChainResponse.ts similarity index 100% rename from src/app/api/assistant/parseLangChainResponse.ts rename to packages/app/src/app/api/assistant/parseLangChainResponse.ts diff --git a/src/app/api/assistant/parser.ts b/packages/app/src/app/api/assistant/parser.ts similarity index 100% rename from src/app/api/assistant/parser.ts rename to packages/app/src/app/api/assistant/parser.ts diff --git a/src/app/api/assistant/providers/google/README.md b/packages/app/src/app/api/assistant/providers/google/README.md similarity index 100% rename from src/app/api/assistant/providers/google/README.md rename to packages/app/src/app/api/assistant/providers/google/README.md diff --git a/src/app/api/assistant/providers/google/sample.txt b/packages/app/src/app/api/assistant/providers/google/sample.txt similarity index 100% rename from src/app/api/assistant/providers/google/sample.txt rename to packages/app/src/app/api/assistant/providers/google/sample.txt diff --git a/src/app/api/assistant/route.ts b/packages/app/src/app/api/assistant/route.ts similarity index 100% rename from src/app/api/assistant/route.ts rename to packages/app/src/app/api/assistant/route.ts diff --git a/src/app/api/assistant/samples.ts b/packages/app/src/app/api/assistant/samples.ts similarity index 100% rename from src/app/api/assistant/samples.ts rename to packages/app/src/app/api/assistant/samples.ts diff --git a/src/app/api/assistant/templates.ts b/packages/app/src/app/api/assistant/templates.ts similarity index 100% rename from src/app/api/assistant/templates.ts rename to packages/app/src/app/api/assistant/templates.ts diff --git a/src/app/api/resolve/providers/aitube/README.md b/packages/app/src/app/api/resolve/providers/aitube/README.md similarity index 100% rename from src/app/api/resolve/providers/aitube/README.md rename to packages/app/src/app/api/resolve/providers/aitube/README.md diff --git a/src/app/api/resolve/providers/aitube/index.ts b/packages/app/src/app/api/resolve/providers/aitube/index.ts similarity index 100% rename from src/app/api/resolve/providers/aitube/index.ts rename to packages/app/src/app/api/resolve/providers/aitube/index.ts diff --git a/src/app/api/resolve/providers/comfy-comfydeploy/index.ts b/packages/app/src/app/api/resolve/providers/comfy-comfydeploy/index.ts similarity index 100% rename from src/app/api/resolve/providers/comfy-comfydeploy/index.ts rename to packages/app/src/app/api/resolve/providers/comfy-comfydeploy/index.ts diff --git a/src/app/api/resolve/providers/comfy-comfyicu/index.ts b/packages/app/src/app/api/resolve/providers/comfy-comfyicu/index.ts similarity index 100% rename from src/app/api/resolve/providers/comfy-comfyicu/index.ts rename to packages/app/src/app/api/resolve/providers/comfy-comfyicu/index.ts diff --git a/src/app/api/resolve/providers/comfy-comfyicu/types.ts b/packages/app/src/app/api/resolve/providers/comfy-comfyicu/types.ts similarity index 100% rename from src/app/api/resolve/providers/comfy-comfyicu/types.ts rename to packages/app/src/app/api/resolve/providers/comfy-comfyicu/types.ts diff --git a/src/app/api/resolve/providers/comfy-huggingface/index.ts b/packages/app/src/app/api/resolve/providers/comfy-huggingface/index.ts similarity index 100% rename from src/app/api/resolve/providers/comfy-huggingface/index.ts rename to packages/app/src/app/api/resolve/providers/comfy-huggingface/index.ts diff --git a/src/app/api/resolve/providers/comfy-replicate/index.ts b/packages/app/src/app/api/resolve/providers/comfy-replicate/index.ts similarity index 100% rename from src/app/api/resolve/providers/comfy-replicate/index.ts rename to packages/app/src/app/api/resolve/providers/comfy-replicate/index.ts diff --git a/src/app/api/resolve/providers/comfy-replicate/runWorkflow.ts b/packages/app/src/app/api/resolve/providers/comfy-replicate/runWorkflow.ts similarity index 100% rename from src/app/api/resolve/providers/comfy-replicate/runWorkflow.ts rename to packages/app/src/app/api/resolve/providers/comfy-replicate/runWorkflow.ts diff --git a/src/app/api/resolve/providers/comfyui/index.ts b/packages/app/src/app/api/resolve/providers/comfyui/index.ts similarity index 100% rename from src/app/api/resolve/providers/comfyui/index.ts rename to packages/app/src/app/api/resolve/providers/comfyui/index.ts diff --git a/src/app/api/resolve/providers/falai/index.ts b/packages/app/src/app/api/resolve/providers/falai/index.ts similarity index 100% rename from src/app/api/resolve/providers/falai/index.ts rename to packages/app/src/app/api/resolve/providers/falai/index.ts diff --git a/src/app/api/resolve/providers/falai/types.ts b/packages/app/src/app/api/resolve/providers/falai/types.ts similarity index 100% rename from src/app/api/resolve/providers/falai/types.ts rename to packages/app/src/app/api/resolve/providers/falai/types.ts diff --git a/src/app/api/resolve/providers/getWorkflowInputValues.ts b/packages/app/src/app/api/resolve/providers/getWorkflowInputValues.ts similarity index 100% rename from src/app/api/resolve/providers/getWorkflowInputValues.ts rename to packages/app/src/app/api/resolve/providers/getWorkflowInputValues.ts diff --git a/src/app/api/resolve/providers/gradio/index.ts b/packages/app/src/app/api/resolve/providers/gradio/index.ts similarity index 100% rename from src/app/api/resolve/providers/gradio/index.ts rename to packages/app/src/app/api/resolve/providers/gradio/index.ts diff --git a/src/app/api/resolve/providers/huggingface/generateImage.ts b/packages/app/src/app/api/resolve/providers/huggingface/generateImage.ts similarity index 100% rename from src/app/api/resolve/providers/huggingface/generateImage.ts rename to packages/app/src/app/api/resolve/providers/huggingface/generateImage.ts diff --git a/src/app/api/resolve/providers/huggingface/generateMusic.ts b/packages/app/src/app/api/resolve/providers/huggingface/generateMusic.ts similarity index 100% rename from src/app/api/resolve/providers/huggingface/generateMusic.ts rename to packages/app/src/app/api/resolve/providers/huggingface/generateMusic.ts diff --git a/src/app/api/resolve/providers/huggingface/generateVideo.ts b/packages/app/src/app/api/resolve/providers/huggingface/generateVideo.ts similarity index 100% rename from src/app/api/resolve/providers/huggingface/generateVideo.ts rename to packages/app/src/app/api/resolve/providers/huggingface/generateVideo.ts diff --git a/src/app/api/resolve/providers/huggingface/generateVoice.ts b/packages/app/src/app/api/resolve/providers/huggingface/generateVoice.ts similarity index 100% rename from src/app/api/resolve/providers/huggingface/generateVoice.ts rename to packages/app/src/app/api/resolve/providers/huggingface/generateVoice.ts diff --git a/src/app/api/resolve/providers/huggingface/index.ts b/packages/app/src/app/api/resolve/providers/huggingface/index.ts similarity index 100% rename from src/app/api/resolve/providers/huggingface/index.ts rename to packages/app/src/app/api/resolve/providers/huggingface/index.ts diff --git a/src/app/api/resolve/providers/index.ts b/packages/app/src/app/api/resolve/providers/index.ts similarity index 100% rename from src/app/api/resolve/providers/index.ts rename to packages/app/src/app/api/resolve/providers/index.ts diff --git a/src/app/api/resolve/providers/lumalabs/getGenerations.ts b/packages/app/src/app/api/resolve/providers/lumalabs/getGenerations.ts similarity index 100% rename from src/app/api/resolve/providers/lumalabs/getGenerations.ts rename to packages/app/src/app/api/resolve/providers/lumalabs/getGenerations.ts diff --git a/src/app/api/resolve/providers/lumalabs/todo.ts b/packages/app/src/app/api/resolve/providers/lumalabs/todo.ts similarity index 100% rename from src/app/api/resolve/providers/lumalabs/todo.ts rename to packages/app/src/app/api/resolve/providers/lumalabs/todo.ts diff --git a/src/app/api/resolve/providers/lumalabs/types.ts b/packages/app/src/app/api/resolve/providers/lumalabs/types.ts similarity index 100% rename from src/app/api/resolve/providers/lumalabs/types.ts rename to packages/app/src/app/api/resolve/providers/lumalabs/types.ts diff --git a/src/app/api/resolve/providers/modelslab/index.ts b/packages/app/src/app/api/resolve/providers/modelslab/index.ts similarity index 100% rename from src/app/api/resolve/providers/modelslab/index.ts rename to packages/app/src/app/api/resolve/providers/modelslab/index.ts diff --git a/src/app/api/resolve/providers/openai/TODO.md b/packages/app/src/app/api/resolve/providers/openai/TODO.md similarity index 100% rename from src/app/api/resolve/providers/openai/TODO.md rename to packages/app/src/app/api/resolve/providers/openai/TODO.md diff --git a/src/app/api/resolve/providers/replicate/index.ts b/packages/app/src/app/api/resolve/providers/replicate/index.ts similarity index 100% rename from src/app/api/resolve/providers/replicate/index.ts rename to packages/app/src/app/api/resolve/providers/replicate/index.ts diff --git a/src/app/api/resolve/providers/stabilityai/generateImage.ts b/packages/app/src/app/api/resolve/providers/stabilityai/generateImage.ts similarity index 100% rename from src/app/api/resolve/providers/stabilityai/generateImage.ts rename to packages/app/src/app/api/resolve/providers/stabilityai/generateImage.ts diff --git a/src/app/api/resolve/providers/stabilityai/generateVideo.ts b/packages/app/src/app/api/resolve/providers/stabilityai/generateVideo.ts similarity index 100% rename from src/app/api/resolve/providers/stabilityai/generateVideo.ts rename to packages/app/src/app/api/resolve/providers/stabilityai/generateVideo.ts diff --git a/src/app/api/resolve/providers/stabilityai/index.ts b/packages/app/src/app/api/resolve/providers/stabilityai/index.ts similarity index 100% rename from src/app/api/resolve/providers/stabilityai/index.ts rename to packages/app/src/app/api/resolve/providers/stabilityai/index.ts diff --git a/src/app/api/resolve/route.ts b/packages/app/src/app/api/resolve/route.ts similarity index 100% rename from src/app/api/resolve/route.ts rename to packages/app/src/app/api/resolve/route.ts diff --git a/src/app/cute_1024x1024x32.png b/packages/app/src/app/cute_1024x1024x32.png similarity index 100% rename from src/app/cute_1024x1024x32.png rename to packages/app/src/app/cute_1024x1024x32.png diff --git a/src/app/cute_favicon.ico b/packages/app/src/app/cute_favicon.ico similarity index 100% rename from src/app/cute_favicon.ico rename to packages/app/src/app/cute_favicon.ico diff --git a/src/app/cute_icon.png b/packages/app/src/app/cute_icon.png similarity index 100% rename from src/app/cute_icon.png rename to packages/app/src/app/cute_icon.png diff --git a/src/app/embed/README.md b/packages/app/src/app/embed/README.md similarity index 100% rename from src/app/embed/README.md rename to packages/app/src/app/embed/README.md diff --git a/src/app/embed/embed.tsx b/packages/app/src/app/embed/embed.tsx similarity index 100% rename from src/app/embed/embed.tsx rename to packages/app/src/app/embed/embed.tsx diff --git a/src/app/embed/page.tsx b/packages/app/src/app/embed/page.tsx similarity index 100% rename from src/app/embed/page.tsx rename to packages/app/src/app/embed/page.tsx diff --git a/src/app/favicon.ico b/packages/app/src/app/favicon.ico similarity index 100% rename from src/app/favicon.ico rename to packages/app/src/app/favicon.ico diff --git a/src/app/favicon_square.ico b/packages/app/src/app/favicon_square.ico similarity index 100% rename from src/app/favicon_square.ico rename to packages/app/src/app/favicon_square.ico diff --git a/src/app/fonts/alarm-clock/alarm-clock.woff2 b/packages/app/src/app/fonts/alarm-clock/alarm-clock.woff2 similarity index 100% rename from src/app/fonts/alarm-clock/alarm-clock.woff2 rename to packages/app/src/app/fonts/alarm-clock/alarm-clock.woff2 diff --git a/src/app/fonts/index.ts b/packages/app/src/app/fonts/index.ts similarity index 100% rename from src/app/fonts/index.ts rename to packages/app/src/app/fonts/index.ts diff --git a/src/app/icon_NEXTJS_BUG.png b/packages/app/src/app/icon_NEXTJS_BUG.png similarity index 100% rename from src/app/icon_NEXTJS_BUG.png rename to packages/app/src/app/icon_NEXTJS_BUG.png diff --git a/src/app/icon_square.png b/packages/app/src/app/icon_square.png similarity index 100% rename from src/app/icon_square.png rename to packages/app/src/app/icon_square.png diff --git a/src/app/layout.tsx b/packages/app/src/app/layout.tsx similarity index 100% rename from src/app/layout.tsx rename to packages/app/src/app/layout.tsx diff --git a/src/app/main.tsx b/packages/app/src/app/main.tsx similarity index 100% rename from src/app/main.tsx rename to packages/app/src/app/main.tsx diff --git a/src/app/page.tsx b/packages/app/src/app/page.tsx similarity index 100% rename from src/app/page.tsx rename to packages/app/src/app/page.tsx diff --git a/src/app/styles/globals.css b/packages/app/src/app/styles/globals.css similarity index 100% rename from src/app/styles/globals.css rename to packages/app/src/app/styles/globals.css diff --git a/src/app/styles/react-reflex-custom.css b/packages/app/src/app/styles/react-reflex-custom.css similarity index 100% rename from src/app/styles/react-reflex-custom.css rename to packages/app/src/app/styles/react-reflex-custom.css diff --git a/src/app/styles/react-reflex.css b/packages/app/src/app/styles/react-reflex.css similarity index 100% rename from src/app/styles/react-reflex.css rename to packages/app/src/app/styles/react-reflex.css diff --git a/src/components/assistant/ChatBubble.tsx b/packages/app/src/components/assistant/ChatBubble.tsx similarity index 100% rename from src/components/assistant/ChatBubble.tsx rename to packages/app/src/components/assistant/ChatBubble.tsx diff --git a/src/components/assistant/ChatView.tsx b/packages/app/src/components/assistant/ChatView.tsx similarity index 100% rename from src/components/assistant/ChatView.tsx rename to packages/app/src/components/assistant/ChatView.tsx diff --git a/src/components/core/providers/ClapWorkflowProviderLogo.tsx b/packages/app/src/components/core/providers/ClapWorkflowProviderLogo.tsx similarity index 100% rename from src/components/core/providers/ClapWorkflowProviderLogo.tsx rename to packages/app/src/components/core/providers/ClapWorkflowProviderLogo.tsx diff --git a/src/components/core/providers/ClapWorkflowProviderName.tsx b/packages/app/src/components/core/providers/ClapWorkflowProviderName.tsx similarity index 100% rename from src/components/core/providers/ClapWorkflowProviderName.tsx rename to packages/app/src/components/core/providers/ClapWorkflowProviderName.tsx diff --git a/src/components/core/providers/index.ts b/packages/app/src/components/core/providers/index.ts similarity index 100% rename from src/components/core/providers/index.ts rename to packages/app/src/components/core/providers/index.ts diff --git a/src/components/core/providers/logos.ts b/packages/app/src/components/core/providers/logos.ts similarity index 100% rename from src/components/core/providers/logos.ts rename to packages/app/src/components/core/providers/logos.ts diff --git a/src/components/core/timeline/index.tsx b/packages/app/src/components/core/timeline/index.tsx similarity index 100% rename from src/components/core/timeline/index.tsx rename to packages/app/src/components/core/timeline/index.tsx diff --git a/src/components/core/tree/README.md b/packages/app/src/components/core/tree/README.md similarity index 100% rename from src/components/core/tree/README.md rename to packages/app/src/components/core/tree/README.md diff --git a/src/components/core/tree/chainable-map.ts b/packages/app/src/components/core/tree/chainable-map.ts similarity index 100% rename from src/components/core/tree/chainable-map.ts rename to packages/app/src/components/core/tree/chainable-map.ts diff --git a/src/components/core/tree/icons.tsx b/packages/app/src/components/core/tree/icons.tsx similarity index 100% rename from src/components/core/tree/icons.tsx rename to packages/app/src/components/core/tree/icons.tsx diff --git a/src/components/core/tree/index.tsx b/packages/app/src/components/core/tree/index.tsx similarity index 100% rename from src/components/core/tree/index.tsx rename to packages/app/src/components/core/tree/index.tsx diff --git a/src/components/core/tree/root.tsx b/packages/app/src/components/core/tree/root.tsx similarity index 100% rename from src/components/core/tree/root.tsx rename to packages/app/src/components/core/tree/root.tsx diff --git a/src/components/core/tree/roving.tsx b/packages/app/src/components/core/tree/roving.tsx similarity index 100% rename from src/components/core/tree/roving.tsx rename to packages/app/src/components/core/tree/roving.tsx diff --git a/src/components/core/tree/tree-state.ts b/packages/app/src/components/core/tree/tree-state.ts similarity index 100% rename from src/components/core/tree/tree-state.ts rename to packages/app/src/components/core/tree/tree-state.ts diff --git a/src/components/core/tree/types.ts b/packages/app/src/components/core/tree/types.ts similarity index 100% rename from src/components/core/tree/types.ts rename to packages/app/src/components/core/tree/types.ts diff --git a/src/components/core/tree/useTreeNode.ts b/packages/app/src/components/core/tree/useTreeNode.ts similarity index 100% rename from src/components/core/tree/useTreeNode.ts rename to packages/app/src/components/core/tree/useTreeNode.ts diff --git a/src/components/core/waveform/types.ts b/packages/app/src/components/core/waveform/types.ts similarity index 100% rename from src/components/core/waveform/types.ts rename to packages/app/src/components/core/waveform/types.ts diff --git a/src/components/core/waveform/useWaveform.ts b/packages/app/src/components/core/waveform/useWaveform.ts similarity index 100% rename from src/components/core/waveform/useWaveform.ts rename to packages/app/src/components/core/waveform/useWaveform.ts diff --git a/src/components/dialogs/iframe-warning/index.tsx b/packages/app/src/components/dialogs/iframe-warning/index.tsx similarity index 100% rename from src/components/dialogs/iframe-warning/index.tsx rename to packages/app/src/components/dialogs/iframe-warning/index.tsx diff --git a/src/components/dialogs/loader/LoadingDialog.tsx b/packages/app/src/components/dialogs/loader/LoadingDialog.tsx similarity index 100% rename from src/components/dialogs/loader/LoadingDialog.tsx rename to packages/app/src/components/dialogs/loader/LoadingDialog.tsx diff --git a/src/components/dialogs/loader/index.tsx b/packages/app/src/components/dialogs/loader/index.tsx similarity index 100% rename from src/components/dialogs/loader/index.tsx rename to packages/app/src/components/dialogs/loader/index.tsx diff --git a/src/components/editors/Editors.tsx b/packages/app/src/components/editors/Editors.tsx similarity index 100% rename from src/components/editors/Editors.tsx rename to packages/app/src/components/editors/Editors.tsx diff --git a/src/components/editors/EntityEditor/EntityTree/index.tsx b/packages/app/src/components/editors/EntityEditor/EntityTree/index.tsx similarity index 100% rename from src/components/editors/EntityEditor/EntityTree/index.tsx rename to packages/app/src/components/editors/EntityEditor/EntityTree/index.tsx diff --git a/src/components/editors/EntityEditor/EntityTree/useEntityTree.ts b/packages/app/src/components/editors/EntityEditor/EntityTree/useEntityTree.ts similarity index 100% rename from src/components/editors/EntityEditor/EntityTree/useEntityTree.ts rename to packages/app/src/components/editors/EntityEditor/EntityTree/useEntityTree.ts diff --git a/src/components/editors/EntityEditor/EntityViewer/EntityList.tsx b/packages/app/src/components/editors/EntityEditor/EntityViewer/EntityList.tsx similarity index 100% rename from src/components/editors/EntityEditor/EntityViewer/EntityList.tsx rename to packages/app/src/components/editors/EntityEditor/EntityViewer/EntityList.tsx diff --git a/src/components/editors/EntityEditor/EntityViewer/index.tsx b/packages/app/src/components/editors/EntityEditor/EntityViewer/index.tsx similarity index 100% rename from src/components/editors/EntityEditor/EntityViewer/index.tsx rename to packages/app/src/components/editors/EntityEditor/EntityViewer/index.tsx diff --git a/src/components/editors/EntityEditor/index.tsx b/packages/app/src/components/editors/EntityEditor/index.tsx similarity index 100% rename from src/components/editors/EntityEditor/index.tsx rename to packages/app/src/components/editors/EntityEditor/index.tsx diff --git a/src/components/editors/FilterEditor/FilterTree/index.tsx b/packages/app/src/components/editors/FilterEditor/FilterTree/index.tsx similarity index 100% rename from src/components/editors/FilterEditor/FilterTree/index.tsx rename to packages/app/src/components/editors/FilterEditor/FilterTree/index.tsx diff --git a/src/components/editors/FilterEditor/FilterTree/useFilterTree.ts b/packages/app/src/components/editors/FilterEditor/FilterTree/useFilterTree.ts similarity index 100% rename from src/components/editors/FilterEditor/FilterTree/useFilterTree.ts rename to packages/app/src/components/editors/FilterEditor/FilterTree/useFilterTree.ts diff --git a/src/components/editors/FilterEditor/FilterViewer/index.tsx b/packages/app/src/components/editors/FilterEditor/FilterViewer/index.tsx similarity index 100% rename from src/components/editors/FilterEditor/FilterViewer/index.tsx rename to packages/app/src/components/editors/FilterEditor/FilterViewer/index.tsx diff --git a/src/components/editors/FilterEditor/index.tsx b/packages/app/src/components/editors/FilterEditor/index.tsx similarity index 100% rename from src/components/editors/FilterEditor/index.tsx rename to packages/app/src/components/editors/FilterEditor/index.tsx diff --git a/src/components/editors/ProjectEditor/index.tsx b/packages/app/src/components/editors/ProjectEditor/index.tsx similarity index 100% rename from src/components/editors/ProjectEditor/index.tsx rename to packages/app/src/components/editors/ProjectEditor/index.tsx diff --git a/src/components/editors/ScriptEditor/README.md b/packages/app/src/components/editors/ScriptEditor/README.md similarity index 100% rename from src/components/editors/ScriptEditor/README.md rename to packages/app/src/components/editors/ScriptEditor/README.md diff --git a/src/components/editors/ScriptEditor/index.tsx b/packages/app/src/components/editors/ScriptEditor/index.tsx similarity index 100% rename from src/components/editors/ScriptEditor/index.tsx rename to packages/app/src/components/editors/ScriptEditor/index.tsx diff --git a/src/components/editors/ScriptEditor/styles.css b/packages/app/src/components/editors/ScriptEditor/styles.css similarity index 100% rename from src/components/editors/ScriptEditor/styles.css rename to packages/app/src/components/editors/ScriptEditor/styles.css diff --git a/src/components/editors/SegmentEditor/index.tsx b/packages/app/src/components/editors/SegmentEditor/index.tsx similarity index 100% rename from src/components/editors/SegmentEditor/index.tsx rename to packages/app/src/components/editors/SegmentEditor/index.tsx diff --git a/src/components/editors/WorkflowEditor/WorkflowTree/index.tsx b/packages/app/src/components/editors/WorkflowEditor/WorkflowTree/index.tsx similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowTree/index.tsx rename to packages/app/src/components/editors/WorkflowEditor/WorkflowTree/index.tsx diff --git a/src/components/editors/WorkflowEditor/WorkflowTree/useWorkflowTree.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowTree/useWorkflowTree.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowTree/useWorkflowTree.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowTree/useWorkflowTree.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/NodeView.tsx b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/NodeView.tsx similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/NodeView.tsx rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/NodeView.tsx diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/clapWorkflowToReactWorkflow.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/clapWorkflowToReactWorkflow.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/clapWorkflowToReactWorkflow.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/clapWorkflowToReactWorkflow.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/comfyui/types.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/comfyui/types.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/comfyui/types.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/comfyui/types.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/falai/types.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/falai/types.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/falai/types.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/falai/types.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/glifToReactWorkflow.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/glifToReactWorkflow.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/glifToReactWorkflow.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/glifToReactWorkflow.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/types.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/types.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/types.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/formats/glif/types.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/index.tsx b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/index.tsx similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/index.tsx rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/index.tsx diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/comfyicu.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/comfyicu.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/comfyicu.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/comfyicu.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/glif.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/glif.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/glif.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/samples/glif.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/types.ts b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/types.ts similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/types.ts rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/ReactFlowCanvas/types.ts diff --git a/src/components/editors/WorkflowEditor/WorkflowViewer/index.tsx b/packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/index.tsx similarity index 100% rename from src/components/editors/WorkflowEditor/WorkflowViewer/index.tsx rename to packages/app/src/components/editors/WorkflowEditor/WorkflowViewer/index.tsx diff --git a/src/components/editors/WorkflowEditor/index.tsx b/packages/app/src/components/editors/WorkflowEditor/index.tsx similarity index 100% rename from src/components/editors/WorkflowEditor/index.tsx rename to packages/app/src/components/editors/WorkflowEditor/index.tsx diff --git a/src/components/forms/FormDir.tsx b/packages/app/src/components/forms/FormDir.tsx similarity index 100% rename from src/components/forms/FormDir.tsx rename to packages/app/src/components/forms/FormDir.tsx diff --git a/src/components/forms/FormField.tsx b/packages/app/src/components/forms/FormField.tsx similarity index 100% rename from src/components/forms/FormField.tsx rename to packages/app/src/components/forms/FormField.tsx diff --git a/src/components/forms/FormFile.tsx b/packages/app/src/components/forms/FormFile.tsx similarity index 100% rename from src/components/forms/FormFile.tsx rename to packages/app/src/components/forms/FormFile.tsx diff --git a/src/components/forms/FormInput.tsx b/packages/app/src/components/forms/FormInput.tsx similarity index 100% rename from src/components/forms/FormInput.tsx rename to packages/app/src/components/forms/FormInput.tsx diff --git a/src/components/forms/FormLabel.tsx b/packages/app/src/components/forms/FormLabel.tsx similarity index 100% rename from src/components/forms/FormLabel.tsx rename to packages/app/src/components/forms/FormLabel.tsx diff --git a/src/components/forms/FormRadio.tsx b/packages/app/src/components/forms/FormRadio.tsx similarity index 100% rename from src/components/forms/FormRadio.tsx rename to packages/app/src/components/forms/FormRadio.tsx diff --git a/src/components/forms/FormSection.tsx b/packages/app/src/components/forms/FormSection.tsx similarity index 100% rename from src/components/forms/FormSection.tsx rename to packages/app/src/components/forms/FormSection.tsx diff --git a/src/components/forms/FormSelect.tsx b/packages/app/src/components/forms/FormSelect.tsx similarity index 100% rename from src/components/forms/FormSelect.tsx rename to packages/app/src/components/forms/FormSelect.tsx diff --git a/src/components/forms/FormSlider.tsx b/packages/app/src/components/forms/FormSlider.tsx similarity index 100% rename from src/components/forms/FormSlider.tsx rename to packages/app/src/components/forms/FormSlider.tsx diff --git a/src/components/forms/FormSwitch.tsx b/packages/app/src/components/forms/FormSwitch.tsx similarity index 100% rename from src/components/forms/FormSwitch.tsx rename to packages/app/src/components/forms/FormSwitch.tsx diff --git a/src/components/forms/index.ts b/packages/app/src/components/forms/index.ts similarity index 100% rename from src/components/forms/index.ts rename to packages/app/src/components/forms/index.ts diff --git a/src/components/icons/getAppropriateIcon.ts b/packages/app/src/components/icons/getAppropriateIcon.ts similarity index 100% rename from src/components/icons/getAppropriateIcon.ts rename to packages/app/src/components/icons/getAppropriateIcon.ts diff --git a/src/components/icons/index.tsx b/packages/app/src/components/icons/index.tsx similarity index 100% rename from src/components/icons/index.tsx rename to packages/app/src/components/icons/index.tsx diff --git a/src/components/mobile/MobileMenu.tsx b/packages/app/src/components/mobile/MobileMenu.tsx similarity index 100% rename from src/components/mobile/MobileMenu.tsx rename to packages/app/src/components/mobile/MobileMenu.tsx diff --git a/src/components/monitor/Counter/index.tsx b/packages/app/src/components/monitor/Counter/index.tsx similarity index 100% rename from src/components/monitor/Counter/index.tsx rename to packages/app/src/components/monitor/Counter/index.tsx diff --git a/src/components/monitor/DynamicPlayer/DynamicBuffer.tsx b/packages/app/src/components/monitor/DynamicPlayer/DynamicBuffer.tsx similarity index 100% rename from src/components/monitor/DynamicPlayer/DynamicBuffer.tsx rename to packages/app/src/components/monitor/DynamicPlayer/DynamicBuffer.tsx diff --git a/src/components/monitor/DynamicPlayer/StoryboardBuffer.tsx b/packages/app/src/components/monitor/DynamicPlayer/StoryboardBuffer.tsx similarity index 100% rename from src/components/monitor/DynamicPlayer/StoryboardBuffer.tsx rename to packages/app/src/components/monitor/DynamicPlayer/StoryboardBuffer.tsx diff --git a/src/components/monitor/DynamicPlayer/VideoClipBuffer.tsx b/packages/app/src/components/monitor/DynamicPlayer/VideoClipBuffer.tsx similarity index 100% rename from src/components/monitor/DynamicPlayer/VideoClipBuffer.tsx rename to packages/app/src/components/monitor/DynamicPlayer/VideoClipBuffer.tsx diff --git a/src/components/monitor/DynamicPlayer/index.tsx b/packages/app/src/components/monitor/DynamicPlayer/index.tsx similarity index 100% rename from src/components/monitor/DynamicPlayer/index.tsx rename to packages/app/src/components/monitor/DynamicPlayer/index.tsx diff --git a/src/components/monitor/PlayerControls/index.tsx b/packages/app/src/components/monitor/PlayerControls/index.tsx similarity index 100% rename from src/components/monitor/PlayerControls/index.tsx rename to packages/app/src/components/monitor/PlayerControls/index.tsx diff --git a/src/components/monitor/README.md b/packages/app/src/components/monitor/README.md similarity index 100% rename from src/components/monitor/README.md rename to packages/app/src/components/monitor/README.md diff --git a/src/components/monitor/Separator/index.tsx b/packages/app/src/components/monitor/Separator/index.tsx similarity index 100% rename from src/components/monitor/Separator/index.tsx rename to packages/app/src/components/monitor/Separator/index.tsx diff --git a/src/components/monitor/StaticPlayer/index.tsx b/packages/app/src/components/monitor/StaticPlayer/index.tsx similarity index 100% rename from src/components/monitor/StaticPlayer/index.tsx rename to packages/app/src/components/monitor/StaticPlayer/index.tsx diff --git a/src/components/monitor/UniversalPlayer/index.tsx b/packages/app/src/components/monitor/UniversalPlayer/index.tsx similarity index 94% rename from src/components/monitor/UniversalPlayer/index.tsx rename to packages/app/src/components/monitor/UniversalPlayer/index.tsx index c0c5888d..821c1ccc 100644 --- a/src/components/monitor/UniversalPlayer/index.tsx +++ b/packages/app/src/components/monitor/UniversalPlayer/index.tsx @@ -1,7 +1,7 @@ import { ClapSegment } from '@aitube/clap' import { useTimeline } from '@aitube/timeline' -import { StaticPlayer } from '../../monitor/StaticPlayer' +import { StaticPlayer } from '../StaticPlayer' import { DynamicPlayer } from '../DynamicPlayer' // TODO: put this in a separate component eg @aitube-player or @aitube/monitor diff --git a/src/components/monitor/icons/icon-switch.tsx b/packages/app/src/components/monitor/icons/icon-switch.tsx similarity index 100% rename from src/components/monitor/icons/icon-switch.tsx rename to packages/app/src/components/monitor/icons/icon-switch.tsx diff --git a/src/components/monitor/icons/single-icon.tsx b/packages/app/src/components/monitor/icons/single-icon.tsx similarity index 100% rename from src/components/monitor/icons/single-icon.tsx rename to packages/app/src/components/monitor/icons/single-icon.tsx diff --git a/src/components/monitor/index.tsx b/packages/app/src/components/monitor/index.tsx similarity index 100% rename from src/components/monitor/index.tsx rename to packages/app/src/components/monitor/index.tsx diff --git a/src/components/monitor/utils/splitElapsedTime.tsx b/packages/app/src/components/monitor/utils/splitElapsedTime.tsx similarity index 100% rename from src/components/monitor/utils/splitElapsedTime.tsx rename to packages/app/src/components/monitor/utils/splitElapsedTime.tsx diff --git a/src/components/monitor/utils/zeroPad.ts b/packages/app/src/components/monitor/utils/zeroPad.ts similarity index 100% rename from src/components/monitor/utils/zeroPad.ts rename to packages/app/src/components/monitor/utils/zeroPad.ts diff --git a/src/components/settings/assistant.tsx b/packages/app/src/components/settings/assistant.tsx similarity index 100% rename from src/components/settings/assistant.tsx rename to packages/app/src/components/settings/assistant.tsx diff --git a/src/components/settings/constants.ts b/packages/app/src/components/settings/constants.ts similarity index 100% rename from src/components/settings/constants.ts rename to packages/app/src/components/settings/constants.ts diff --git a/src/components/settings/editors.tsx b/packages/app/src/components/settings/editors.tsx similarity index 100% rename from src/components/settings/editors.tsx rename to packages/app/src/components/settings/editors.tsx diff --git a/src/components/settings/image.tsx b/packages/app/src/components/settings/image.tsx similarity index 100% rename from src/components/settings/image.tsx rename to packages/app/src/components/settings/image.tsx diff --git a/src/components/settings/index.tsx b/packages/app/src/components/settings/index.tsx similarity index 100% rename from src/components/settings/index.tsx rename to packages/app/src/components/settings/index.tsx diff --git a/src/components/settings/music.tsx b/packages/app/src/components/settings/music.tsx similarity index 100% rename from src/components/settings/music.tsx rename to packages/app/src/components/settings/music.tsx diff --git a/src/components/settings/provider.tsx b/packages/app/src/components/settings/provider.tsx similarity index 100% rename from src/components/settings/provider.tsx rename to packages/app/src/components/settings/provider.tsx diff --git a/src/components/settings/sound.tsx b/packages/app/src/components/settings/sound.tsx similarity index 100% rename from src/components/settings/sound.tsx rename to packages/app/src/components/settings/sound.tsx diff --git a/src/components/settings/video.tsx b/packages/app/src/components/settings/video.tsx similarity index 100% rename from src/components/settings/video.tsx rename to packages/app/src/components/settings/video.tsx diff --git a/src/components/settings/voice.tsx b/packages/app/src/components/settings/voice.tsx similarity index 100% rename from src/components/settings/voice.tsx rename to packages/app/src/components/settings/voice.tsx diff --git a/src/components/tags/Tag.tsx b/packages/app/src/components/tags/Tag.tsx similarity index 100% rename from src/components/tags/Tag.tsx rename to packages/app/src/components/tags/Tag.tsx diff --git a/src/components/tags/colors.ts b/packages/app/src/components/tags/colors.ts similarity index 100% rename from src/components/tags/colors.ts rename to packages/app/src/components/tags/colors.ts diff --git a/src/components/tags/types.ts b/packages/app/src/components/tags/types.ts similarity index 100% rename from src/components/tags/types.ts rename to packages/app/src/components/tags/types.ts diff --git a/src/components/tasks/TaskStatusUpdate.tsx b/packages/app/src/components/tasks/TaskStatusUpdate.tsx similarity index 100% rename from src/components/tasks/TaskStatusUpdate.tsx rename to packages/app/src/components/tasks/TaskStatusUpdate.tsx diff --git a/src/components/tasks/useTasks.tsx b/packages/app/src/components/tasks/useTasks.tsx similarity index 100% rename from src/components/tasks/useTasks.tsx rename to packages/app/src/components/tasks/useTasks.tsx diff --git a/src/components/toolbars/bottom-bar/index.tsx b/packages/app/src/components/toolbars/bottom-bar/index.tsx similarity index 100% rename from src/components/toolbars/bottom-bar/index.tsx rename to packages/app/src/components/toolbars/bottom-bar/index.tsx diff --git a/src/components/toolbars/bottom-bar/metrics/index.tsx b/packages/app/src/components/toolbars/bottom-bar/metrics/index.tsx similarity index 100% rename from src/components/toolbars/bottom-bar/metrics/index.tsx rename to packages/app/src/components/toolbars/bottom-bar/metrics/index.tsx diff --git a/src/components/toolbars/bottom-bar/tasks/index.tsx b/packages/app/src/components/toolbars/bottom-bar/tasks/index.tsx similarity index 100% rename from src/components/toolbars/bottom-bar/tasks/index.tsx rename to packages/app/src/components/toolbars/bottom-bar/tasks/index.tsx diff --git a/src/components/toolbars/editors-menu/EditorsSideMenu.tsx b/packages/app/src/components/toolbars/editors-menu/EditorsSideMenu.tsx similarity index 100% rename from src/components/toolbars/editors-menu/EditorsSideMenu.tsx rename to packages/app/src/components/toolbars/editors-menu/EditorsSideMenu.tsx diff --git a/src/components/toolbars/editors-menu/EditorsSideMenuItem.tsx b/packages/app/src/components/toolbars/editors-menu/EditorsSideMenuItem.tsx similarity index 100% rename from src/components/toolbars/editors-menu/EditorsSideMenuItem.tsx rename to packages/app/src/components/toolbars/editors-menu/EditorsSideMenuItem.tsx diff --git a/src/components/toolbars/editors-menu/NatureIcon.tsx b/packages/app/src/components/toolbars/editors-menu/NatureIcon.tsx similarity index 100% rename from src/components/toolbars/editors-menu/NatureIcon.tsx rename to packages/app/src/components/toolbars/editors-menu/NatureIcon.tsx diff --git a/src/components/toolbars/system-menu/index.tsx b/packages/app/src/components/toolbars/system-menu/index.tsx similarity index 100% rename from src/components/toolbars/system-menu/index.tsx rename to packages/app/src/components/toolbars/system-menu/index.tsx diff --git a/src/components/toolbars/top-bar/index.tsx b/packages/app/src/components/toolbars/top-bar/index.tsx similarity index 100% rename from src/components/toolbars/top-bar/index.tsx rename to packages/app/src/components/toolbars/top-bar/index.tsx diff --git a/src/components/toolbars/top-menu/ActivitySpinner/index.tsx b/packages/app/src/components/toolbars/top-menu/ActivitySpinner/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/ActivitySpinner/index.tsx rename to packages/app/src/components/toolbars/top-menu/ActivitySpinner/index.tsx diff --git a/src/components/toolbars/top-menu/IsBusy/index.tsx b/packages/app/src/components/toolbars/top-menu/IsBusy/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/IsBusy/index.tsx rename to packages/app/src/components/toolbars/top-menu/IsBusy/index.tsx diff --git a/src/components/toolbars/top-menu/ToggleFullScreen/index.tsx b/packages/app/src/components/toolbars/top-menu/ToggleFullScreen/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/ToggleFullScreen/index.tsx rename to packages/app/src/components/toolbars/top-menu/ToggleFullScreen/index.tsx diff --git a/src/components/toolbars/top-menu/ToggleView/index.tsx b/packages/app/src/components/toolbars/top-menu/ToggleView/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/ToggleView/index.tsx rename to packages/app/src/components/toolbars/top-menu/ToggleView/index.tsx diff --git a/src/components/toolbars/top-menu/ToggleWindowLayout/index.tsx b/packages/app/src/components/toolbars/top-menu/ToggleWindowLayout/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/ToggleWindowLayout/index.tsx rename to packages/app/src/components/toolbars/top-menu/ToggleWindowLayout/index.tsx diff --git a/src/components/toolbars/top-menu/TopMenuLogo/index.tsx b/packages/app/src/components/toolbars/top-menu/TopMenuLogo/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/TopMenuLogo/index.tsx rename to packages/app/src/components/toolbars/top-menu/TopMenuLogo/index.tsx diff --git a/src/components/toolbars/top-menu/assistant/index.tsx b/packages/app/src/components/toolbars/top-menu/assistant/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/assistant/index.tsx rename to packages/app/src/components/toolbars/top-menu/assistant/index.tsx diff --git a/src/components/toolbars/top-menu/constants.ts b/packages/app/src/components/toolbars/top-menu/constants.ts similarity index 100% rename from src/components/toolbars/top-menu/constants.ts rename to packages/app/src/components/toolbars/top-menu/constants.ts diff --git a/src/components/toolbars/top-menu/edit/index.tsx b/packages/app/src/components/toolbars/top-menu/edit/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/edit/index.tsx rename to packages/app/src/components/toolbars/top-menu/edit/index.tsx diff --git a/src/components/toolbars/top-menu/file/index.tsx b/packages/app/src/components/toolbars/top-menu/file/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/file/index.tsx rename to packages/app/src/components/toolbars/top-menu/file/index.tsx diff --git a/src/components/toolbars/top-menu/image/index.tsx b/packages/app/src/components/toolbars/top-menu/image/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/image/index.tsx rename to packages/app/src/components/toolbars/top-menu/image/index.tsx diff --git a/src/components/toolbars/top-menu/index.tsx b/packages/app/src/components/toolbars/top-menu/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/index.tsx rename to packages/app/src/components/toolbars/top-menu/index.tsx diff --git a/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/RenderingStrategyList.tsx b/packages/app/src/components/toolbars/top-menu/lists/RenderingStrategyList.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/RenderingStrategyList.tsx rename to packages/app/src/components/toolbars/top-menu/lists/RenderingStrategyList.tsx diff --git a/src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/ThemeList.tsx b/packages/app/src/components/toolbars/top-menu/lists/ThemeList.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/ThemeList.tsx rename to packages/app/src/components/toolbars/top-menu/lists/ThemeList.tsx diff --git a/src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx similarity index 100% rename from src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx rename to packages/app/src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx diff --git a/src/components/toolbars/top-menu/lists/formatProvider.ts b/packages/app/src/components/toolbars/top-menu/lists/formatProvider.ts similarity index 100% rename from src/components/toolbars/top-menu/lists/formatProvider.ts rename to packages/app/src/components/toolbars/top-menu/lists/formatProvider.ts diff --git a/src/components/toolbars/top-menu/lists/getWorkflowProviders.ts b/packages/app/src/components/toolbars/top-menu/lists/getWorkflowProviders.ts similarity index 100% rename from src/components/toolbars/top-menu/lists/getWorkflowProviders.ts rename to packages/app/src/components/toolbars/top-menu/lists/getWorkflowProviders.ts diff --git a/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts b/packages/app/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts similarity index 100% rename from src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts rename to packages/app/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts diff --git a/src/components/toolbars/top-menu/music/index.tsx b/packages/app/src/components/toolbars/top-menu/music/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/music/index.tsx rename to packages/app/src/components/toolbars/top-menu/music/index.tsx diff --git a/src/components/toolbars/top-menu/plugins/index.tsx b/packages/app/src/components/toolbars/top-menu/plugins/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/plugins/index.tsx rename to packages/app/src/components/toolbars/top-menu/plugins/index.tsx diff --git a/src/components/toolbars/top-menu/sound/index.tsx b/packages/app/src/components/toolbars/top-menu/sound/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/sound/index.tsx rename to packages/app/src/components/toolbars/top-menu/sound/index.tsx diff --git a/src/components/toolbars/top-menu/video/index.tsx b/packages/app/src/components/toolbars/top-menu/video/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/video/index.tsx rename to packages/app/src/components/toolbars/top-menu/video/index.tsx diff --git a/src/components/toolbars/top-menu/view/index.tsx b/packages/app/src/components/toolbars/top-menu/view/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/view/index.tsx rename to packages/app/src/components/toolbars/top-menu/view/index.tsx diff --git a/src/components/toolbars/top-menu/voice/index.tsx b/packages/app/src/components/toolbars/top-menu/voice/index.tsx similarity index 100% rename from src/components/toolbars/top-menu/voice/index.tsx rename to packages/app/src/components/toolbars/top-menu/voice/index.tsx diff --git a/src/components/tree-browsers/style/treeNodeStyles.ts b/packages/app/src/components/tree-browsers/style/treeNodeStyles.ts similarity index 100% rename from src/components/tree-browsers/style/treeNodeStyles.ts rename to packages/app/src/components/tree-browsers/style/treeNodeStyles.ts diff --git a/src/components/tree-browsers/types.ts b/packages/app/src/components/tree-browsers/types.ts similarity index 100% rename from src/components/tree-browsers/types.ts rename to packages/app/src/components/tree-browsers/types.ts diff --git a/src/components/tree-browsers/utils/getCollectionColor.ts b/packages/app/src/components/tree-browsers/utils/getCollectionColor.ts similarity index 100% rename from src/components/tree-browsers/utils/getCollectionColor.ts rename to packages/app/src/components/tree-browsers/utils/getCollectionColor.ts diff --git a/src/components/tree-browsers/utils/getCollectionItemTextColor.ts b/packages/app/src/components/tree-browsers/utils/getCollectionItemTextColor.ts similarity index 100% rename from src/components/tree-browsers/utils/getCollectionItemTextColor.ts rename to packages/app/src/components/tree-browsers/utils/getCollectionItemTextColor.ts diff --git a/src/components/tree-browsers/utils/getItemColor.ts b/packages/app/src/components/tree-browsers/utils/getItemColor.ts similarity index 100% rename from src/components/tree-browsers/utils/getItemColor.ts rename to packages/app/src/components/tree-browsers/utils/getItemColor.ts diff --git a/src/components/tree-browsers/utils/isSomething.ts b/packages/app/src/components/tree-browsers/utils/isSomething.ts similarity index 100% rename from src/components/tree-browsers/utils/isSomething.ts rename to packages/app/src/components/tree-browsers/utils/isSomething.ts diff --git a/src/components/ui/accordion.tsx b/packages/app/src/components/ui/accordion.tsx similarity index 100% rename from src/components/ui/accordion.tsx rename to packages/app/src/components/ui/accordion.tsx diff --git a/src/components/ui/alert.tsx b/packages/app/src/components/ui/alert.tsx similarity index 100% rename from src/components/ui/alert.tsx rename to packages/app/src/components/ui/alert.tsx diff --git a/src/components/ui/avatar.tsx b/packages/app/src/components/ui/avatar.tsx similarity index 100% rename from src/components/ui/avatar.tsx rename to packages/app/src/components/ui/avatar.tsx diff --git a/src/components/ui/badge.tsx b/packages/app/src/components/ui/badge.tsx similarity index 100% rename from src/components/ui/badge.tsx rename to packages/app/src/components/ui/badge.tsx diff --git a/src/components/ui/button.tsx b/packages/app/src/components/ui/button.tsx similarity index 100% rename from src/components/ui/button.tsx rename to packages/app/src/components/ui/button.tsx diff --git a/src/components/ui/card.tsx b/packages/app/src/components/ui/card.tsx similarity index 100% rename from src/components/ui/card.tsx rename to packages/app/src/components/ui/card.tsx diff --git a/src/components/ui/checkbox.tsx b/packages/app/src/components/ui/checkbox.tsx similarity index 100% rename from src/components/ui/checkbox.tsx rename to packages/app/src/components/ui/checkbox.tsx diff --git a/src/components/ui/collapsible.tsx b/packages/app/src/components/ui/collapsible.tsx similarity index 100% rename from src/components/ui/collapsible.tsx rename to packages/app/src/components/ui/collapsible.tsx diff --git a/src/components/ui/command.tsx b/packages/app/src/components/ui/command.tsx similarity index 100% rename from src/components/ui/command.tsx rename to packages/app/src/components/ui/command.tsx diff --git a/src/components/ui/dialog.tsx b/packages/app/src/components/ui/dialog.tsx similarity index 100% rename from src/components/ui/dialog.tsx rename to packages/app/src/components/ui/dialog.tsx diff --git a/src/components/ui/dropdown-menu.tsx b/packages/app/src/components/ui/dropdown-menu.tsx similarity index 100% rename from src/components/ui/dropdown-menu.tsx rename to packages/app/src/components/ui/dropdown-menu.tsx diff --git a/src/components/ui/input.tsx b/packages/app/src/components/ui/input.tsx similarity index 100% rename from src/components/ui/input.tsx rename to packages/app/src/components/ui/input.tsx diff --git a/src/components/ui/label.tsx b/packages/app/src/components/ui/label.tsx similarity index 100% rename from src/components/ui/label.tsx rename to packages/app/src/components/ui/label.tsx diff --git a/src/components/ui/menubar.tsx b/packages/app/src/components/ui/menubar.tsx similarity index 100% rename from src/components/ui/menubar.tsx rename to packages/app/src/components/ui/menubar.tsx diff --git a/src/components/ui/popover.tsx b/packages/app/src/components/ui/popover.tsx similarity index 100% rename from src/components/ui/popover.tsx rename to packages/app/src/components/ui/popover.tsx diff --git a/src/components/ui/progress.tsx b/packages/app/src/components/ui/progress.tsx similarity index 100% rename from src/components/ui/progress.tsx rename to packages/app/src/components/ui/progress.tsx diff --git a/src/components/ui/scroll-area.tsx b/packages/app/src/components/ui/scroll-area.tsx similarity index 100% rename from src/components/ui/scroll-area.tsx rename to packages/app/src/components/ui/scroll-area.tsx diff --git a/src/components/ui/select.tsx b/packages/app/src/components/ui/select.tsx similarity index 100% rename from src/components/ui/select.tsx rename to packages/app/src/components/ui/select.tsx diff --git a/src/components/ui/separator.tsx b/packages/app/src/components/ui/separator.tsx similarity index 100% rename from src/components/ui/separator.tsx rename to packages/app/src/components/ui/separator.tsx diff --git a/src/components/ui/sheet.tsx b/packages/app/src/components/ui/sheet.tsx similarity index 100% rename from src/components/ui/sheet.tsx rename to packages/app/src/components/ui/sheet.tsx diff --git a/src/components/ui/slider.tsx b/packages/app/src/components/ui/slider.tsx similarity index 100% rename from src/components/ui/slider.tsx rename to packages/app/src/components/ui/slider.tsx diff --git a/src/components/ui/sonner.tsx b/packages/app/src/components/ui/sonner.tsx similarity index 100% rename from src/components/ui/sonner.tsx rename to packages/app/src/components/ui/sonner.tsx diff --git a/src/components/ui/switch.tsx b/packages/app/src/components/ui/switch.tsx similarity index 100% rename from src/components/ui/switch.tsx rename to packages/app/src/components/ui/switch.tsx diff --git a/src/components/ui/table.tsx b/packages/app/src/components/ui/table.tsx similarity index 100% rename from src/components/ui/table.tsx rename to packages/app/src/components/ui/table.tsx diff --git a/src/components/ui/tabs.tsx b/packages/app/src/components/ui/tabs.tsx similarity index 100% rename from src/components/ui/tabs.tsx rename to packages/app/src/components/ui/tabs.tsx diff --git a/src/components/ui/textarea.tsx b/packages/app/src/components/ui/textarea.tsx similarity index 100% rename from src/components/ui/textarea.tsx rename to packages/app/src/components/ui/textarea.tsx diff --git a/src/components/ui/toast.tsx b/packages/app/src/components/ui/toast.tsx similarity index 100% rename from src/components/ui/toast.tsx rename to packages/app/src/components/ui/toast.tsx diff --git a/src/components/ui/toaster.tsx b/packages/app/src/components/ui/toaster.tsx similarity index 100% rename from src/components/ui/toaster.tsx rename to packages/app/src/components/ui/toaster.tsx diff --git a/src/components/ui/tooltip.tsx b/packages/app/src/components/ui/tooltip.tsx similarity index 100% rename from src/components/ui/tooltip.tsx rename to packages/app/src/components/ui/tooltip.tsx diff --git a/src/components/ui/use-toast.ts b/packages/app/src/components/ui/use-toast.ts similarity index 100% rename from src/components/ui/use-toast.ts rename to packages/app/src/components/ui/use-toast.ts diff --git a/src/components/ui/vertical-slider.tsx b/packages/app/src/components/ui/vertical-slider.tsx similarity index 100% rename from src/components/ui/vertical-slider.tsx rename to packages/app/src/components/ui/vertical-slider.tsx diff --git a/src/components/uikit/default/button.tsx b/packages/app/src/components/uikit/default/button.tsx similarity index 98% rename from src/components/uikit/default/button.tsx rename to packages/app/src/components/uikit/default/button.tsx index cb19faff..970ff11e 100644 --- a/src/components/uikit/default/button.tsx +++ b/packages/app/src/components/uikit/default/button.tsx @@ -6,7 +6,7 @@ import { DefaultProperties, } from '@react-three/uikit' import React, { ReactNode, RefAttributes, forwardRef } from 'react' -import { borderRadius, colors } from './theme.js' +import { borderRadius, colors } from './theme.jsx' const buttonVariants = { default: { diff --git a/src/components/uikit/default/theme.tsx b/packages/app/src/components/uikit/default/theme.tsx similarity index 100% rename from src/components/uikit/default/theme.tsx rename to packages/app/src/components/uikit/default/theme.tsx diff --git a/src/components/windows/index.tsx b/packages/app/src/components/windows/index.tsx similarity index 100% rename from src/components/windows/index.tsx rename to packages/app/src/components/windows/index.tsx diff --git a/src/components/wizards/project/index.tsx b/packages/app/src/components/wizards/project/index.tsx similarity index 100% rename from src/components/wizards/project/index.tsx rename to packages/app/src/components/wizards/project/index.tsx diff --git a/src/experiments/README.md b/packages/app/src/experiments/README.md similarity index 100% rename from src/experiments/README.md rename to packages/app/src/experiments/README.md diff --git a/src/experiments/moodboard/MoodboardView.tsx b/packages/app/src/experiments/moodboard/MoodboardView.tsx similarity index 100% rename from src/experiments/moodboard/MoodboardView.tsx rename to packages/app/src/experiments/moodboard/MoodboardView.tsx diff --git a/src/experiments/moodboard/Node.tsx b/packages/app/src/experiments/moodboard/Node.tsx similarity index 100% rename from src/experiments/moodboard/Node.tsx rename to packages/app/src/experiments/moodboard/Node.tsx diff --git a/src/experiments/samples/demo.ts b/packages/app/src/experiments/samples/demo.ts similarity index 100% rename from src/experiments/samples/demo.ts rename to packages/app/src/experiments/samples/demo.ts diff --git a/src/lib/core/constants.ts b/packages/app/src/lib/core/constants.ts similarity index 100% rename from src/lib/core/constants.ts rename to packages/app/src/lib/core/constants.ts diff --git a/src/lib/ffmpeg/convertAudioToMp3.ts b/packages/app/src/lib/ffmpeg/convertAudioToMp3.ts similarity index 100% rename from src/lib/ffmpeg/convertAudioToMp3.ts rename to packages/app/src/lib/ffmpeg/convertAudioToMp3.ts diff --git a/src/lib/ffmpeg/getMediaInfo.ts b/packages/app/src/lib/ffmpeg/getMediaInfo.ts similarity index 100% rename from src/lib/ffmpeg/getMediaInfo.ts rename to packages/app/src/lib/ffmpeg/getMediaInfo.ts diff --git a/src/lib/hf/adapter/README.md b/packages/app/src/lib/hf/adapter/README.md similarity index 100% rename from src/lib/hf/adapter/README.md rename to packages/app/src/lib/hf/adapter/README.md diff --git a/src/lib/hf/adapter/adaptAnyInputsToGradioInputs.ts b/packages/app/src/lib/hf/adapter/adaptAnyInputsToGradioInputs.ts similarity index 100% rename from src/lib/hf/adapter/adaptAnyInputsToGradioInputs.ts rename to packages/app/src/lib/hf/adapter/adaptAnyInputsToGradioInputs.ts diff --git a/src/lib/hf/adapter/findMainGradioEndpoint.ts b/packages/app/src/lib/hf/adapter/findMainGradioEndpoint.ts similarity index 100% rename from src/lib/hf/adapter/findMainGradioEndpoint.ts rename to packages/app/src/lib/hf/adapter/findMainGradioEndpoint.ts diff --git a/src/lib/hf/adapter/getAdaptationScore.ts b/packages/app/src/lib/hf/adapter/getAdaptationScore.ts similarity index 100% rename from src/lib/hf/adapter/getAdaptationScore.ts rename to packages/app/src/lib/hf/adapter/getAdaptationScore.ts diff --git a/src/lib/hf/adapter/getDefaultFields.ts b/packages/app/src/lib/hf/adapter/getDefaultFields.ts similarity index 100% rename from src/lib/hf/adapter/getDefaultFields.ts rename to packages/app/src/lib/hf/adapter/getDefaultFields.ts diff --git a/src/lib/hf/adapter/identifyField.ts b/packages/app/src/lib/hf/adapter/identifyField.ts similarity index 100% rename from src/lib/hf/adapter/identifyField.ts rename to packages/app/src/lib/hf/adapter/identifyField.ts diff --git a/src/lib/hf/callGradioApi.ts b/packages/app/src/lib/hf/callGradioApi.ts similarity index 100% rename from src/lib/hf/callGradioApi.ts rename to packages/app/src/lib/hf/callGradioApi.ts diff --git a/src/lib/hf/cloneSpace.ts b/packages/app/src/lib/hf/cloneSpace.ts similarity index 100% rename from src/lib/hf/cloneSpace.ts rename to packages/app/src/lib/hf/cloneSpace.ts diff --git a/src/lib/hf/getCurrentOwner.ts b/packages/app/src/lib/hf/getCurrentOwner.ts similarity index 100% rename from src/lib/hf/getCurrentOwner.ts rename to packages/app/src/lib/hf/getCurrentOwner.ts diff --git a/src/lib/hf/getGradioApiInfo.ts b/packages/app/src/lib/hf/getGradioApiInfo.ts similarity index 100% rename from src/lib/hf/getGradioApiInfo.ts rename to packages/app/src/lib/hf/getGradioApiInfo.ts diff --git a/src/lib/hf/getSpaceStatus.ts b/packages/app/src/lib/hf/getSpaceStatus.ts similarity index 100% rename from src/lib/hf/getSpaceStatus.ts rename to packages/app/src/lib/hf/getSpaceStatus.ts diff --git a/src/lib/hf/getSpaces.ts b/packages/app/src/lib/hf/getSpaces.ts similarity index 100% rename from src/lib/hf/getSpaces.ts rename to packages/app/src/lib/hf/getSpaces.ts diff --git a/src/lib/hf/parseHuggingFaceHubId.test.ts b/packages/app/src/lib/hf/parseHuggingFaceHubId.test.ts similarity index 100% rename from src/lib/hf/parseHuggingFaceHubId.test.ts rename to packages/app/src/lib/hf/parseHuggingFaceHubId.test.ts diff --git a/src/lib/hf/parseHuggingFaceHubId.ts b/packages/app/src/lib/hf/parseHuggingFaceHubId.ts similarity index 100% rename from src/lib/hf/parseHuggingFaceHubId.ts rename to packages/app/src/lib/hf/parseHuggingFaceHubId.ts diff --git a/src/lib/hf/runSpace.ts b/packages/app/src/lib/hf/runSpace.ts similarity index 100% rename from src/lib/hf/runSpace.ts rename to packages/app/src/lib/hf/runSpace.ts diff --git a/src/lib/hf/types.ts b/packages/app/src/lib/hf/types.ts similarity index 100% rename from src/lib/hf/types.ts rename to packages/app/src/lib/hf/types.ts diff --git a/src/lib/hf/useMyGradioSpaces.ts b/packages/app/src/lib/hf/useMyGradioSpaces.ts similarity index 100% rename from src/lib/hf/useMyGradioSpaces.ts rename to packages/app/src/lib/hf/useMyGradioSpaces.ts diff --git a/src/lib/hooks/README.md b/packages/app/src/lib/hooks/README.md similarity index 100% rename from src/lib/hooks/README.md rename to packages/app/src/lib/hooks/README.md diff --git a/src/lib/hooks/index.ts b/packages/app/src/lib/hooks/index.ts similarity index 100% rename from src/lib/hooks/index.ts rename to packages/app/src/lib/hooks/index.ts diff --git a/src/lib/hooks/useAnimationFrame.ts b/packages/app/src/lib/hooks/useAnimationFrame.ts similarity index 100% rename from src/lib/hooks/useAnimationFrame.ts rename to packages/app/src/lib/hooks/useAnimationFrame.ts diff --git a/src/lib/hooks/useDebounce.ts b/packages/app/src/lib/hooks/useDebounce.ts similarity index 100% rename from src/lib/hooks/useDebounce.ts rename to packages/app/src/lib/hooks/useDebounce.ts diff --git a/src/lib/hooks/useFullscreenStatus.ts b/packages/app/src/lib/hooks/useFullscreenStatus.ts similarity index 100% rename from src/lib/hooks/useFullscreenStatus.ts rename to packages/app/src/lib/hooks/useFullscreenStatus.ts diff --git a/src/lib/hooks/useOpenFilePicker.ts b/packages/app/src/lib/hooks/useOpenFilePicker.ts similarity index 100% rename from src/lib/hooks/useOpenFilePicker.ts rename to packages/app/src/lib/hooks/useOpenFilePicker.ts diff --git a/src/lib/hooks/usePerformanceMeter.ts b/packages/app/src/lib/hooks/usePerformanceMeter.ts similarity index 100% rename from src/lib/hooks/usePerformanceMeter.ts rename to packages/app/src/lib/hooks/usePerformanceMeter.ts diff --git a/src/lib/hooks/useQueryStringParams.ts b/packages/app/src/lib/hooks/useQueryStringParams.ts similarity index 100% rename from src/lib/hooks/useQueryStringParams.ts rename to packages/app/src/lib/hooks/useQueryStringParams.ts diff --git a/src/lib/hooks/useRequestAnimationFrame.ts b/packages/app/src/lib/hooks/useRequestAnimationFrame.ts similarity index 100% rename from src/lib/hooks/useRequestAnimationFrame.ts rename to packages/app/src/lib/hooks/useRequestAnimationFrame.ts diff --git a/src/lib/hooks/useTitle.ts b/packages/app/src/lib/hooks/useTitle.ts similarity index 100% rename from src/lib/hooks/useTitle.ts rename to packages/app/src/lib/hooks/useTitle.ts diff --git a/src/lib/kdenlive/README.md b/packages/app/src/lib/kdenlive/README.md similarity index 100% rename from src/lib/kdenlive/README.md rename to packages/app/src/lib/kdenlive/README.md diff --git a/src/lib/kdenlive/entry.ts b/packages/app/src/lib/kdenlive/entry.ts similarity index 100% rename from src/lib/kdenlive/entry.ts rename to packages/app/src/lib/kdenlive/entry.ts diff --git a/src/lib/kdenlive/index.ts b/packages/app/src/lib/kdenlive/index.ts similarity index 100% rename from src/lib/kdenlive/index.ts rename to packages/app/src/lib/kdenlive/index.ts diff --git a/src/lib/kdenlive/kdenlive.ts b/packages/app/src/lib/kdenlive/kdenlive.ts similarity index 100% rename from src/lib/kdenlive/kdenlive.ts rename to packages/app/src/lib/kdenlive/kdenlive.ts diff --git a/src/lib/kdenlive/makeIDGen.ts b/packages/app/src/lib/kdenlive/makeIDGen.ts similarity index 100% rename from src/lib/kdenlive/makeIDGen.ts rename to packages/app/src/lib/kdenlive/makeIDGen.ts diff --git a/src/lib/kdenlive/playlist.ts b/packages/app/src/lib/kdenlive/playlist.ts similarity index 100% rename from src/lib/kdenlive/playlist.ts rename to packages/app/src/lib/kdenlive/playlist.ts diff --git a/src/lib/kdenlive/producer.ts b/packages/app/src/lib/kdenlive/producer.ts similarity index 100% rename from src/lib/kdenlive/producer.ts rename to packages/app/src/lib/kdenlive/producer.ts diff --git a/src/lib/kdenlive/producer_original.ts b/packages/app/src/lib/kdenlive/producer_original.ts similarity index 100% rename from src/lib/kdenlive/producer_original.ts rename to packages/app/src/lib/kdenlive/producer_original.ts diff --git a/src/lib/kdenlive/tractor.ts b/packages/app/src/lib/kdenlive/tractor.ts similarity index 100% rename from src/lib/kdenlive/tractor.ts rename to packages/app/src/lib/kdenlive/tractor.ts diff --git a/src/lib/utils/addBase64Header.ts b/packages/app/src/lib/utils/addBase64Header.ts similarity index 100% rename from src/lib/utils/addBase64Header.ts rename to packages/app/src/lib/utils/addBase64Header.ts diff --git a/src/lib/utils/base64DataUriToBlob.test.ts b/packages/app/src/lib/utils/base64DataUriToBlob.test.ts similarity index 100% rename from src/lib/utils/base64DataUriToBlob.test.ts rename to packages/app/src/lib/utils/base64DataUriToBlob.test.ts diff --git a/src/lib/utils/base64DataUriToBlob.ts b/packages/app/src/lib/utils/base64DataUriToBlob.ts similarity index 100% rename from src/lib/utils/base64DataUriToBlob.ts rename to packages/app/src/lib/utils/base64DataUriToBlob.ts diff --git a/src/lib/utils/base64DataUriToFile.ts b/packages/app/src/lib/utils/base64DataUriToFile.ts similarity index 100% rename from src/lib/utils/base64DataUriToFile.ts rename to packages/app/src/lib/utils/base64DataUriToFile.ts diff --git a/src/lib/utils/base64DataUriToUint8Array.ts b/packages/app/src/lib/utils/base64DataUriToUint8Array.ts similarity index 100% rename from src/lib/utils/base64DataUriToUint8Array.ts rename to packages/app/src/lib/utils/base64DataUriToUint8Array.ts diff --git a/src/lib/utils/blobToBase64DataUri.ts b/packages/app/src/lib/utils/blobToBase64DataUri.ts similarity index 100% rename from src/lib/utils/blobToBase64DataUri.ts rename to packages/app/src/lib/utils/blobToBase64DataUri.ts diff --git a/src/lib/utils/cn.test.ts b/packages/app/src/lib/utils/cn.test.ts similarity index 100% rename from src/lib/utils/cn.test.ts rename to packages/app/src/lib/utils/cn.test.ts diff --git a/src/lib/utils/cn.ts b/packages/app/src/lib/utils/cn.ts similarity index 100% rename from src/lib/utils/cn.ts rename to packages/app/src/lib/utils/cn.ts diff --git a/src/lib/utils/convertToJpeg.ts b/packages/app/src/lib/utils/convertToJpeg.ts similarity index 100% rename from src/lib/utils/convertToJpeg.ts rename to packages/app/src/lib/utils/convertToJpeg.ts diff --git a/src/lib/utils/debounceAsync.ts b/packages/app/src/lib/utils/debounceAsync.ts similarity index 100% rename from src/lib/utils/debounceAsync.ts rename to packages/app/src/lib/utils/debounceAsync.ts diff --git a/src/lib/utils/debounceSync.ts b/packages/app/src/lib/utils/debounceSync.ts similarity index 100% rename from src/lib/utils/debounceSync.ts rename to packages/app/src/lib/utils/debounceSync.ts diff --git a/src/lib/utils/decodeOutput.ts b/packages/app/src/lib/utils/decodeOutput.ts similarity index 100% rename from src/lib/utils/decodeOutput.ts rename to packages/app/src/lib/utils/decodeOutput.ts diff --git a/src/lib/utils/fetchContentToBase64.ts b/packages/app/src/lib/utils/fetchContentToBase64.ts similarity index 100% rename from src/lib/utils/fetchContentToBase64.ts rename to packages/app/src/lib/utils/fetchContentToBase64.ts diff --git a/src/lib/utils/findClosest.ts b/packages/app/src/lib/utils/findClosest.ts similarity index 100% rename from src/lib/utils/findClosest.ts rename to packages/app/src/lib/utils/findClosest.ts diff --git a/src/lib/utils/formatDuration.test.ts b/packages/app/src/lib/utils/formatDuration.test.ts similarity index 100% rename from src/lib/utils/formatDuration.test.ts rename to packages/app/src/lib/utils/formatDuration.test.ts diff --git a/src/lib/utils/formatDuration.ts b/packages/app/src/lib/utils/formatDuration.ts similarity index 100% rename from src/lib/utils/formatDuration.ts rename to packages/app/src/lib/utils/formatDuration.ts diff --git a/src/lib/utils/formatSegmentForExport.test.ts b/packages/app/src/lib/utils/formatSegmentForExport.test.ts similarity index 100% rename from src/lib/utils/formatSegmentForExport.test.ts rename to packages/app/src/lib/utils/formatSegmentForExport.test.ts diff --git a/src/lib/utils/formatSegmentForExport.ts b/packages/app/src/lib/utils/formatSegmentForExport.ts similarity index 100% rename from src/lib/utils/formatSegmentForExport.ts rename to packages/app/src/lib/utils/formatSegmentForExport.ts diff --git a/src/lib/utils/getTypeAndExtension.test.ts b/packages/app/src/lib/utils/getTypeAndExtension.test.ts similarity index 100% rename from src/lib/utils/getTypeAndExtension.test.ts rename to packages/app/src/lib/utils/getTypeAndExtension.test.ts diff --git a/src/lib/utils/getTypeAndExtension.ts b/packages/app/src/lib/utils/getTypeAndExtension.ts similarity index 100% rename from src/lib/utils/getTypeAndExtension.ts rename to packages/app/src/lib/utils/getTypeAndExtension.ts diff --git a/src/lib/utils/getValidBoolean.ts b/packages/app/src/lib/utils/getValidBoolean.ts similarity index 100% rename from src/lib/utils/getValidBoolean.ts rename to packages/app/src/lib/utils/getValidBoolean.ts diff --git a/src/lib/utils/getValidComfyWorkflowTemplate.test.ts b/packages/app/src/lib/utils/getValidComfyWorkflowTemplate.test.ts similarity index 100% rename from src/lib/utils/getValidComfyWorkflowTemplate.test.ts rename to packages/app/src/lib/utils/getValidComfyWorkflowTemplate.test.ts diff --git a/src/lib/utils/getValidComfyWorkflowTemplate.ts b/packages/app/src/lib/utils/getValidComfyWorkflowTemplate.ts similarity index 100% rename from src/lib/utils/getValidComfyWorkflowTemplate.ts rename to packages/app/src/lib/utils/getValidComfyWorkflowTemplate.ts diff --git a/src/lib/utils/getValidNumber.ts b/packages/app/src/lib/utils/getValidNumber.ts similarity index 100% rename from src/lib/utils/getValidNumber.ts rename to packages/app/src/lib/utils/getValidNumber.ts diff --git a/src/lib/utils/getValidString.ts b/packages/app/src/lib/utils/getValidString.ts similarity index 100% rename from src/lib/utils/getValidString.ts rename to packages/app/src/lib/utils/getValidString.ts diff --git a/src/lib/utils/index.ts b/packages/app/src/lib/utils/index.ts similarity index 100% rename from src/lib/utils/index.ts rename to packages/app/src/lib/utils/index.ts diff --git a/src/lib/utils/isValidNumber.ts b/packages/app/src/lib/utils/isValidNumber.ts similarity index 100% rename from src/lib/utils/isValidNumber.ts rename to packages/app/src/lib/utils/isValidNumber.ts diff --git a/src/lib/utils/parseComfyIcuAccelerator.ts b/packages/app/src/lib/utils/parseComfyIcuAccelerator.ts similarity index 100% rename from src/lib/utils/parseComfyIcuAccelerator.ts rename to packages/app/src/lib/utils/parseComfyIcuAccelerator.ts diff --git a/src/lib/utils/parsePdfToIndentedText.ts b/packages/app/src/lib/utils/parsePdfToIndentedText.ts similarity index 100% rename from src/lib/utils/parsePdfToIndentedText.ts rename to packages/app/src/lib/utils/parsePdfToIndentedText.ts diff --git a/src/lib/utils/sleep.ts b/packages/app/src/lib/utils/sleep.ts similarity index 100% rename from src/lib/utils/sleep.ts rename to packages/app/src/lib/utils/sleep.ts diff --git a/src/services/README.md b/packages/app/src/services/README.md similarity index 100% rename from src/services/README.md rename to packages/app/src/services/README.md diff --git a/src/services/assistant/askAssistant.ts b/packages/app/src/services/assistant/askAssistant.ts similarity index 100% rename from src/services/assistant/askAssistant.ts rename to packages/app/src/services/assistant/askAssistant.ts diff --git a/src/services/assistant/getDefaultAssistantState.ts b/packages/app/src/services/assistant/getDefaultAssistantState.ts similarity index 100% rename from src/services/assistant/getDefaultAssistantState.ts rename to packages/app/src/services/assistant/getDefaultAssistantState.ts diff --git a/src/services/assistant/parseRawInputToAction.ts b/packages/app/src/services/assistant/parseRawInputToAction.ts similarity index 100% rename from src/services/assistant/parseRawInputToAction.ts rename to packages/app/src/services/assistant/parseRawInputToAction.ts diff --git a/src/services/assistant/updateStoryAndScene.ts b/packages/app/src/services/assistant/updateStoryAndScene.ts similarity index 100% rename from src/services/assistant/updateStoryAndScene.ts rename to packages/app/src/services/assistant/updateStoryAndScene.ts diff --git a/src/services/assistant/useAssistant.ts b/packages/app/src/services/assistant/useAssistant.ts similarity index 100% rename from src/services/assistant/useAssistant.ts rename to packages/app/src/services/assistant/useAssistant.ts diff --git a/src/services/assistant/useVoiceAssistant.ts b/packages/app/src/services/assistant/useVoiceAssistant.ts similarity index 100% rename from src/services/assistant/useVoiceAssistant.ts rename to packages/app/src/services/assistant/useVoiceAssistant.ts diff --git a/src/services/audio/README.md b/packages/app/src/services/audio/README.md similarity index 100% rename from src/services/audio/README.md rename to packages/app/src/services/audio/README.md diff --git a/src/services/audio/analyzeAudio.ts b/packages/app/src/services/audio/analyzeAudio.ts similarity index 100% rename from src/services/audio/analyzeAudio.ts rename to packages/app/src/services/audio/analyzeAudio.ts diff --git a/src/services/audio/detectBPM.ts b/packages/app/src/services/audio/detectBPM.ts similarity index 100% rename from src/services/audio/detectBPM.ts rename to packages/app/src/services/audio/detectBPM.ts diff --git a/src/services/audio/getDefaultAudioState.ts b/packages/app/src/services/audio/getDefaultAudioState.ts similarity index 100% rename from src/services/audio/getDefaultAudioState.ts rename to packages/app/src/services/audio/getDefaultAudioState.ts diff --git a/src/services/audio/startAudioSourceNode.ts b/packages/app/src/services/audio/startAudioSourceNode.ts similarity index 100% rename from src/services/audio/startAudioSourceNode.ts rename to packages/app/src/services/audio/startAudioSourceNode.ts diff --git a/src/services/audio/useAudio.ts b/packages/app/src/services/audio/useAudio.ts similarity index 100% rename from src/services/audio/useAudio.ts rename to packages/app/src/services/audio/useAudio.ts diff --git a/src/services/autocomplete/extractCaptionFromFrameMoondream.ts b/packages/app/src/services/autocomplete/extractCaptionFromFrameMoondream.ts similarity index 100% rename from src/services/autocomplete/extractCaptionFromFrameMoondream.ts rename to packages/app/src/services/autocomplete/extractCaptionFromFrameMoondream.ts diff --git a/src/services/autocomplete/extractCaptionsFromFrames.ts b/packages/app/src/services/autocomplete/extractCaptionsFromFrames.ts similarity index 100% rename from src/services/autocomplete/extractCaptionsFromFrames.ts rename to packages/app/src/services/autocomplete/extractCaptionsFromFrames.ts diff --git a/src/services/autocomplete/getDefaultAutocompleteState.ts b/packages/app/src/services/autocomplete/getDefaultAutocompleteState.ts similarity index 100% rename from src/services/autocomplete/getDefaultAutocompleteState.ts rename to packages/app/src/services/autocomplete/getDefaultAutocompleteState.ts diff --git a/src/services/autocomplete/types.ts b/packages/app/src/services/autocomplete/types.ts similarity index 100% rename from src/services/autocomplete/types.ts rename to packages/app/src/services/autocomplete/types.ts diff --git a/src/services/autocomplete/useAutocomplete.ts b/packages/app/src/services/autocomplete/useAutocomplete.ts similarity index 100% rename from src/services/autocomplete/useAutocomplete.ts rename to packages/app/src/services/autocomplete/useAutocomplete.ts diff --git a/src/services/broadcast/constants.ts b/packages/app/src/services/broadcast/constants.ts similarity index 100% rename from src/services/broadcast/constants.ts rename to packages/app/src/services/broadcast/constants.ts diff --git a/src/services/broadcast/getDefaultBroadcastState.ts b/packages/app/src/services/broadcast/getDefaultBroadcastState.ts similarity index 100% rename from src/services/broadcast/getDefaultBroadcastState.ts rename to packages/app/src/services/broadcast/getDefaultBroadcastState.ts diff --git a/src/services/broadcast/useBroadcast.ts b/packages/app/src/services/broadcast/useBroadcast.ts similarity index 100% rename from src/services/broadcast/useBroadcast.ts rename to packages/app/src/services/broadcast/useBroadcast.ts diff --git a/src/services/debug.ts b/packages/app/src/services/debug.ts similarity index 100% rename from src/services/debug.ts rename to packages/app/src/services/debug.ts diff --git a/src/services/editors/entity-editor/getDefaultEntityEditorState.ts b/packages/app/src/services/editors/entity-editor/getDefaultEntityEditorState.ts similarity index 100% rename from src/services/editors/entity-editor/getDefaultEntityEditorState.ts rename to packages/app/src/services/editors/entity-editor/getDefaultEntityEditorState.ts diff --git a/src/services/editors/entity-editor/useEntityEditor.ts b/packages/app/src/services/editors/entity-editor/useEntityEditor.ts similarity index 100% rename from src/services/editors/entity-editor/useEntityEditor.ts rename to packages/app/src/services/editors/entity-editor/useEntityEditor.ts diff --git a/src/services/editors/filter-editor/README.md b/packages/app/src/services/editors/filter-editor/README.md similarity index 100% rename from src/services/editors/filter-editor/README.md rename to packages/app/src/services/editors/filter-editor/README.md diff --git a/src/services/editors/filter-editor/demo.ts b/packages/app/src/services/editors/filter-editor/demo.ts similarity index 100% rename from src/services/editors/filter-editor/demo.ts rename to packages/app/src/services/editors/filter-editor/demo.ts diff --git a/src/services/editors/filter-editor/filters/analogLens.ts b/packages/app/src/services/editors/filter-editor/filters/analogLens.ts similarity index 100% rename from src/services/editors/filter-editor/filters/analogLens.ts rename to packages/app/src/services/editors/filter-editor/filters/analogLens.ts diff --git a/src/services/editors/filter-editor/filters/cinematic.ts b/packages/app/src/services/editors/filter-editor/filters/cinematic.ts similarity index 100% rename from src/services/editors/filter-editor/filters/cinematic.ts rename to packages/app/src/services/editors/filter-editor/filters/cinematic.ts diff --git a/src/services/editors/filter-editor/filters/colorMapping.ts b/packages/app/src/services/editors/filter-editor/filters/colorMapping.ts similarity index 100% rename from src/services/editors/filter-editor/filters/colorMapping.ts rename to packages/app/src/services/editors/filter-editor/filters/colorMapping.ts diff --git a/src/services/editors/filter-editor/filters/colorTemperature.ts b/packages/app/src/services/editors/filter-editor/filters/colorTemperature.ts similarity index 100% rename from src/services/editors/filter-editor/filters/colorTemperature.ts rename to packages/app/src/services/editors/filter-editor/filters/colorTemperature.ts diff --git a/src/services/editors/filter-editor/filters/crossProcessing.ts b/packages/app/src/services/editors/filter-editor/filters/crossProcessing.ts similarity index 100% rename from src/services/editors/filter-editor/filters/crossProcessing.ts rename to packages/app/src/services/editors/filter-editor/filters/crossProcessing.ts diff --git a/src/services/editors/filter-editor/filters/filmDegradation.ts b/packages/app/src/services/editors/filter-editor/filters/filmDegradation.ts similarity index 100% rename from src/services/editors/filter-editor/filters/filmDegradation.ts rename to packages/app/src/services/editors/filter-editor/filters/filmDegradation.ts diff --git a/src/services/editors/filter-editor/filters/index.ts b/packages/app/src/services/editors/filter-editor/filters/index.ts similarity index 100% rename from src/services/editors/filter-editor/filters/index.ts rename to packages/app/src/services/editors/filter-editor/filters/index.ts diff --git a/src/services/editors/filter-editor/filters/infrared.ts b/packages/app/src/services/editors/filter-editor/filters/infrared.ts similarity index 100% rename from src/services/editors/filter-editor/filters/infrared.ts rename to packages/app/src/services/editors/filter-editor/filters/infrared.ts diff --git a/src/services/editors/filter-editor/filters/lomography.ts b/packages/app/src/services/editors/filter-editor/filters/lomography.ts similarity index 100% rename from src/services/editors/filter-editor/filters/lomography.ts rename to packages/app/src/services/editors/filter-editor/filters/lomography.ts diff --git a/src/services/editors/filter-editor/filters/splitToning.ts b/packages/app/src/services/editors/filter-editor/filters/splitToning.ts similarity index 100% rename from src/services/editors/filter-editor/filters/splitToning.ts rename to packages/app/src/services/editors/filter-editor/filters/splitToning.ts diff --git a/src/services/editors/filter-editor/filters/toneMapping.ts b/packages/app/src/services/editors/filter-editor/filters/toneMapping.ts similarity index 100% rename from src/services/editors/filter-editor/filters/toneMapping.ts rename to packages/app/src/services/editors/filter-editor/filters/toneMapping.ts diff --git a/src/services/editors/filter-editor/filters/vintageFilm.ts b/packages/app/src/services/editors/filter-editor/filters/vintageFilm.ts similarity index 100% rename from src/services/editors/filter-editor/filters/vintageFilm.ts rename to packages/app/src/services/editors/filter-editor/filters/vintageFilm.ts diff --git a/src/services/editors/filter-editor/getDefaultFilterEditorState.ts b/packages/app/src/services/editors/filter-editor/getDefaultFilterEditorState.ts similarity index 100% rename from src/services/editors/filter-editor/getDefaultFilterEditorState.ts rename to packages/app/src/services/editors/filter-editor/getDefaultFilterEditorState.ts diff --git a/src/services/editors/filter-editor/runFilterPipeline.ts b/packages/app/src/services/editors/filter-editor/runFilterPipeline.ts similarity index 100% rename from src/services/editors/filter-editor/runFilterPipeline.ts rename to packages/app/src/services/editors/filter-editor/runFilterPipeline.ts diff --git a/src/services/editors/filter-editor/useFilterEditor.ts b/packages/app/src/services/editors/filter-editor/useFilterEditor.ts similarity index 100% rename from src/services/editors/filter-editor/useFilterEditor.ts rename to packages/app/src/services/editors/filter-editor/useFilterEditor.ts diff --git a/src/services/editors/getDefaultEditorsState.ts b/packages/app/src/services/editors/getDefaultEditorsState.ts similarity index 100% rename from src/services/editors/getDefaultEditorsState.ts rename to packages/app/src/services/editors/getDefaultEditorsState.ts diff --git a/src/services/editors/index.ts b/packages/app/src/services/editors/index.ts similarity index 100% rename from src/services/editors/index.ts rename to packages/app/src/services/editors/index.ts diff --git a/src/services/editors/project-editor/getDefaultProjectEditorState.ts b/packages/app/src/services/editors/project-editor/getDefaultProjectEditorState.ts similarity index 100% rename from src/services/editors/project-editor/getDefaultProjectEditorState.ts rename to packages/app/src/services/editors/project-editor/getDefaultProjectEditorState.ts diff --git a/src/services/editors/project-editor/useProjectEditor.ts b/packages/app/src/services/editors/project-editor/useProjectEditor.ts similarity index 100% rename from src/services/editors/project-editor/useProjectEditor.ts rename to packages/app/src/services/editors/project-editor/useProjectEditor.ts diff --git a/src/services/editors/script-editor/getDefaultScriptEditorState.ts b/packages/app/src/services/editors/script-editor/getDefaultScriptEditorState.ts similarity index 100% rename from src/services/editors/script-editor/getDefaultScriptEditorState.ts rename to packages/app/src/services/editors/script-editor/getDefaultScriptEditorState.ts diff --git a/src/services/editors/script-editor/useScriptEditor.ts b/packages/app/src/services/editors/script-editor/useScriptEditor.ts similarity index 100% rename from src/services/editors/script-editor/useScriptEditor.ts rename to packages/app/src/services/editors/script-editor/useScriptEditor.ts diff --git a/src/services/editors/segment-editor/getDefaultSegmentEditorState.ts b/packages/app/src/services/editors/segment-editor/getDefaultSegmentEditorState.ts similarity index 100% rename from src/services/editors/segment-editor/getDefaultSegmentEditorState.ts rename to packages/app/src/services/editors/segment-editor/getDefaultSegmentEditorState.ts diff --git a/src/services/editors/segment-editor/useSegmentEditor.ts b/packages/app/src/services/editors/segment-editor/useSegmentEditor.ts similarity index 100% rename from src/services/editors/segment-editor/useSegmentEditor.ts rename to packages/app/src/services/editors/segment-editor/useSegmentEditor.ts diff --git a/src/services/editors/useEditors.ts b/packages/app/src/services/editors/useEditors.ts similarity index 100% rename from src/services/editors/useEditors.ts rename to packages/app/src/services/editors/useEditors.ts diff --git a/src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts b/packages/app/src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts similarity index 100% rename from src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts rename to packages/app/src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts diff --git a/src/services/editors/workflow-editor/useDynamicWorkflows.ts b/packages/app/src/services/editors/workflow-editor/useDynamicWorkflows.ts similarity index 100% rename from src/services/editors/workflow-editor/useDynamicWorkflows.ts rename to packages/app/src/services/editors/workflow-editor/useDynamicWorkflows.ts diff --git a/src/services/editors/workflow-editor/useWorkflowEditor.ts b/packages/app/src/services/editors/workflow-editor/useWorkflowEditor.ts similarity index 100% rename from src/services/editors/workflow-editor/useWorkflowEditor.ts rename to packages/app/src/services/editors/workflow-editor/useWorkflowEditor.ts diff --git a/src/services/editors/workflow-editor/workflows/_documentation_/demo_examples.ts b/packages/app/src/services/editors/workflow-editor/workflows/_documentation_/demo_examples.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/_documentation_/demo_examples.ts rename to packages/app/src/services/editors/workflow-editor/workflows/_documentation_/demo_examples.ts diff --git a/src/services/editors/workflow-editor/workflows/aitube/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/aitube/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/aitube/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/aitube/index.ts diff --git a/src/services/editors/workflow-editor/workflows/anthropic/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/anthropic/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/anthropic/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/anthropic/index.ts diff --git a/src/services/editors/workflow-editor/workflows/cohere/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/cohere/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/cohere/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/cohere/index.ts diff --git a/src/services/editors/workflow-editor/workflows/comfydeploy/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/comfydeploy/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/comfydeploy/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/comfydeploy/index.ts diff --git a/src/services/editors/workflow-editor/workflows/comfyicu/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/comfyicu/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/comfyicu/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/comfyicu/index.ts diff --git a/src/services/editors/workflow-editor/workflows/comfyui/getComfyWorkflow.ts b/packages/app/src/services/editors/workflow-editor/workflows/comfyui/getComfyWorkflow.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/comfyui/getComfyWorkflow.ts rename to packages/app/src/services/editors/workflow-editor/workflows/comfyui/getComfyWorkflow.ts diff --git a/src/services/editors/workflow-editor/workflows/comfyui/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/comfyui/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/comfyui/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/comfyui/index.ts diff --git a/src/services/editors/workflow-editor/workflows/common/comfyui/flux_plus_ultimatesdupscale.ts b/packages/app/src/services/editors/workflow-editor/workflows/common/comfyui/flux_plus_ultimatesdupscale.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/common/comfyui/flux_plus_ultimatesdupscale.ts rename to packages/app/src/services/editors/workflow-editor/workflows/common/comfyui/flux_plus_ultimatesdupscale.ts diff --git a/src/services/editors/workflow-editor/workflows/common/comfyui/text_to_image_demo_workflow.ts b/packages/app/src/services/editors/workflow-editor/workflows/common/comfyui/text_to_image_demo_workflow.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/common/comfyui/text_to_image_demo_workflow.ts rename to packages/app/src/services/editors/workflow-editor/workflows/common/comfyui/text_to_image_demo_workflow.ts diff --git a/src/services/editors/workflow-editor/workflows/common/defaultValues.ts b/packages/app/src/services/editors/workflow-editor/workflows/common/defaultValues.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/common/defaultValues.ts rename to packages/app/src/services/editors/workflow-editor/workflows/common/defaultValues.ts diff --git a/src/services/editors/workflow-editor/workflows/common/types.ts b/packages/app/src/services/editors/workflow-editor/workflows/common/types.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/common/types.ts rename to packages/app/src/services/editors/workflow-editor/workflows/common/types.ts diff --git a/src/services/editors/workflow-editor/workflows/elevenlabs/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/elevenlabs/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/elevenlabs/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/elevenlabs/index.ts diff --git a/src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts b/packages/app/src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts rename to packages/app/src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts diff --git a/src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts b/packages/app/src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts rename to packages/app/src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts diff --git a/src/services/editors/workflow-editor/workflows/falai/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/falai/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/falai/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/falai/index.ts diff --git a/src/services/editors/workflow-editor/workflows/fireworksai/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/fireworksai/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/fireworksai/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/fireworksai/index.ts diff --git a/src/services/editors/workflow-editor/workflows/google/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/google/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/google/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/google/index.ts diff --git a/src/services/editors/workflow-editor/workflows/groq/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/groq/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/groq/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/groq/index.ts diff --git a/src/services/editors/workflow-editor/workflows/huggingface/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/huggingface/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/huggingface/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/huggingface/index.ts diff --git a/src/services/editors/workflow-editor/workflows/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/index.ts diff --git a/src/services/editors/workflow-editor/workflows/mistralai/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/mistralai/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/mistralai/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/mistralai/index.ts diff --git a/src/services/editors/workflow-editor/workflows/openai/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/openai/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/openai/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/openai/index.ts diff --git a/src/services/editors/workflow-editor/workflows/openart/samples/openart_workflow.json b/packages/app/src/services/editors/workflow-editor/workflows/openart/samples/openart_workflow.json similarity index 100% rename from src/services/editors/workflow-editor/workflows/openart/samples/openart_workflow.json rename to packages/app/src/services/editors/workflow-editor/workflows/openart/samples/openart_workflow.json diff --git a/src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts b/packages/app/src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts rename to packages/app/src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts diff --git a/src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts b/packages/app/src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts rename to packages/app/src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts diff --git a/src/services/editors/workflow-editor/workflows/replicate/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/replicate/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/replicate/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/replicate/index.ts diff --git a/src/services/editors/workflow-editor/workflows/stabilityai/index.ts b/packages/app/src/services/editors/workflow-editor/workflows/stabilityai/index.ts similarity index 100% rename from src/services/editors/workflow-editor/workflows/stabilityai/index.ts rename to packages/app/src/services/editors/workflow-editor/workflows/stabilityai/index.ts diff --git a/src/services/index.ts b/packages/app/src/services/index.ts similarity index 100% rename from src/services/index.ts rename to packages/app/src/services/index.ts diff --git a/src/services/inputs/getDefaultInputsState.ts b/packages/app/src/services/inputs/getDefaultInputsState.ts similarity index 100% rename from src/services/inputs/getDefaultInputsState.ts rename to packages/app/src/services/inputs/getDefaultInputsState.ts diff --git a/src/services/inputs/types.ts b/packages/app/src/services/inputs/types.ts similarity index 100% rename from src/services/inputs/types.ts rename to packages/app/src/services/inputs/types.ts diff --git a/src/services/inputs/useInputs.ts b/packages/app/src/services/inputs/useInputs.ts similarity index 100% rename from src/services/inputs/useInputs.ts rename to packages/app/src/services/inputs/useInputs.ts diff --git a/src/services/io/createFullVideo.ts b/packages/app/src/services/io/createFullVideo.ts similarity index 100% rename from src/services/io/createFullVideo.ts rename to packages/app/src/services/io/createFullVideo.ts diff --git a/src/services/io/extractFramesFromVideo.ts b/packages/app/src/services/io/extractFramesFromVideo.ts similarity index 100% rename from src/services/io/extractFramesFromVideo.ts rename to packages/app/src/services/io/extractFramesFromVideo.ts diff --git a/src/services/io/extractScenesFromVideo.ts b/packages/app/src/services/io/extractScenesFromVideo.ts similarity index 100% rename from src/services/io/extractScenesFromVideo.ts rename to packages/app/src/services/io/extractScenesFromVideo.ts diff --git a/src/services/io/ffmpegUtils.ts b/packages/app/src/services/io/ffmpegUtils.ts similarity index 100% rename from src/services/io/ffmpegUtils.ts rename to packages/app/src/services/io/ffmpegUtils.ts diff --git a/src/services/io/fileDataToBase64.ts b/packages/app/src/services/io/fileDataToBase64.ts similarity index 100% rename from src/services/io/fileDataToBase64.ts rename to packages/app/src/services/io/fileDataToBase64.ts diff --git a/src/services/io/fix-xenova-transformers.d.ts b/packages/app/src/services/io/fix-xenova-transformers.d.ts similarity index 100% rename from src/services/io/fix-xenova-transformers.d.ts rename to packages/app/src/services/io/fix-xenova-transformers.d.ts diff --git a/src/services/io/getDefaultIOState.ts b/packages/app/src/services/io/getDefaultIOState.ts similarity index 100% rename from src/services/io/getDefaultIOState.ts rename to packages/app/src/services/io/getDefaultIOState.ts diff --git a/src/services/io/imageCaptioning.ts b/packages/app/src/services/io/imageCaptioning.ts similarity index 100% rename from src/services/io/imageCaptioning.ts rename to packages/app/src/services/io/imageCaptioning.ts diff --git a/src/services/io/parseFileIntoSegments.ts b/packages/app/src/services/io/parseFileIntoSegments.ts similarity index 100% rename from src/services/io/parseFileIntoSegments.ts rename to packages/app/src/services/io/parseFileIntoSegments.ts diff --git a/src/services/io/parseFileName.ts b/packages/app/src/services/io/parseFileName.ts similarity index 100% rename from src/services/io/parseFileName.ts rename to packages/app/src/services/io/parseFileName.ts diff --git a/src/services/io/parseFilesIntoSegments.ts b/packages/app/src/services/io/parseFilesIntoSegments.ts similarity index 100% rename from src/services/io/parseFilesIntoSegments.ts rename to packages/app/src/services/io/parseFilesIntoSegments.ts diff --git a/src/services/io/useIO.ts b/packages/app/src/services/io/useIO.ts similarity index 100% rename from src/services/io/useIO.ts rename to packages/app/src/services/io/useIO.ts diff --git a/src/services/metrics/constants.ts b/packages/app/src/services/metrics/constants.ts similarity index 100% rename from src/services/metrics/constants.ts rename to packages/app/src/services/metrics/constants.ts diff --git a/src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts b/packages/app/src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts similarity index 100% rename from src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts rename to packages/app/src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts diff --git a/src/services/metrics/getDefaultMetricsModelEstimations.ts b/packages/app/src/services/metrics/getDefaultMetricsModelEstimations.ts similarity index 100% rename from src/services/metrics/getDefaultMetricsModelEstimations.ts rename to packages/app/src/services/metrics/getDefaultMetricsModelEstimations.ts diff --git a/src/services/metrics/getDefaultMetricsModelStats.ts b/packages/app/src/services/metrics/getDefaultMetricsModelStats.ts similarity index 100% rename from src/services/metrics/getDefaultMetricsModelStats.ts rename to packages/app/src/services/metrics/getDefaultMetricsModelStats.ts diff --git a/src/services/metrics/getDefaultMetricsPerProvider.ts b/packages/app/src/services/metrics/getDefaultMetricsPerProvider.ts similarity index 100% rename from src/services/metrics/getDefaultMetricsPerProvider.ts rename to packages/app/src/services/metrics/getDefaultMetricsPerProvider.ts diff --git a/src/services/metrics/getDefaultMetricsState.ts b/packages/app/src/services/metrics/getDefaultMetricsState.ts similarity index 100% rename from src/services/metrics/getDefaultMetricsState.ts rename to packages/app/src/services/metrics/getDefaultMetricsState.ts diff --git a/src/services/metrics/types.ts b/packages/app/src/services/metrics/types.ts similarity index 100% rename from src/services/metrics/types.ts rename to packages/app/src/services/metrics/types.ts diff --git a/src/services/metrics/useMetrics.ts b/packages/app/src/services/metrics/useMetrics.ts similarity index 100% rename from src/services/metrics/useMetrics.ts rename to packages/app/src/services/metrics/useMetrics.ts diff --git a/src/services/mic/getDefaultMicState.ts b/packages/app/src/services/mic/getDefaultMicState.ts similarity index 100% rename from src/services/mic/getDefaultMicState.ts rename to packages/app/src/services/mic/getDefaultMicState.ts diff --git a/src/services/mic/useMic.ts b/packages/app/src/services/mic/useMic.ts similarity index 100% rename from src/services/mic/useMic.ts rename to packages/app/src/services/mic/useMic.ts diff --git a/src/services/monitor/README.md b/packages/app/src/services/monitor/README.md similarity index 100% rename from src/services/monitor/README.md rename to packages/app/src/services/monitor/README.md diff --git a/src/services/monitor/getDefaultMonitorState.ts b/packages/app/src/services/monitor/getDefaultMonitorState.ts similarity index 100% rename from src/services/monitor/getDefaultMonitorState.ts rename to packages/app/src/services/monitor/getDefaultMonitorState.ts diff --git a/src/services/monitor/useMonitor.ts b/packages/app/src/services/monitor/useMonitor.ts similarity index 100% rename from src/services/monitor/useMonitor.ts rename to packages/app/src/services/monitor/useMonitor.ts diff --git a/src/services/plugins/constants.ts b/packages/app/src/services/plugins/constants.ts similarity index 100% rename from src/services/plugins/constants.ts rename to packages/app/src/services/plugins/constants.ts diff --git a/src/services/plugins/fetchAndRun.ts b/packages/app/src/services/plugins/fetchAndRun.ts similarity index 100% rename from src/services/plugins/fetchAndRun.ts rename to packages/app/src/services/plugins/fetchAndRun.ts diff --git a/src/services/plugins/getDefaultPluginsState.ts b/packages/app/src/services/plugins/getDefaultPluginsState.ts similarity index 100% rename from src/services/plugins/getDefaultPluginsState.ts rename to packages/app/src/services/plugins/getDefaultPluginsState.ts diff --git a/src/services/plugins/usePlugins.ts b/packages/app/src/services/plugins/usePlugins.ts similarity index 100% rename from src/services/plugins/usePlugins.ts rename to packages/app/src/services/plugins/usePlugins.ts diff --git a/src/services/renderer/constants.ts b/packages/app/src/services/renderer/constants.ts similarity index 100% rename from src/services/renderer/constants.ts rename to packages/app/src/services/renderer/constants.ts diff --git a/src/services/renderer/getDefaultBufferedSegments.ts b/packages/app/src/services/renderer/getDefaultBufferedSegments.ts similarity index 100% rename from src/services/renderer/getDefaultBufferedSegments.ts rename to packages/app/src/services/renderer/getDefaultBufferedSegments.ts diff --git a/src/services/renderer/getDefaultRendererState.ts b/packages/app/src/services/renderer/getDefaultRendererState.ts similarity index 100% rename from src/services/renderer/getDefaultRendererState.ts rename to packages/app/src/services/renderer/getDefaultRendererState.ts diff --git a/src/services/renderer/getSegmentCacheKey.ts b/packages/app/src/services/renderer/getSegmentCacheKey.ts similarity index 100% rename from src/services/renderer/getSegmentCacheKey.ts rename to packages/app/src/services/renderer/getSegmentCacheKey.ts diff --git a/src/services/renderer/index.ts b/packages/app/src/services/renderer/index.ts similarity index 100% rename from src/services/renderer/index.ts rename to packages/app/src/services/renderer/index.ts diff --git a/src/services/renderer/useRenderLoop.ts b/packages/app/src/services/renderer/useRenderLoop.ts similarity index 100% rename from src/services/renderer/useRenderLoop.ts rename to packages/app/src/services/renderer/useRenderLoop.ts diff --git a/src/services/renderer/useRenderer.ts b/packages/app/src/services/renderer/useRenderer.ts similarity index 100% rename from src/services/renderer/useRenderer.ts rename to packages/app/src/services/renderer/useRenderer.ts diff --git a/src/services/resolver/constants.ts b/packages/app/src/services/resolver/constants.ts similarity index 100% rename from src/services/resolver/constants.ts rename to packages/app/src/services/resolver/constants.ts diff --git a/src/services/resolver/getDefaultResolverState.ts b/packages/app/src/services/resolver/getDefaultResolverState.ts similarity index 100% rename from src/services/resolver/getDefaultResolverState.ts rename to packages/app/src/services/resolver/getDefaultResolverState.ts diff --git a/src/services/resolver/useResolver.ts b/packages/app/src/services/resolver/useResolver.ts similarity index 100% rename from src/services/resolver/useResolver.ts rename to packages/app/src/services/resolver/useResolver.ts diff --git a/src/services/settings/getDefaultSettingsState.ts b/packages/app/src/services/settings/getDefaultSettingsState.ts similarity index 100% rename from src/services/settings/getDefaultSettingsState.ts rename to packages/app/src/services/settings/getDefaultSettingsState.ts diff --git a/src/services/settings/index.ts b/packages/app/src/services/settings/index.ts similarity index 100% rename from src/services/settings/index.ts rename to packages/app/src/services/settings/index.ts diff --git a/src/services/settings/useSettings.ts b/packages/app/src/services/settings/useSettings.ts similarity index 100% rename from src/services/settings/useSettings.ts rename to packages/app/src/services/settings/useSettings.ts diff --git a/src/services/settings/workflows/image.ts b/packages/app/src/services/settings/workflows/image.ts similarity index 100% rename from src/services/settings/workflows/image.ts rename to packages/app/src/services/settings/workflows/image.ts diff --git a/src/services/simulator/useDefaultSimulatorState.ts b/packages/app/src/services/simulator/useDefaultSimulatorState.ts similarity index 100% rename from src/services/simulator/useDefaultSimulatorState.ts rename to packages/app/src/services/simulator/useDefaultSimulatorState.ts diff --git a/src/services/simulator/useSimulator.ts b/packages/app/src/services/simulator/useSimulator.ts similarity index 100% rename from src/services/simulator/useSimulator.ts rename to packages/app/src/services/simulator/useSimulator.ts diff --git a/src/services/ui/getDefaultUIState.ts b/packages/app/src/services/ui/getDefaultUIState.ts similarity index 100% rename from src/services/ui/getDefaultUIState.ts rename to packages/app/src/services/ui/getDefaultUIState.ts diff --git a/src/services/ui/index.ts b/packages/app/src/services/ui/index.ts similarity index 100% rename from src/services/ui/index.ts rename to packages/app/src/services/ui/index.ts diff --git a/src/services/ui/theme.ts b/packages/app/src/services/ui/theme.ts similarity index 100% rename from src/services/ui/theme.ts rename to packages/app/src/services/ui/theme.ts diff --git a/src/services/ui/useTheme.ts b/packages/app/src/services/ui/useTheme.ts similarity index 100% rename from src/services/ui/useTheme.ts rename to packages/app/src/services/ui/useTheme.ts diff --git a/src/services/ui/useUI.ts b/packages/app/src/services/ui/useUI.ts similarity index 100% rename from src/services/ui/useUI.ts rename to packages/app/src/services/ui/useUI.ts diff --git a/src/services/windows/types.ts b/packages/app/src/services/windows/types.ts similarity index 100% rename from src/services/windows/types.ts rename to packages/app/src/services/windows/types.ts diff --git a/src/services/windows/useWindows.ts b/packages/app/src/services/windows/useWindows.ts similarity index 100% rename from src/services/windows/useWindows.ts rename to packages/app/src/services/windows/useWindows.ts diff --git a/tailwind.config.js b/packages/app/tailwind.config.js similarity index 100% rename from tailwind.config.js rename to packages/app/tailwind.config.js diff --git a/tests/examples.spec.txt b/packages/app/tests/examples.spec.txt similarity index 100% rename from tests/examples.spec.txt rename to packages/app/tests/examples.spec.txt diff --git a/tests/main.spec.ts b/packages/app/tests/main.spec.ts similarity index 100% rename from tests/main.spec.ts rename to packages/app/tests/main.spec.ts diff --git a/tsconfig.json b/packages/app/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/app/tsconfig.json diff --git a/vitest.config.mts b/packages/app/vitest.config.mts similarity index 100% rename from vitest.config.mts rename to packages/app/vitest.config.mts From cb0a7acde3ff8491bff1541b912e9411b35030a0 Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 14 Aug 2024 18:41:46 -0700 Subject: [PATCH 341/346] package rename and repathing --- LICENSE.txt => LICENSE.md | 0 package-lock.json | 20454 ------------------------------------ package.json | 2 +- packages/app/package.json | 2 +- 4 files changed, 2 insertions(+), 20456 deletions(-) rename LICENSE.txt => LICENSE.md (100%) delete mode 100644 package-lock.json diff --git a/LICENSE.txt b/LICENSE.md similarity index 100% rename from LICENSE.txt rename to LICENSE.md diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3c7f266c..00000000 --- a/package-lock.json +++ /dev/null @@ -1,20454 +0,0 @@ -{ - "name": "@clapper/monorepo", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@clapper/monorepo", - "version": "1.0.0", - "hasInstallScript": true, - "workspaces": [ - "packages/*" - ] - }, - "node_modules/@aitube/clap": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.2.3.tgz", - "integrity": "sha512-qT0wI6R5BrkIWDr1Dog/GPMYjKnwy5glwO3MibPcM0BWJVQlbj0cy0qbwH+wZPC1ZmRZnaJPlhCEj5e3/U6UsA==", - "license": "MIT", - "dependencies": { - "pure-uuid": "^1.8.1" - }, - "peerDependencies": { - "yaml": "^2.5.0" - } - }, - "node_modules/@aitube/clapper-services": { - "version": "0.2.3-2", - "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.2.3-2.tgz", - "integrity": "sha512-Qd6Riridk4FVcTjlscxw5wsbUgojwi1wkTIjlgPluhT5J5kLyEJQL/hmT2gBDBRsB4kyieVNZiGflgXnauDENw==", - "license": "MIT", - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/timeline": "0.2.3", - "@monaco-editor/react": "4.6.0", - "monaco-editor": "0.50.0", - "react": "*", - "react-dom": "*", - "zustand": "4.5.2" - } - }, - "node_modules/@aitube/timeline": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.2.3.tgz", - "integrity": "sha512-zr9G5t/koz/vwXxKHs2qFot5gSau72J+luTfBK0o1tgf/TK/+yP6ACO3QbO8kAmkqa6wtWuBHdVXkVceB8z7Rw==", - "license": "MIT", - "dependencies": { - "date-fns": "^3.6.0", - "react-virtualized-auto-sizer": "^1.0.24" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@radix-ui/react-slider": "^1.1.2", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.105.4", - "@react-three/fiber": "^8.16.2", - "clsx": "^2.1.1", - "react": "*", - "react-dom": "*", - "tailwind-merge": "^2.4.0", - "tailwindcss": "^3.4.6", - "three": "^0.164.1", - "zustand": "4.5.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@clapper/app": { - "resolved": "packages/app", - "link": true - }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.0.tgz", - "integrity": "sha512-GLJzso0M07ZncFkrJMIXVU4os6GFbPocD4g8fMQPMGJubf48FtGOsUORH2rtFdXPIPelz8SLBMn8ZRmOTwXm9Q==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", - "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", - "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=10.13", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", - "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", - "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", - "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", - "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", - "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", - "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", - "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", - "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", - "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.31", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", - "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", - "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", - "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", - "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.1.1" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", - "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", - "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", - "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==", - "license": "Apache-2.0" - }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "license": "MIT", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "license": "MIT", - "dependencies": { - "@monaco-editor/loader": "^1.4.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", - "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", - "license": "MIT", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", - "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", - "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", - "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", - "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", - "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-spring/animated": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.4.tgz", - "integrity": "sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==", - "license": "MIT", - "dependencies": { - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.4.tgz", - "integrity": "sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.4", - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.4.tgz", - "integrity": "sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==", - "license": "MIT" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.4.tgz", - "integrity": "sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==", - "license": "MIT", - "dependencies": { - "@react-spring/rafz": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.4.tgz", - "integrity": "sha512-HKUhrrvWW7F/MAroObOloqcYyFqsUHp1ANIDvPVxk9cSh7veW7gQbJm2Sc7Ka+L4gVJEwSkS+MRfr8kk+sRZBw==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.4", - "@react-spring/core": "~9.7.4", - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.4.tgz", - "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==", - "license": "MIT" - }, - "node_modules/@react-three/drei": { - "version": "9.109.5", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.5.tgz", - "integrity": "sha512-Ftw2d01N+83aXTOOMA5y8hF2KBU0w7gBEctyjeHJihUyRuLBdfcgfu5c1OhBjhrdy23ycSYRINaeLkqUBPDFxQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@mediapipe/tasks-vision": "0.10.8", - "@monogrid/gainmap-js": "^3.0.5", - "@react-spring/three": "~9.6.1", - "@use-gesture/react": "^10.2.24", - "camera-controls": "^2.4.2", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.28", - "glsl-noise": "^0.0.0", - "hls.js": "1.3.5", - "maath": "^0.10.7", - "meshline": "^3.1.6", - "react-composer": "^5.0.3", - "stats-gl": "^2.0.0", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.0", - "three-stdlib": "^2.29.9", - "troika-three-text": "^0.49.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.10.0", - "uuid": "^9.0.1", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=8.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/animated": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", - "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", - "license": "MIT", - "dependencies": { - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/core": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", - "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/rafz": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/rafz": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", - "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==", - "license": "MIT" - }, - "node_modules/@react-three/drei/node_modules/@react-spring/shared": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", - "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", - "license": "MIT", - "dependencies": { - "@react-spring/rafz": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", - "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/core": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/types": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", - "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==", - "license": "MIT" - }, - "node_modules/@react-three/drei/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.17.5", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.5.tgz", - "integrity": "sha512-7uqtTWQrNIKW6wbgF0CQiDuo7uHoRd96lGBKsdRa+j/s268kqO4MBsxynLUpg6F/+mir5SEt9zJ3Up+lOjz/dg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/debounce": "^1.2.1", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "debounce": "^1.2.1", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "license": "MIT" - }, - "node_modules/@types/debounce": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", - "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", - "license": "MIT" - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz", - "integrity": "sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.18.2" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/stats.js": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", - "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", - "license": "MIT" - }, - "node_modules/@types/three": { - "version": "0.167.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", - "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@tweenjs/tween.js": "~23.1.2", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/webxr": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", - "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==", - "license": "MIT" - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", - "license": "MIT" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "license": "MIT", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camera-controls": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", - "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/comfydeploy": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/comfydeploy/-/comfydeploy-0.0.21.tgz", - "integrity": "sha512-v5i6igitVWN6jmDlg35g8XyJuGsToD1sbhEZIz4nM3F6gSXZf2YjJzL/wzabsHlOtHhKsO/vdQAXuvO7/w8deQ==", - "license": "MIT", - "dependencies": { - "zod": "^3.22.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, - "node_modules/detect-gpu": { - "version": "5.0.43", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.43.tgz", - "integrity": "sha512-KVcUS/YzsZIBIACz6p2xpuBpAjaY4wiELImJ7M8rb9i16NE6frnVpSV/UBpkK6DYj4Wd3NJeE4sghcaypuM8bg==", - "license": "MIT", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", - "license": "Apache-2.0" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==", - "license": "SEE LICENSE IN LICENSE.txt" - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", - "license": "MIT" - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hls.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", - "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==", - "license": "Apache-2.0" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", - "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "license": "MIT", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "optional": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/monaco-editor": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", - "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz", - "integrity": "sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==", - "license": "MIT" - }, - "node_modules/onnxruntime-node": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz", - "integrity": "sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "onnxruntime-common": "1.18.0", - "tar": "^7.0.1" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "license": "MIT" - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC" - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "license": "Apache-2.0", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/pure-uuid": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/pure-uuid/-/pure-uuid-1.8.1.tgz", - "integrity": "sha512-PIwHXU7NZb/wTBwUfzCSjI85tfwx6DQOm74sRLtNLH8KHsFZEvAQbBQdz7E5ij8SNSv9WGdQPWiiM6NpNIeNfA==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-composer": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", - "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-error-boundary": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", - "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", - "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", - "license": "MIT", - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", - "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.0" - }, - "engines": { - "libvips": ">=8.15.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", - "license": "MIT" - }, - "node_modules/stats-gl": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", - "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", - "license": "MIT", - "dependencies": { - "@types/three": "^0.163.0" - } - }, - "node_modules/stats-gl/node_modules/@types/three": { - "version": "0.163.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", - "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "~23.1.1", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", - "license": "MIT" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/tailwind-merge": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", - "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", - "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "optional": true, - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/three": { - "version": "0.164.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.164.1.tgz", - "integrity": "sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==", - "license": "MIT" - }, - "node_modules/three-mesh-bvh": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", - "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", - "license": "MIT", - "peerDependencies": { - "three": ">= 0.151.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.2.tgz", - "integrity": "sha512-ZN25Na/Xg7APhGKwJ1zhGdhZDsDGGnnm1k5Z+9LLlnfsFye4jigvbN3eA/Ta8hQmBNmEHXoozpmpKK1x8dCePQ==", - "license": "MIT", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/troika-three-text": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", - "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", - "license": "MIT", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.49.0", - "troika-worker-utils": "^0.49.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", - "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", - "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==", - "license": "MIT" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "license": "MIT", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/undici-types": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", - "integrity": "sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==", - "license": "MIT" - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", - "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "packages/app": { - "name": "@clapper/app", - "version": "0.0.8", - "license": "GPL-3.0-only", - "dependencies": { - "@aitube/broadway": "0.2.3", - "@aitube/clap": "0.2.3", - "@aitube/clapper-services": "0.2.3-2", - "@aitube/client": "0.2.3", - "@aitube/engine": "0.2.3", - "@aitube/timeline": "0.2.3", - "@fal-ai/serverless-client": "^0.13.0", - "@ffmpeg/ffmpeg": "^0.12.10", - "@ffmpeg/util": "^0.12.1", - "@gradio/client": "^1.5.0", - "@huggingface/hub": "^0.15.1", - "@huggingface/inference": "^2.8.0", - "@langchain/anthropic": "^0.2.14", - "@langchain/cohere": "^0.2.2", - "@langchain/core": "^0.2.23", - "@langchain/google-vertexai": "^0.0.25", - "@langchain/groq": "^0.0.16", - "@langchain/mistralai": "^0.0.28", - "@langchain/openai": "^0.2.6", - "@monaco-editor/react": "^4.6.0", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-menubar": "^1.0.4", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-progress": "^1.0.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-tooltip": "^1.0.7", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.106.0", - "@react-three/fiber": "^8.16.6", - "@react-three/uikit": "^0.3.4", - "@react-three/uikit-lucide": "^0.3.4", - "@saintno/comfyui-sdk": "^0.1.11", - "@tailwindcss/container-queries": "^0.1.1", - "@types/dom-speech-recognition": "^0.0.4", - "@types/pngjs": "^6.0.5", - "@xenova/transformers": "github:xenova/transformers.js#v3", - "@xyflow/react": "^12.0.3", - "autoprefixer": "10.4.19", - "base64-arraybuffer": "^1.0.2", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^0.2.1", - "comfydeploy": "^0.0.21", - "date-fns": "^3.6.0", - "dotenv": "^16.4.5", - "fflate": "^0.8.2", - "fluent-ffmpeg": "^2.1.3", - "framer-motion": "11.1.7", - "fs-extra": "^11.2.0", - "is-hotkey": "^0.2.0", - "lucide-react": "^0.396.0", - "mediainfo.js": "^0.3.2", - "mlt-xml": "^2.0.2", - "monaco-editor": "^0.50.0", - "next": "^14.2.5", - "next-themes": "^0.3.0", - "pngjs": "^7.0.0", - "qs": "^6.12.1", - "query-string": "^9.0.0", - "react": "^18.3.1", - "react-device-frameset": "^1.3.4", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-drag-drop-files": "^2.3.10", - "react-error-boundary": "^4.0.13", - "react-hook-consent": "^3.5.3", - "react-hotkeys-hook": "^4.5.0", - "react-icons": "^5.2.1", - "react-markdown": "^9.0.1", - "react-reflex": "^4.2.6", - "react-speakup": "^1.0.0", - "remark-gfm": "^4.0.0", - "replicate": "^0.32.0", - "sharp": "0.33.4", - "sonner": "^1.5.0", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "three": "^0.164.1", - "ts-node": "^10.9.2", - "use-file-picker": "^2.1.2", - "usehooks-ts": "^2.14.0", - "uuid": "^9.0.1", - "web-audio-beat-detector": "^8.2.12", - "yaml": "^2.4.5", - "zustand": "4.5.2", - "zx": "^8.1.4" - }, - "devDependencies": { - "@electron-forge/cli": "^7.4.0", - "@electron-forge/maker-deb": "^7.4.0", - "@electron-forge/maker-dmg": "^7.4.0", - "@electron-forge/maker-rpm": "^7.4.0", - "@electron-forge/maker-squirrel": "^7.4.0", - "@electron-forge/maker-zip": "^7.4.0", - "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", - "@electron-forge/publisher-github": "^7.4.0", - "@playwright/test": "^1.45.1", - "@testing-library/react": "^16.0.0", - "@types/fluent-ffmpeg": "^2.1.24", - "@types/is-hotkey": "^0.1.10", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@types/uuid": "^9.0.8", - "@vitejs/plugin-react": "^4.3.1", - "@webgpu/types": "^0.1.44", - "electron": "^31.2.1", - "eslint": "^8", - "eslint-config-next": "14.2.5", - "eslint-config-prettier": "^9.1.0", - "jsdom": "^24.1.0", - "node-gyp": "^10.2.0", - "postcss": "^8", - "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.5", - "tailwind-scrollbar": "^3.1.0", - "tailwindcss": "^3.4.3", - "typescript": "^5.5.0", - "vitest": "^2.0.2" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-libvips-win32-ia32": "1.0.2", - "@img/sharp-libvips-win32-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "packages/app/node_modules/@aitube/broadway": { - "version": "0.2.3", - "license": "MIT", - "dependencies": { - "@datagica/parse-entities": "^0.3.0", - "@datagica/parse-names": "^0.0.8", - "indexeddb-fs": "^2.1.5" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/colors": "0.2.3" - } - }, - "packages/app/node_modules/@aitube/client": { - "version": "0.2.3", - "license": "MIT", - "dependencies": { - "query-string": "^9.0.0" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "packages/app/node_modules/@aitube/colors": { - "version": "0.2.3", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "packages/app/node_modules/@aitube/engine": { - "version": "0.2.3", - "license": "MIT", - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "packages/app/node_modules/@ampproject/remapping": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "packages/app/node_modules/@anthropic-ai/sdk": { - "version": "0.22.0", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "packages/app/node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.43", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/app/node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "packages/app/node_modules/@aws-crypto/crc32/node_modules/@aws-crypto/util": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "packages/app/node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "packages/app/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@aws-crypto/util": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/client-sagemaker": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "packages/app/node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/core": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "packages/app/node_modules/@aws-sdk/credential-providers": { - "version": "3.624.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/credential-provider-cognito-identity": "3.624.0", - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/protocol-http": { - "version": "3.374.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/protocol-http/node_modules/@smithy/protocol-http": { - "version": "1.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { - "version": "1.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4": { - "version": "3.374.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/signature-v4": "^1.0.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/signature-v4": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^1.1.0", - "@smithy/is-array-buffer": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "@smithy/util-middleware": "^1.1.0", - "@smithy/util-uri-escape": "^1.1.0", - "@smithy/util-utf8": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/types": { - "version": "1.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-middleware": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-uri-escape": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-utf8": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "packages/app/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "packages/app/node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.3.1" - } - }, - "packages/app/node_modules/@babel/code-frame": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/compat-data": { - "version": "7.25.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/core": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "packages/app/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/app/node_modules/@babel/generator": { - "version": "7.25.0", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/app/node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "packages/app/node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/helpers": { - "version": "7.25.0", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/highlight": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "packages/app/node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "packages/app/node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/app/node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/@babel/parser": { - "version": "7.25.3", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "packages/app/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "packages/app/node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "packages/app/node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "packages/app/node_modules/@babel/template": { - "version": "7.25.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/traverse": { - "version": "7.25.3", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@babel/types": { - "version": "7.25.2", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "cookie": "^0.5.0" - } - }, - "packages/app/node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "license": "ISC", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "packages/app/node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "license": "ISC", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "packages/app/node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "packages/app/node_modules/@datagica/fast-index": { - "version": "0.1.0", - "license": "GPL-3.0" - }, - "packages/app/node_modules/@datagica/parse-entities": { - "version": "0.3.0", - "license": "GPL-3.0", - "dependencies": { - "@datagica/treegram": "^0.3.0" - } - }, - "packages/app/node_modules/@datagica/parse-names": { - "version": "0.0.8", - "license": "GPL-3.0", - "dependencies": { - "@datagica/parse-entities": "^0.2.7" - } - }, - "packages/app/node_modules/@datagica/parse-names/node_modules/@datagica/fast-index": { - "version": "0.0.7", - "license": "GPL-3.0" - }, - "packages/app/node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities": { - "version": "0.2.8", - "license": "GPL-3.0", - "dependencies": { - "@datagica/treegram": "^0.2.8" - } - }, - "packages/app/node_modules/@datagica/parse-names/node_modules/@datagica/treegram": { - "version": "0.2.9", - "license": "GPL-3.0", - "dependencies": { - "@datagica/fast-index": "^0.0.7", - "@datagica/tokenize": "^0.0.2" - } - }, - "packages/app/node_modules/@datagica/tokenize": { - "version": "0.0.2", - "license": "GPL-3.0" - }, - "packages/app/node_modules/@datagica/treegram": { - "version": "0.3.0", - "license": "GPL-3.0", - "dependencies": { - "@datagica/fast-index": "^0.1.0", - "@datagica/tokenize": "^0.0.2" - } - }, - "packages/app/node_modules/@electron-forge/cli": { - "version": "7.4.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "MIT", - "dependencies": { - "@electron-forge/core": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@electron/get": "^3.0.0", - "chalk": "^4.0.0", - "commander": "^4.1.1", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "listr2": "^7.0.2", - "semver": "^7.2.1" - }, - "bin": { - "electron-forge": "dist/electron-forge.js", - "electron-forge-vscode-nix": "script/vscode.sh", - "electron-forge-vscode-win": "script/vscode.cmd" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/cli/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/core": { - "version": "7.4.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "MIT", - "dependencies": { - "@electron-forge/core-utils": "7.4.0", - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/plugin-base": "7.4.0", - "@electron-forge/publisher-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "@electron-forge/template-vite": "7.4.0", - "@electron-forge/template-vite-typescript": "7.4.0", - "@electron-forge/template-webpack": "7.4.0", - "@electron-forge/template-webpack-typescript": "7.4.0", - "@electron-forge/tracer": "7.4.0", - "@electron/get": "^3.0.0", - "@electron/packager": "^18.3.1", - "@electron/rebuild": "^3.2.10", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "fast-glob": "^3.2.7", - "filenamify": "^4.1.0", - "find-up": "^5.0.0", - "fs-extra": "^10.0.0", - "got": "^11.8.5", - "interpret": "^3.1.1", - "listr2": "^7.0.2", - "lodash": "^4.17.20", - "log-symbols": "^4.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "rechoir": "^0.8.0", - "resolve-package": "^1.0.1", - "semver": "^7.2.1", - "source-map-support": "^0.5.13", - "sudo-prompt": "^9.1.1", - "username": "^5.1.0", - "yarn-or-npm": "^3.0.1" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/core-utils": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron/rebuild": "^3.2.10", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "find-up": "^5.0.0", - "fs-extra": "^10.0.0", - "log-symbols": "^4.0.0", - "semver": "^7.2.1", - "yarn-or-npm": "^3.0.1" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/core-utils/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/core/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/maker-base": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/maker-base/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/maker-deb": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-debian": "^3.2.0" - } - }, - "packages/app/node_modules/@electron-forge/maker-dmg": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-dmg": "^4.0.0" - } - }, - "packages/app/node_modules/@electron-forge/maker-dmg/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/maker-rpm": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-redhat": "^3.2.0" - } - }, - "packages/app/node_modules/@electron-forge/maker-squirrel": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-winstaller": "^5.3.0" - } - }, - "packages/app/node_modules/@electron-forge/maker-squirrel/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/maker-zip": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "cross-zip": "^4.0.0", - "fs-extra": "^10.0.0", - "got": "^11.8.5" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/maker-zip/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/plugin-auto-unpack-natives": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/plugin-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/plugin-base": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/publisher-base": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/publisher-github": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/publisher-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@octokit/core": "^3.2.4", - "@octokit/plugin-retry": "^3.0.9", - "@octokit/request-error": "^2.0.5", - "@octokit/rest": "^18.0.11", - "@octokit/types": "^6.1.2", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "log-symbols": "^4.0.0", - "mime-types": "^2.1.25" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/publisher-github/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/shared-types": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/tracer": "7.4.0", - "@electron/packager": "^18.3.1", - "@electron/rebuild": "^3.2.10", - "listr2": "^7.0.2" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/template-base": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "username": "^5.1.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/template-base/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/template-vite": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/template-vite-typescript": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/template-vite-typescript/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/template-vite/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/template-webpack": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/template-webpack-typescript": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "packages/app/node_modules/@electron-forge/template-webpack-typescript/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/template-webpack/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron-forge/tracer": { - "version": "7.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chrome-trace-event": "^1.0.3" - }, - "engines": { - "node": ">= 14.17.5" - } - }, - "packages/app/node_modules/@electron/asar": { - "version": "3.2.10", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "packages/app/node_modules/@electron/asar/node_modules/commander": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/@electron/get": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "packages/app/node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "packages/app/node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/app/node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/app/node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "packages/app/node_modules/@electron/notarize": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/app/node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/@electron/osx-sign": { - "version": "1.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "packages/app/node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron/packager": { - "version": "18.3.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@electron/asar": "^3.2.1", - "@electron/get": "^3.0.0", - "@electron/notarize": "^2.1.0", - "@electron/osx-sign": "^1.0.5", - "@electron/universal": "^2.0.1", - "@electron/windows-sign": "^1.0.0", - "debug": "^4.0.1", - "extract-zip": "^2.0.0", - "filenamify": "^4.1.0", - "fs-extra": "^11.1.0", - "galactus": "^1.0.0", - "get-package-info": "^1.0.0", - "junk": "^3.1.0", - "parse-author": "^2.0.0", - "plist": "^3.0.0", - "resedit": "^2.0.0", - "resolve": "^1.1.6", - "semver": "^7.1.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "electron-packager": "bin/electron-packager.js" - }, - "engines": { - "node": ">= 16.13.0" - }, - "funding": { - "url": "https://github.com/electron/packager?sponsor=1" - } - }, - "packages/app/node_modules/@electron/rebuild": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/@electron/rebuild/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/minimatch": { - "version": "5.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/minipass-fetch": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/node-gyp": { - "version": "9.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@electron/rebuild/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/@electron/universal": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "packages/app/node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/app/node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/@electron/windows-sign": { - "version": "1.1.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "cross-dirname": "^0.1.0", - "debug": "^4.3.4", - "fs-extra": "^11.1.1", - "minimist": "^1.2.8", - "postject": "^1.0.0-alpha.6" - }, - "bin": { - "electron-windows-sign": "bin/electron-windows-sign.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "packages/app/node_modules/@emotion/is-prop-valid": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "packages/app/node_modules/@emotion/memoize": { - "version": "0.9.0", - "license": "MIT" - }, - "packages/app/node_modules/@emotion/stylis": { - "version": "0.8.5", - "license": "MIT" - }, - "packages/app/node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" - }, - "packages/app/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "packages/app/node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/app/node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@eslint/js": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@fal-ai/serverless-client": { - "version": "0.13.0", - "license": "MIT", - "dependencies": { - "@msgpack/msgpack": "^3.0.0-beta2", - "eventsource-parser": "^1.1.2", - "robot3": "^0.4.1", - "uuid-random": "^1.3.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "packages/app/node_modules/@ffmpeg/ffmpeg": { - "version": "0.12.10", - "license": "MIT", - "dependencies": { - "@ffmpeg/types": "^0.12.2" - }, - "engines": { - "node": ">=18.x" - } - }, - "packages/app/node_modules/@ffmpeg/types": { - "version": "0.12.2", - "license": "MIT", - "engines": { - "node": ">=16.x" - } - }, - "packages/app/node_modules/@ffmpeg/util": { - "version": "0.12.1", - "license": "MIT", - "engines": { - "node": ">=18.x" - } - }, - "packages/app/node_modules/@floating-ui/core": { - "version": "1.6.7", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.7" - } - }, - "packages/app/node_modules/@floating-ui/dom": { - "version": "1.6.10", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" - } - }, - "packages/app/node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "packages/app/node_modules/@floating-ui/utils": { - "version": "0.2.7", - "license": "MIT" - }, - "packages/app/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/@gradio/client": { - "version": "1.5.0", - "license": "ISC", - "dependencies": { - "@types/eventsource": "^1.1.15", - "bufferutil": "^4.0.7", - "eventsource": "^2.0.2", - "fetch-event-stream": "^0.1.5", - "msw": "^2.2.1", - "semiver": "^1.1.0", - "textlinestream": "^1.1.1", - "typescript": "^5.0.0", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "packages/app/node_modules/@huggingface/hub": { - "version": "0.15.1", - "license": "MIT", - "dependencies": { - "@huggingface/tasks": "^0.10.6", - "hash-wasm": "^4.9.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@huggingface/inference": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "@huggingface/tasks": "^0.11.2" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@huggingface/inference/node_modules/@huggingface/tasks": { - "version": "0.11.8", - "license": "MIT" - }, - "packages/app/node_modules/@huggingface/tasks": { - "version": "0.10.22", - "license": "MIT" - }, - "packages/app/node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "packages/app/node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "packages/app/node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "packages/app/node_modules/@img/sharp-libvips-win32-ia32": { - "version": "1.0.2", - "license": "LGPL-3.0-or-later", - "optional": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "packages/app/node_modules/@img/sharp-libvips-win32-x64": { - "version": "1.0.2", - "license": "LGPL-3.0-or-later", - "optional": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "packages/app/node_modules/@inquirer/confirm": { - "version": "3.1.22", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@inquirer/core": { - "version": "9.0.10", - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.2", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.1.0", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.1.0", - "license": "MIT", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "packages/app/node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.13.0", - "license": "MIT" - }, - "packages/app/node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/@inquirer/figures": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@inquirer/type": { - "version": "1.5.2", - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/anthropic": { - "version": "0.2.14", - "license": "MIT", - "dependencies": { - "@anthropic-ai/sdk": "^0.22.0", - "@langchain/core": ">=0.2.21 <0.3.0", - "fast-xml-parser": "^4.4.1", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/cohere": { - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "cohere-ai": "^7.10.5", - "uuid": "^10.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.1" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/cohere/node_modules/uuid": { - "version": "10.0.0", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "packages/app/node_modules/@langchain/core": { - "version": "0.2.23", - "license": "MIT", - "dependencies": { - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", - "js-tiktoken": "^1.0.12", - "langsmith": "~0.1.39", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "p-retry": "4", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/core/node_modules/commander": { - "version": "10.0.1", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "packages/app/node_modules/@langchain/core/node_modules/langsmith": { - "version": "0.1.41", - "license": "MIT", - "dependencies": { - "@types/uuid": "^9.0.1", - "commander": "^10.0.1", - "p-queue": "^6.6.2", - "p-retry": "4", - "semver": "^7.6.3", - "uuid": "^9.0.0" - }, - "peerDependencies": { - "@langchain/core": "*", - "langchain": "*", - "openai": "*" - }, - "peerDependenciesMeta": { - "@langchain/core": { - "optional": true - }, - "langchain": { - "optional": true - }, - "openai": { - "optional": true - } - } - }, - "packages/app/node_modules/@langchain/core/node_modules/langsmith/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "packages/app/node_modules/@langchain/core/node_modules/uuid": { - "version": "10.0.0", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "packages/app/node_modules/@langchain/google-common": { - "version": "0.0.25", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "uuid": "^10.0.0", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/google-common/node_modules/uuid": { - "version": "10.0.0", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "packages/app/node_modules/@langchain/google-gauth": { - "version": "0.0.25", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/google-common": "~0.0.25", - "google-auth-library": "^8.9.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/google-vertexai": { - "version": "0.0.25", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/google-gauth": "~0.0.25" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/groq": { - "version": "0.0.16", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/openai": "~0.2.6", - "groq-sdk": "^0.5.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.5" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/mistralai": { - "version": "0.0.28", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@mistralai/mistralai": "^0.4.0", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@langchain/mistralai/node_modules/uuid": { - "version": "10.0.0", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "packages/app/node_modules/@langchain/openai": { - "version": "0.2.6", - "license": "MIT", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "js-tiktoken": "^1.0.12", - "openai": "^4.55.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "packages/app/node_modules/@mistralai/mistralai": { - "version": "0.4.0", - "license": "ISC", - "dependencies": { - "node-fetch": "^2.6.7" - } - }, - "packages/app/node_modules/@msgpack/msgpack": { - "version": "3.0.0-beta2", - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@next/env": { - "version": "14.2.5", - "license": "MIT" - }, - "packages/app/node_modules/@next/eslint-plugin-next": { - "version": "14.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "10.3.10" - } - }, - "packages/app/node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/app/node_modules/@next/eslint-plugin-next/node_modules/glob": { - "version": "10.3.10", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/@next/eslint-plugin-next/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/@next/swc-darwin-arm64": { - "version": "14.2.5", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/@npmcli/agent": { - "version": "2.2.2", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "packages/app/node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/@npmcli/fs": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/@octokit/auth-token": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "packages/app/node_modules/@octokit/core": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "packages/app/node_modules/@octokit/endpoint": { - "version": "6.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "packages/app/node_modules/@octokit/graphql": { - "version": "4.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "packages/app/node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "packages/app/node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "packages/app/node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "packages/app/node_modules/@octokit/plugin-retry": { - "version": "3.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "bottleneck": "^2.15.3" - } - }, - "packages/app/node_modules/@octokit/request": { - "version": "5.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "packages/app/node_modules/@octokit/request-error": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "packages/app/node_modules/@octokit/rest": { - "version": "18.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "packages/app/node_modules/@octokit/types": { - "version": "6.41.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "packages/app/node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "license": "MIT" - }, - "packages/app/node_modules/@open-draft/logger": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "packages/app/node_modules/@open-draft/until": { - "version": "2.1.0", - "license": "MIT" - }, - "packages/app/node_modules/@playwright/test": { - "version": "1.46.0", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.46.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@pmndrs/uikit": { - "version": "0.3.13", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@preact/signals-core": "^1.5.1", - "inline-style-parser": "^0.2.3", - "node-html-parser": "^6.1.13", - "tw-to-css": "^0.0.12", - "yoga-layout": "^3.0.4" - }, - "peerDependencies": { - "three": ">=0.160" - } - }, - "packages/app/node_modules/@preact/signals-core": { - "version": "1.8.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "packages/app/node_modules/@radix-ui/react-accordion": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collapsible": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-avatar": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-checkbox": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-collapsible": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-dialog": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.0", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-icons": { - "version": "1.3.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x" - } - }, - "packages/app/node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-label": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-menu": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-menubar": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-popover": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-progress": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-scroll-area": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-select": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-separator": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-switch": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-tabs": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-toast": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-tooltip": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@radix-ui/rect": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/app/node_modules/@react-dnd/asap": { - "version": "5.0.2", - "license": "MIT" - }, - "packages/app/node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "license": "MIT" - }, - "packages/app/node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "license": "MIT" - }, - "packages/app/node_modules/@react-three/uikit": { - "version": "0.3.13", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@pmndrs/uikit": "^0.3.13", - "@preact/signals-core": "^1.5.1", - "chalk": "^5.3.0", - "commander": "^12.0.0", - "ora": "^8.0.1", - "prettier": "^3.2.5", - "prompts": "^2.4.2", - "zod": "^3.22.4", - "zustand": "^4.5.2" - }, - "bin": { - "uikit": "dist/cli/index.js" - }, - "peerDependencies": { - "@react-three/fiber": ">=8", - "react": ">=18" - } - }, - "packages/app/node_modules/@react-three/uikit-lucide": { - "version": "0.3.13", - "dependencies": { - "@react-three/uikit": "^0.3.13" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/commander": { - "version": "12.1.0", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/emoji-regex": { - "version": "10.3.0", - "license": "MIT" - }, - "packages/app/node_modules/@react-three/uikit/node_modules/is-interactive": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/is-unicode-supported": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/log-symbols": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/ora": { - "version": "8.0.1", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/string-width": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/@react-three/uikit/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "packages/app/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "packages/app/node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/@saintno/comfyui-sdk": { - "version": "0.1.11", - "license": "ISC", - "dependencies": { - "@types/node": "^22.2.0", - "bun-types": "^1.1.22", - "ws": "^8.18.0" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } - }, - "packages/app/node_modules/@saintno/comfyui-sdk/node_modules/@types/node": { - "version": "22.2.0", - "license": "MIT", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "packages/app/node_modules/@saintno/comfyui-sdk/node_modules/undici-types": { - "version": "6.13.0", - "license": "MIT" - }, - "packages/app/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "packages/app/node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/core": { - "version": "2.3.2", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/eventstream-codec": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "tslib": "^2.5.0" - } - }, - "packages/app/node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "1.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@smithy/hash-node": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/property-provider": { - "version": "3.1.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/types": { - "version": "3.3.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/url-parser": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@smithy/util-base64": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "packages/app/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/app/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/app/node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-retry": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-stream": { - "version": "3.1.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, - "packages/app/node_modules/@swc/helpers": { - "version": "0.5.5", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "packages/app/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/@tailwindcss/container-queries": { - "version": "0.1.1", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.2.0" - } - }, - "packages/app/node_modules/@testing-library/dom": { - "version": "10.4.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/@testing-library/react": { - "version": "16.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/@tsconfig/node10": { - "version": "1.0.11", - "license": "MIT" - }, - "packages/app/node_modules/@tsconfig/node12": { - "version": "1.0.11", - "license": "MIT" - }, - "packages/app/node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" - }, - "packages/app/node_modules/@tsconfig/node16": { - "version": "1.0.4", - "license": "MIT" - }, - "packages/app/node_modules/@types/aria-query": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/app/node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "packages/app/node_modules/@types/babel__generator": { - "version": "7.6.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "packages/app/node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "packages/app/node_modules/@types/babel__traverse": { - "version": "7.20.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "packages/app/node_modules/@types/cacheable-request": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "packages/app/node_modules/@types/cookie": { - "version": "0.6.0", - "license": "MIT" - }, - "packages/app/node_modules/@types/d3-color": { - "version": "3.1.3", - "license": "MIT" - }, - "packages/app/node_modules/@types/d3-drag": { - "version": "3.0.7", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "packages/app/node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "packages/app/node_modules/@types/d3-selection": { - "version": "3.0.10", - "license": "MIT" - }, - "packages/app/node_modules/@types/d3-transition": { - "version": "3.0.8", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "packages/app/node_modules/@types/d3-zoom": { - "version": "3.0.8", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "packages/app/node_modules/@types/debug": { - "version": "4.1.12", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "packages/app/node_modules/@types/dom-speech-recognition": { - "version": "0.0.4", - "license": "MIT" - }, - "packages/app/node_modules/@types/estree": { - "version": "1.0.5", - "license": "MIT" - }, - "packages/app/node_modules/@types/estree-jsx": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "packages/app/node_modules/@types/eventsource": { - "version": "1.1.15", - "license": "MIT" - }, - "packages/app/node_modules/@types/fluent-ffmpeg": { - "version": "2.1.25", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/fs-extra": { - "version": "9.0.13", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/glob": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/hast": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "packages/app/node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/@types/is-hotkey": { - "version": "0.1.10", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/@types/json5": { - "version": "0.0.29", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/@types/jsonfile": { - "version": "6.1.4", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/keyv": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/mdast": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "packages/app/node_modules/@types/minimatch": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/@types/ms": { - "version": "0.7.34", - "license": "MIT" - }, - "packages/app/node_modules/@types/mute-stream": { - "version": "0.0.4", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/node": { - "version": "20.14.14", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/app/node_modules/@types/node-fetch": { - "version": "2.6.11", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "packages/app/node_modules/@types/pngjs": { - "version": "6.0.5", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/react-dom": { - "version": "18.3.0", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "packages/app/node_modules/@types/responselike": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/retry": { - "version": "0.12.0", - "license": "MIT" - }, - "packages/app/node_modules/@types/statuses": { - "version": "2.0.5", - "license": "MIT" - }, - "packages/app/node_modules/@types/tough-cookie": { - "version": "4.0.5", - "license": "MIT" - }, - "packages/app/node_modules/@types/unist": { - "version": "3.0.2", - "license": "MIT" - }, - "packages/app/node_modules/@types/uuid": { - "version": "9.0.8", - "license": "MIT" - }, - "packages/app/node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "license": "MIT" - }, - "packages/app/node_modules/@types/ws": { - "version": "8.5.12", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@types/yauzl": { - "version": "2.10.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "packages/app/node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/app/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/app/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/app/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/app/node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/app/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/app/node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "license": "ISC" - }, - "packages/app/node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "packages/app/node_modules/@vitest/expect": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/@vitest/runner": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/@vitest/snapshot": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/@vitest/spy": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/@vitest/utils": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/@webgpu/types": { - "version": "0.1.44", - "dev": true, - "license": "BSD-3-Clause" - }, - "packages/app/node_modules/@xenova/transformers": { - "version": "3.0.0-alpha.0", - "license": "Apache-2.0", - "dependencies": { - "@huggingface/jinja": "^0.3.0", - "onnxruntime-web": "^1.18.0", - "sharp": "^0.33.2" - }, - "optionalDependencies": { - "onnxruntime-node": "^1.18.0" - } - }, - "packages/app/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "packages/app/node_modules/@xyflow/react": { - "version": "12.0.4", - "license": "MIT", - "dependencies": { - "@xyflow/system": "0.0.37", - "classcat": "^5.0.3", - "zustand": "^4.4.0" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "packages/app/node_modules/@xyflow/system": { - "version": "0.0.37", - "license": "MIT", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, - "packages/app/node_modules/abbrev": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/abort-controller": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "packages/app/node_modules/acorn": { - "version": "8.12.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "packages/app/node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "packages/app/node_modules/acorn-walk": { - "version": "8.3.3", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "packages/app/node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "packages/app/node_modules/agentkeepalive": { - "version": "4.5.0", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "packages/app/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "packages/app/node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/ansi-styles": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/appdmg": { - "version": "0.6.6", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "async": "^1.4.2", - "ds-store": "^0.1.5", - "execa": "^1.0.0", - "fs-temp": "^1.0.0", - "fs-xattr": "^0.3.0", - "image-size": "^0.7.4", - "is-my-json-valid": "^2.20.0", - "minimist": "^1.1.3", - "parse-color": "^1.0.0", - "path-exists": "^4.0.0", - "repeat-string": "^1.5.4" - }, - "bin": { - "appdmg": "bin/appdmg.js" - }, - "engines": { - "node": ">=8.5" - } - }, - "packages/app/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "packages/app/node_modules/aria-hidden": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/aria-query": { - "version": "5.3.0", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "packages/app/node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/array-includes": { - "version": "3.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/array.prototype.findlast": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/array.prototype.flat": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/arrify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/asar": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" - } - }, - "packages/app/node_modules/asar/node_modules/commander": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/assertion-error": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/ast-types-flow": { - "version": "0.0.8", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/async": { - "version": "1.5.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "packages/app/node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "packages/app/node_modules/author-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "packages/app/node_modules/automation-events": { - "version": "7.0.7", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.2.0" - } - }, - "packages/app/node_modules/autoprefixer": { - "version": "10.4.19", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "packages/app/node_modules/available-typed-arrays": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/axe-core": { - "version": "4.10.0", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/axobject-query": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "packages/app/node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "packages/app/node_modules/bail": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/base32-encode": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "to-data-view": "^1.1.0" - } - }, - "packages/app/node_modules/base64-arraybuffer": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "packages/app/node_modules/before-after-hook": { - "version": "2.2.3", - "dev": true, - "license": "Apache-2.0" - }, - "packages/app/node_modules/bignumber.js": { - "version": "9.1.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/app/node_modules/bl": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "packages/app/node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "packages/app/node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/boolbase": { - "version": "1.0.0", - "license": "ISC" - }, - "packages/app/node_modules/boolean": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/bottleneck": { - "version": "2.19.5", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/bowser": { - "version": "2.11.0", - "license": "MIT" - }, - "packages/app/node_modules/bplist-creator": { - "version": "0.0.8", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "stream-buffers": "~2.2.0" - } - }, - "packages/app/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "packages/app/node_modules/browserslist": { - "version": "4.23.3", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "packages/app/node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/app/node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "license": "BSD-3-Clause" - }, - "packages/app/node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/bufferutil": { - "version": "4.0.8", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "packages/app/node_modules/bun-types": { - "version": "1.1.22", - "license": "MIT", - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "packages/app/node_modules/bun-types/node_modules/@types/node": { - "version": "20.12.14", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/app/node_modules/busboy": { - "version": "1.6.0", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "packages/app/node_modules/cac": { - "version": "6.7.14", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/cacache": { - "version": "18.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "packages/app/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/app/node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/cacache/node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "packages/app/node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/cacheable-lookup": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "packages/app/node_modules/cacheable-request": { - "version": "7.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/call-bind": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/camelize": { - "version": "1.0.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/caniuse-lite": { - "version": "1.0.30001651", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "packages/app/node_modules/ccount": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/chai": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/app/node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/app/node_modules/character-entities": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/character-entities-html4": { - "version": "2.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/character-entities-legacy": { - "version": "3.0.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/character-reference-invalid": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/check-error": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "packages/app/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/chrome-trace-event": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "packages/app/node_modules/chromium-pickle-js": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/class-variance-authority": { - "version": "0.7.0", - "license": "Apache-2.0", - "dependencies": { - "clsx": "2.0.0" - }, - "funding": { - "url": "https://joebell.co.uk" - } - }, - "packages/app/node_modules/class-variance-authority/node_modules/clsx": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/classcat": { - "version": "5.0.5", - "license": "MIT" - }, - "packages/app/node_modules/classnames": { - "version": "2.5.1", - "license": "MIT" - }, - "packages/app/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/cli-cursor": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/cli-spinners": { - "version": "2.9.2", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/cli-truncate": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/cli-width": { - "version": "4.1.0", - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "packages/app/node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" - }, - "packages/app/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/app/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "packages/app/node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "packages/app/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "packages/app/node_modules/clone-response": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/cmdk": { - "version": "0.2.1", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "1.0.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-dismissable-layer": "1.0.0", - "@radix-ui/react-focus-guards": "1.0.0", - "@radix-ui/react-focus-scope": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-portal": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-slot": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-escape-keydown": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "packages/app/node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.4", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/cohere-ai": { - "version": "7.11.2", - "dependencies": { - "@aws-sdk/client-sagemaker": "^3.583.0", - "@aws-sdk/credential-providers": "^3.583.0", - "@aws-sdk/protocol-http": "^3.374.0", - "@aws-sdk/signature-v4": "^3.374.0", - "form-data": "^4.0.0", - "form-data-encoder": "^4.0.2", - "formdata-node": "^6.0.3", - "js-base64": "3.7.2", - "node-fetch": "2.7.0", - "qs": "6.11.2", - "readable-stream": "^4.5.2", - "url-join": "4.0.1" - } - }, - "packages/app/node_modules/cohere-ai/node_modules/form-data-encoder": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "packages/app/node_modules/cohere-ai/node_modules/formdata-node": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "packages/app/node_modules/cohere-ai/node_modules/qs": { - "version": "6.11.2", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/color-convert": { - "version": "0.5.3", - "dev": true, - "optional": true - }, - "packages/app/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "packages/app/node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "packages/app/node_modules/comma-separated-tokens": { - "version": "2.0.3", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/compare-version": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT" - }, - "packages/app/node_modules/cookie": { - "version": "0.5.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/app/node_modules/create-require": { - "version": "1.1.1", - "license": "MIT" - }, - "packages/app/node_modules/cross-dirname": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/cross-zip": { - "version": "4.0.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=12.10" - } - }, - "packages/app/node_modules/css-color-keywords": { - "version": "1.0.0", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/css-select": { - "version": "5.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "packages/app/node_modules/css-to-react-native": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "packages/app/node_modules/css-what": { - "version": "6.1.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "packages/app/node_modules/cssstyle": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.6.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/d3-color": { - "version": "3.1.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-dispatch": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-drag": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-ease": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-interpolate": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-selection": { - "version": "3.0.0", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-timer": { - "version": "3.0.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/d3-transition": { - "version": "3.0.1", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "packages/app/node_modules/d3-zoom": { - "version": "3.0.0", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/damerau-levenshtein": { - "version": "1.0.8", - "dev": true, - "license": "BSD-2-Clause" - }, - "packages/app/node_modules/data-urls": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/data-view-buffer": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/data-view-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/data-view-byte-offset": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/debug": { - "version": "4.3.6", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "packages/app/node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/decimal.js": { - "version": "10.4.3", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/decode-named-character-reference": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/decode-uri-component": { - "version": "0.4.1", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "packages/app/node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/deep-eql": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/deep-equal": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "packages/app/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/deprecation": { - "version": "2.3.1", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/detect-node-es": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/app/node_modules/devlop": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/diff": { - "version": "4.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "packages/app/node_modules/dir-compare": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "packages/app/node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/dnd-core": { - "version": "16.0.1", - "license": "MIT", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, - "packages/app/node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "packages/app/node_modules/dom-accessibility-api": { - "version": "0.5.16", - "dev": true, - "license": "MIT", - "peer": true - }, - "packages/app/node_modules/dom-serializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "packages/app/node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "packages/app/node_modules/domhandler": { - "version": "5.0.3", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "packages/app/node_modules/domutils": { - "version": "3.1.0", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "packages/app/node_modules/dotenv": { - "version": "16.4.5", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "packages/app/node_modules/ds-store": { - "version": "0.1.6", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bplist-creator": "~0.0.3", - "macos-alias": "~0.2.5", - "tn1150": "^0.1.0" - } - }, - "packages/app/node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "packages/app/node_modules/electron": { - "version": "31.3.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "packages/app/node_modules/electron-installer-common": { - "version": "0.10.3", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "asar": "^3.0.0", - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "glob": "^7.1.4", - "lodash": "^4.17.15", - "parse-author": "^2.0.0", - "semver": "^7.1.1", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" - }, - "optionalDependencies": { - "@types/fs-extra": "^9.0.1" - } - }, - "packages/app/node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/electron-installer-common/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-installer-debian": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin", - "linux" - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "debug": "^4.1.1", - "electron-installer-common": "^0.10.2", - "fs-extra": "^9.0.0", - "get-folder-size": "^2.0.1", - "lodash": "^4.17.4", - "word-wrap": "^1.2.3", - "yargs": "^16.0.2" - }, - "bin": { - "electron-installer-debian": "src/cli.js" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/electron-installer-debian/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-installer-debian/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-installer-dmg": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "debug": "^4.3.2", - "minimist": "^1.1.1" - }, - "bin": { - "electron-installer-dmg": "bin/electron-installer-dmg.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "optionalDependencies": { - "appdmg": "^0.6.4" - } - }, - "packages/app/node_modules/electron-installer-redhat": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin", - "linux" - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "debug": "^4.1.1", - "electron-installer-common": "^0.10.2", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "word-wrap": "^1.2.3", - "yargs": "^16.0.2" - }, - "bin": { - "electron-installer-redhat": "src/cli.js" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-installer-redhat/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/electron-to-chromium": { - "version": "1.5.5", - "license": "ISC" - }, - "packages/app/node_modules/electron-winstaller": { - "version": "5.4.0", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.21", - "temp": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "@electron/windows-sign": "^1.1.2" - } - }, - "packages/app/node_modules/electron-winstaller/node_modules/fs-extra": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "packages/app/node_modules/electron-winstaller/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/app/node_modules/electron-winstaller/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "packages/app/node_modules/electron/node_modules/@electron/get": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "packages/app/node_modules/electron/node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "packages/app/node_modules/electron/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/app/node_modules/electron/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/app/node_modules/electron/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "packages/app/node_modules/encode-utf8": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "packages/app/node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "packages/app/node_modules/enhanced-resolve": { - "version": "5.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "packages/app/node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "packages/app/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "packages/app/node_modules/es-abstract": { - "version": "1.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/es-define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/es-errors": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/es-get-iterator": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/es-iterator-helpers": { - "version": "1.0.19", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/es-object-atoms": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/es-set-tostringtag": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/es-shim-unscopables": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "packages/app/node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/esbuild": { - "version": "0.21.5", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "packages/app/node_modules/escalade": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/eslint": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/app/node_modules/eslint-config-next": { - "version": "14.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "14.2.5", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/app/node_modules/eslint-config-prettier": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "packages/app/node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "packages/app/node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "packages/app/node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "dev": true, - "license": "ISC", - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "packages/app/node_modules/eslint-module-utils": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "packages/app/node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "packages/app/node_modules/eslint-plugin-import": { - "version": "2.29.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "packages/app/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "packages/app/node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/app/node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "packages/app/node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "packages/app/node_modules/eslint-plugin-react": { - "version": "7.35.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "packages/app/node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "packages/app/node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/app/node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/app/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/app/node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/app/node_modules/esquery": { - "version": "1.6.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "packages/app/node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "packages/app/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "packages/app/node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/estree-walker": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "packages/app/node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/event-target-shim": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/eventemitter3": { - "version": "5.0.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/events": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "packages/app/node_modules/eventsource": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "packages/app/node_modules/eventsource-parser": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, - "packages/app/node_modules/execa": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "packages/app/node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "packages/app/node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/execa/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "packages/app/node_modules/expand-tilde": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/exponential-backoff": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0" - }, - "packages/app/node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "packages/app/node_modules/extract-zip": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "packages/app/node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "packages/app/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/fast-text-encoding": { - "version": "1.0.6", - "license": "Apache-2.0" - }, - "packages/app/node_modules/fast-unique-numbers": { - "version": "9.0.7", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.2.0" - } - }, - "packages/app/node_modules/fast-xml-parser": { - "version": "4.4.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "packages/app/node_modules/fd-slicer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "packages/app/node_modules/fetch-event-stream": { - "version": "0.1.5", - "license": "MIT" - }, - "packages/app/node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "packages/app/node_modules/file-selector": { - "version": "0.2.4", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - }, - "engines": { - "node": ">= 10" - } - }, - "packages/app/node_modules/filename-reserved-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/filenamify": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/filter-obj": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "packages/app/node_modules/flatted": { - "version": "3.3.1", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/flora-colossus": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "packages/app/node_modules/flora-colossus/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/fluent-ffmpeg": { - "version": "2.1.3", - "license": "MIT", - "dependencies": { - "async": "^0.2.9", - "which": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/fluent-ffmpeg/node_modules/async": { - "version": "0.2.10" - }, - "packages/app/node_modules/fluent-ffmpeg/node_modules/which": { - "version": "1.3.1", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "packages/app/node_modules/fmix": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "imul": "^1.0.0" - } - }, - "packages/app/node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "packages/app/node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/form-data-encoder": { - "version": "1.7.2", - "license": "MIT" - }, - "packages/app/node_modules/formdata-node": { - "version": "4.4.1", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "packages/app/node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/fraction.js": { - "version": "4.3.7", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "packages/app/node_modules/framer-motion": { - "version": "11.1.7", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "packages/app/node_modules/fs-extra": { - "version": "11.2.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "packages/app/node_modules/fs-minipass": { - "version": "3.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/fs-temp": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "random-path": "^0.1.0" - } - }, - "packages/app/node_modules/fs-xattr": { - "version": "0.3.1", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "!win32" - ], - "engines": { - "node": ">=8.6.0" - } - }, - "packages/app/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/fsevents": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "packages/app/node_modules/function.prototype.name": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/functions-have-names": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/galactus": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "flora-colossus": "^2.0.0", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "packages/app/node_modules/galactus/node_modules/fs-extra": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/gar": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/gaxios": { - "version": "5.1.3", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/gaxios/node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/gcp-metadata": { - "version": "5.3.0", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/generate-function": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-property": "^1.0.2" - } - }, - "packages/app/node_modules/generate-object-property": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-property": "^1.0.0" - } - }, - "packages/app/node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "packages/app/node_modules/get-east-asian-width": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/get-folder-size": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "gar": "^1.0.4", - "tiny-each-async": "2.0.3" - }, - "bin": { - "get-folder-size": "bin/get-folder-size" - } - }, - "packages/app/node_modules/get-func-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/app/node_modules/get-installed-path": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "global-modules": "1.0.0" - } - }, - "packages/app/node_modules/get-intrinsic": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/get-node-dimensions": { - "version": "1.2.1", - "license": "MIT" - }, - "packages/app/node_modules/get-nonce": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/get-package-info": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.1.1", - "debug": "^2.2.0", - "lodash.get": "^4.0.0", - "read-pkg-up": "^2.0.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "packages/app/node_modules/get-package-info/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "packages/app/node_modules/get-package-info/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/get-stream": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/get-symbol-description": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/get-tsconfig": { - "version": "4.7.6", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "packages/app/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/global-agent": { - "version": "3.0.0", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "packages/app/node_modules/global-modules": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/global-prefix": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "packages/app/node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/globalthis": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/google-auth-library": { - "version": "8.9.0", - "license": "Apache-2.0", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.3.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/google-auth-library/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/google-auth-library/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "packages/app/node_modules/google-p12-pem": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "packages/app/node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/got": { - "version": "11.8.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "packages/app/node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "packages/app/node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/graphql": { - "version": "16.9.0", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "packages/app/node_modules/groq-sdk": { - "version": "0.5.0", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "packages/app/node_modules/groq-sdk/node_modules/@types/node": { - "version": "18.19.44", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/app/node_modules/gtoken": { - "version": "6.1.2", - "license": "MIT", - "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "packages/app/node_modules/has-bigints": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/has-proto": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/has-tostringtag": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/hash-wasm": { - "version": "4.11.0", - "license": "MIT" - }, - "packages/app/node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/hast-util-whitespace": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/he": { - "version": "1.2.0", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "packages/app/node_modules/headers-polyfill": { - "version": "4.0.3", - "license": "MIT" - }, - "packages/app/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "packages/app/node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "packages/app/node_modules/homedir-polyfill": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/html-url-attributes": { - "version": "3.0.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "packages/app/node_modules/http-proxy-agent": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/http2-wrapper": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "packages/app/node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/human-signals": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "packages/app/node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "packages/app/node_modules/iconv-lite": { - "version": "0.6.3", - "devOptional": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/ignore": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "packages/app/node_modules/image-size": { - "version": "0.7.5", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "packages/app/node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/imul": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "packages/app/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/indexeddb-fs": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "jsonschema": "^1.4.1" - } - }, - "packages/app/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "packages/app/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/inline-style-parser": { - "version": "0.2.3", - "license": "MIT" - }, - "packages/app/node_modules/internal-slot": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "packages/app/node_modules/invariant": { - "version": "2.2.4", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "packages/app/node_modules/ip-address": { - "version": "9.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "packages/app/node_modules/is-alphabetical": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/is-alphanumerical": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/is-arguments": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-array-buffer": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/is-async-function": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-bigint": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-boolean-object": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-callable": { - "version": "1.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-data-view": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-date-object": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-decimal": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/is-finalizationregistry": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/is-generator-function": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-hexadecimal": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/is-hotkey": { - "version": "0.2.0", - "license": "MIT" - }, - "packages/app/node_modules/is-interactive": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/is-map": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-my-ip-valid": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/is-my-json-valid": { - "version": "2.20.6", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^5.0.0", - "xtend": "^4.0.0" - } - }, - "packages/app/node_modules/is-negative-zero": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-node-process": { - "version": "1.2.0", - "license": "MIT" - }, - "packages/app/node_modules/is-number-object": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/is-plain-obj": { - "version": "4.1.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/is-property": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/is-regex": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-set": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-stream": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/is-string": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-symbol": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-typed-array": { - "version": "1.1.13", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-unicode-supported": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/is-weakmap": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-weakref": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-weakset": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/is-windows": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/isbinaryfile": { - "version": "4.0.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "packages/app/node_modules/iterator.prototype": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "packages/app/node_modules/jackspeak": { - "version": "2.3.6", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "packages/app/node_modules/js-base64": { - "version": "3.7.2", - "license": "BSD-3-Clause" - }, - "packages/app/node_modules/js-tiktoken": { - "version": "1.0.12", - "license": "MIT", - "dependencies": { - "base64-js": "^1.5.1" - } - }, - "packages/app/node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/app/node_modules/jsbn": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/jsdom": { - "version": "24.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "packages/app/node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/jsesc": { - "version": "2.5.2", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/json-bigint": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "packages/app/node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "optional": true - }, - "packages/app/node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/jsonfile": { - "version": "6.1.0", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/app/node_modules/jsonpointer": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/jsonschema": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "packages/app/node_modules/jsx-ast-utils": { - "version": "3.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "packages/app/node_modules/junk": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/jwa": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "packages/app/node_modules/jws": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "packages/app/node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "packages/app/node_modules/kleur": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/language-subtag-registry": { - "version": "0.3.23", - "dev": true, - "license": "CC0-1.0" - }, - "packages/app/node_modules/language-tags": { - "version": "1.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "packages/app/node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "packages/app/node_modules/listr2": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/load-json-file": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "packages/app/node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "packages/app/node_modules/lodash.get": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/lodash.throttle": { - "version": "4.1.1", - "license": "MIT" - }, - "packages/app/node_modules/log-symbols": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/log-update": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "packages/app/node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "packages/app/node_modules/longest-streak": { - "version": "3.1.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/loupe": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "packages/app/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "packages/app/node_modules/lucide-react": { - "version": "0.396.0", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "packages/app/node_modules/lz-string": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "packages/app/node_modules/macos-alias": { - "version": "0.2.11", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "nan": "^2.4.0" - } - }, - "packages/app/node_modules/magic-string": { - "version": "0.30.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "packages/app/node_modules/make-error": { - "version": "1.3.6", - "license": "ISC" - }, - "packages/app/node_modules/make-fetch-happen": { - "version": "13.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "packages/app/node_modules/map-age-cleaner": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/markdown-table": { - "version": "3.0.3", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/matcher": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-gfm": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mdast-util-to-string": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/mediainfo.js": { - "version": "0.3.2", - "license": "BSD-2-Clause", - "dependencies": { - "yargs": "^17.7.2" - }, - "bin": { - "mediainfo.js": "dist/esm/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "packages/app/node_modules/mem": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/micromark": { - "version": "4.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/micromark-factory-destination": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-factory-label": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-factory-space": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-factory-title": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-character": { - "version": "2.1.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-chunked": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-encode": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/app/node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/app/node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "packages/app/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/app/node_modules/micromark-util-types": { - "version": "2.0.0", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "packages/app/node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/app/node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "packages/app/node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "packages/app/node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/minipass-collect": { - "version": "2.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "packages/app/node_modules/minipass-fetch": { - "version": "3.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "packages/app/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "packages/app/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "packages/app/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/mlt-xml": { - "version": "2.0.2", - "license": "MIT" - }, - "packages/app/node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "packages/app/node_modules/msw": { - "version": "2.3.5", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.7.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/app/node_modules/msw/node_modules/type-fest": { - "version": "4.24.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/murmur-32": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "encode-utf8": "^1.0.3", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, - "packages/app/node_modules/mustache": { - "version": "4.2.0", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "packages/app/node_modules/mute-stream": { - "version": "1.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/nan": { - "version": "2.20.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/app/node_modules/next": { - "version": "14.2.5", - "license": "MIT", - "dependencies": { - "@next/env": "14.2.5", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.5", - "@next/swc-darwin-x64": "14.2.5", - "@next/swc-linux-arm64-gnu": "14.2.5", - "@next/swc-linux-arm64-musl": "14.2.5", - "@next/swc-linux-x64-gnu": "14.2.5", - "@next/swc-linux-x64-musl": "14.2.5", - "@next/swc-win32-arm64-msvc": "14.2.5", - "@next/swc-win32-ia32-msvc": "14.2.5", - "@next/swc-win32-x64-msvc": "14.2.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "packages/app/node_modules/next-themes": { - "version": "0.3.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18", - "react-dom": "^16.8 || ^17 || ^18" - } - }, - "packages/app/node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "packages/app/node_modules/nice-try": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/node-abi": { - "version": "3.65.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/node-api-version": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - } - }, - "packages/app/node_modules/node-domexception": { - "version": "1.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "packages/app/node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "packages/app/node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "packages/app/node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "packages/app/node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "packages/app/node_modules/node-forge": { - "version": "1.3.1", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "packages/app/node_modules/node-gyp": { - "version": "10.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "packages/app/node_modules/node-gyp-build": { - "version": "4.8.1", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "packages/app/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/app/node_modules/node-gyp/node_modules/glob": { - "version": "10.4.5", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "packages/app/node_modules/node-gyp/node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "packages/app/node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/node-html-parser": { - "version": "6.1.13", - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "packages/app/node_modules/node-releases": { - "version": "2.0.18", - "license": "MIT" - }, - "packages/app/node_modules/nopt": { - "version": "7.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "packages/app/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "packages/app/node_modules/normalize-range": { - "version": "0.1.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/npm-run-path": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "packages/app/node_modules/nth-check": { - "version": "2.1.1", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "packages/app/node_modules/nwsapi": { - "version": "2.2.12", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/object-inspect": { - "version": "1.13.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/object-is": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/object.assign": { - "version": "4.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/object.entries": { - "version": "1.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/object.fromentries": { - "version": "2.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/object.groupby": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/object.values": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "packages/app/node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/onnxruntime-web": { - "version": "1.18.0", - "license": "MIT", - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.18.0", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "packages/app/node_modules/openai": { - "version": "4.55.2", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "packages/app/node_modules/openai/node_modules/@types/node": { - "version": "18.19.43", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/app/node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "packages/app/node_modules/ora": { - "version": "5.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/outvariant": { - "version": "1.4.3", - "license": "MIT" - }, - "packages/app/node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/p-defer": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/p-finally": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/p-is-promise": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/p-queue": { - "version": "6.6.2", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "license": "MIT" - }, - "packages/app/node_modules/p-retry": { - "version": "4.6.2", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/p-timeout": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/parse-author": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "author-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/parse-color": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "~0.5.0" - } - }, - "packages/app/node_modules/parse-entities": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "license": "MIT" - }, - "packages/app/node_modules/parse-json": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/parse-passwd": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/parse5": { - "version": "7.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "packages/app/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/path-to-regexp": { - "version": "6.2.2", - "license": "MIT" - }, - "packages/app/node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/pathe": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/pathval": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "packages/app/node_modules/pe-library": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "packages/app/node_modules/pend": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/playwright": { - "version": "1.46.0", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.46.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "packages/app/node_modules/playwright-core": { - "version": "1.46.0", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/plist": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "packages/app/node_modules/pngjs": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=14.19.0" - } - }, - "packages/app/node_modules/possible-typed-array-names": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/postcss-css-variables": { - "version": "0.18.0", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "escape-string-regexp": "^1.0.3", - "extend": "^3.0.1" - }, - "peerDependencies": { - "postcss": "^8.2.6" - } - }, - "packages/app/node_modules/postcss-css-variables/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/app/node_modules/postject": { - "version": "1.0.0-alpha.6", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^9.4.0" - }, - "bin": { - "postject": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/postject/node_modules/commander": { - "version": "9.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "packages/app/node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "packages/app/node_modules/prettier": { - "version": "3.3.3", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "packages/app/node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig-melody": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig-melody": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "packages/app/node_modules/pretty-format": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "packages/app/node_modules/proc-log": { - "version": "4.2.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/process": { - "version": "0.11.10", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "packages/app/node_modules/progress": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "packages/app/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "packages/app/node_modules/prompts": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/app/node_modules/property-information": { - "version": "6.5.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/psl": { - "version": "1.9.0", - "license": "MIT" - }, - "packages/app/node_modules/pump": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "packages/app/node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/qs": { - "version": "6.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/query-string": { - "version": "9.1.0", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.4.1", - "filter-obj": "^5.1.0", - "split-on-first": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" - }, - "packages/app/node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/random-path": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "base32-encode": "^0.1.0 || ^1.0.0", - "murmur-32": "^0.1.0 || ^0.2.0" - } - }, - "packages/app/node_modules/react-device-frameset": { - "version": "1.3.4", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "packages/app/node_modules/react-dnd": { - "version": "16.0.1", - "license": "MIT", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "license": "MIT", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "packages/app/node_modules/react-drag-drop-files": { - "version": "2.3.10", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2", - "styled-components": "^5.3.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "packages/app/node_modules/react-hook-consent": { - "version": "3.5.3", - "license": "MIT", - "dependencies": { - "object-hash": "^3.0.0", - "react-toggle": "^4.1.3" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "packages/app/node_modules/react-hotkeys-hook": { - "version": "4.5.0", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.1", - "react-dom": ">=16.8.1" - } - }, - "packages/app/node_modules/react-icons": { - "version": "5.2.1", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "packages/app/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT", - "peer": true - }, - "packages/app/node_modules/react-markdown": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "packages/app/node_modules/react-measure": { - "version": "2.5.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.2.0", - "get-node-dimensions": "^1.2.1", - "prop-types": "^15.6.2", - "resize-observer-polyfill": "^1.5.0" - }, - "peerDependencies": { - "react": ">0.13.0", - "react-dom": ">0.13.0" - } - }, - "packages/app/node_modules/react-reflex": { - "version": "4.2.6", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.5.8", - "react-measure": "^2.0.2" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "packages/app/node_modules/react-refresh": { - "version": "0.14.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/react-remove-scroll": { - "version": "2.5.7", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/react-speakup": { - "version": "1.0.0", - "license": "ISC", - "peerDependencies": { - "react": ">=16" - } - }, - "packages/app/node_modules/react-style-singleton": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/react-toggle": { - "version": "4.1.3", - "license": "MIT", - "dependencies": { - "classnames": "^2.2.5" - }, - "peerDependencies": { - "prop-types": ">= 15.3.0 < 19", - "react": ">= 15.3.0 < 19", - "react-dom": ">= 15.3.0 < 19" - } - }, - "packages/app/node_modules/read-binary-file-arch": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "packages/app/node_modules/read-pkg": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/readable-stream": { - "version": "4.5.2", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "packages/app/node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "packages/app/node_modules/redux": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "packages/app/node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/remark-gfm": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/remark-parse": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/remark-rehype": { - "version": "11.1.0", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/remark-stringify": { - "version": "11.0.0", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/repeat-string": { - "version": "1.6.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "packages/app/node_modules/replicate": { - "version": "0.32.0", - "license": "Apache-2.0", - "engines": { - "git": ">=2.11.0", - "node": ">=18.0.0", - "npm": ">=7.19.0", - "yarn": ">=1.7.0" - }, - "optionalDependencies": { - "readable-stream": ">=4.0.0" - } - }, - "packages/app/node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" - }, - "packages/app/node_modules/resedit": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pe-library": "^1.0.1" - }, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "packages/app/node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "license": "MIT" - }, - "packages/app/node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/resolve-dir": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/resolve-package": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-installed-path": "^2.0.3" - }, - "engines": { - "node": ">=4", - "npm": ">=2" - } - }, - "packages/app/node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "packages/app/node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/restore-cursor": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/retry": { - "version": "0.13.1", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "packages/app/node_modules/rfdc": { - "version": "1.4.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/roarr": { - "version": "2.15.4", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "packages/app/node_modules/robot3": { - "version": "0.4.1", - "license": "BSD-2-Clause" - }, - "packages/app/node_modules/rollup": { - "version": "4.20.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", - "fsevents": "~2.3.2" - } - }, - "packages/app/node_modules/rrweb-cssom": { - "version": "0.7.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/safe-array-concat": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "packages/app/node_modules/safe-regex-test": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/safer-buffer": { - "version": "2.1.2", - "devOptional": true, - "license": "MIT" - }, - "packages/app/node_modules/saxes": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "packages/app/node_modules/semiver": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/semver-compare": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/serialize-error": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/set-function-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/shallowequal": { - "version": "1.1.0", - "license": "MIT" - }, - "packages/app/node_modules/side-channel": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/siginfo": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "packages/app/node_modules/sisteransi": { - "version": "1.0.5", - "license": "MIT" - }, - "packages/app/node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/slice-ansi": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "packages/app/node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/app/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "packages/app/node_modules/socks": { - "version": "2.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "packages/app/node_modules/socks-proxy-agent": { - "version": "8.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "packages/app/node_modules/sonner": { - "version": "1.5.0", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "packages/app/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/source-map-support": { - "version": "0.5.21", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "packages/app/node_modules/space-separated-tokens": { - "version": "2.0.2", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "packages/app/node_modules/spdx-exceptions": { - "version": "2.5.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "packages/app/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "packages/app/node_modules/spdx-license-ids": { - "version": "3.0.18", - "dev": true, - "license": "CC0-1.0" - }, - "packages/app/node_modules/split-on-first": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "packages/app/node_modules/ssri": { - "version": "10.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/stackback": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/standardized-audio-context": { - "version": "25.3.75", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "automation-events": "^7.0.7", - "tslib": "^2.6.3" - } - }, - "packages/app/node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "packages/app/node_modules/std-env": { - "version": "3.7.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/stdin-discarder": { - "version": "0.2.2", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/stream-buffers": { - "version": "2.2.0", - "dev": true, - "license": "Unlicense", - "optional": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "packages/app/node_modules/streamsearch": { - "version": "1.1.0", - "engines": { - "node": ">=10.0.0" - } - }, - "packages/app/node_modules/strict-event-emitter": { - "version": "0.5.1", - "license": "MIT" - }, - "packages/app/node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "packages/app/node_modules/string.prototype.includes": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "packages/app/node_modules/string.prototype.matchall": { - "version": "4.0.11", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/string.prototype.repeat": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "packages/app/node_modules/string.prototype.trim": { - "version": "1.2.9", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/string.prototype.trimend": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/stringify-entities": { - "version": "4.0.4", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/strip-eof": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/strip-final-newline": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/strip-outer": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/app/node_modules/strnum": { - "version": "1.0.5", - "license": "MIT" - }, - "packages/app/node_modules/style-to-object": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, - "packages/app/node_modules/styled-components": { - "version": "5.3.11", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "packages/app/node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/styled-jsx": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "packages/app/node_modules/sudo-prompt": { - "version": "9.2.1", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/sumchecker": { - "version": "3.0.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "packages/app/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/symbol-tree": { - "version": "3.2.4", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/tailwind-scrollbar": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "3.x" - } - }, - "packages/app/node_modules/tailwindcss-animate": { - "version": "1.0.7", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "packages/app/node_modules/tapable": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/tar": { - "version": "6.2.1", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "packages/app/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/temp": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "packages/app/node_modules/temp/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "packages/app/node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "packages/app/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/textlinestream": { - "version": "1.1.1", - "license": "MIT" - }, - "packages/app/node_modules/tiny-each-async": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/tinybench": { - "version": "2.9.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/tinypool": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "packages/app/node_modules/tinyrainbow": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/tinyspy": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/tmp": { - "version": "0.2.3", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14.14" - } - }, - "packages/app/node_modules/tmp-promise": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "packages/app/node_modules/tn1150": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=0.12" - } - }, - "packages/app/node_modules/to-data-view": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "optional": true - }, - "packages/app/node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/tough-cookie": { - "version": "4.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "packages/app/node_modules/tr46": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/trim-lines": { - "version": "3.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/trim-repeated": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "packages/app/node_modules/trough": { - "version": "2.2.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/ts-api-utils": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "packages/app/node_modules/ts-node": { - "version": "10.9.2", - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "packages/app/node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "license": "MIT" - }, - "packages/app/node_modules/tsconfig-paths": { - "version": "3.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "packages/app/node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "packages/app/node_modules/tw-to-css": { - "version": "0.0.12", - "license": "MIT", - "dependencies": { - "postcss": "8.4.31", - "postcss-css-variables": "0.18.0", - "tailwindcss": "3.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/app/node_modules/tw-to-css/node_modules/postcss": { - "version": "8.4.31", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "packages/app/node_modules/tw-to-css/node_modules/tailwindcss": { - "version": "3.3.2", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/app/node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "packages/app/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/typed-array-buffer": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "packages/app/node_modules/typed-array-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/typed-array-length": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/typescript": { - "version": "5.5.4", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/app/node_modules/unbox-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/undici-types": { - "version": "5.26.5", - "license": "MIT" - }, - "packages/app/node_modules/unified": { - "version": "11.0.5", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/unique-filename": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/unique-slug": { - "version": "4.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "packages/app/node_modules/unist-util-is": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/unist-util-position": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/unist-util-remove-position": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/unist-util-visit": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/universal-user-agent": { - "version": "6.0.1", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/universalify": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/app/node_modules/unorm": { - "version": "1.6.0", - "dev": true, - "license": "MIT or GPL-2.0", - "optional": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "packages/app/node_modules/update-browserslist-db": { - "version": "1.1.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "packages/app/node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "packages/app/node_modules/url-join": { - "version": "4.0.1", - "license": "MIT" - }, - "packages/app/node_modules/url-parse": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "packages/app/node_modules/use-callback-ref": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/use-file-picker": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "file-selector": "0.2.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16" - } - }, - "packages/app/node_modules/use-sidecar": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/app/node_modules/usehooks-ts": { - "version": "2.16.0", - "license": "MIT", - "dependencies": { - "lodash.debounce": "^4.0.8" - }, - "engines": { - "node": ">=16.15.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "packages/app/node_modules/username": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^1.0.0", - "mem": "^4.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/uuid-random": { - "version": "1.3.2", - "license": "MIT" - }, - "packages/app/node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" - }, - "packages/app/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "packages/app/node_modules/vfile": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/vfile-message": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "packages/app/node_modules/vite": { - "version": "5.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.40", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "packages/app/node_modules/vite-node": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/app/node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "packages/app/node_modules/vitest": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "packages/app/node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "packages/app/node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/app/node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "packages/app/node_modules/web-audio-beat-detector": { - "version": "8.2.12", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3", - "web-audio-beat-detector-broker": "^4.1.11", - "web-audio-beat-detector-worker": "^5.2.54" - } - }, - "packages/app/node_modules/web-audio-beat-detector-broker": { - "version": "4.1.11", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "fast-unique-numbers": "^9.0.7", - "standardized-audio-context": "^25.3.75", - "tslib": "^2.6.3", - "web-audio-beat-detector-worker": "^5.2.54" - } - }, - "packages/app/node_modules/web-audio-beat-detector-worker": { - "version": "5.2.54", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - } - }, - "packages/app/node_modules/web-streams-polyfill": { - "version": "3.3.3", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "packages/app/node_modules/webidl-conversions": { - "version": "7.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/whatwg-encoding": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/whatwg-url": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/which-boxed-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/which-builtin-type": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/which-collection": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/which-typed-array": { - "version": "1.1.15", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/app/node_modules/why-is-node-running": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "packages/app/node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "packages/app/node_modules/ws": { - "version": "8.18.0", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "packages/app/node_modules/xml-name-validator": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "packages/app/node_modules/xmlbuilder": { - "version": "15.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "packages/app/node_modules/xmlchars": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "packages/app/node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4" - } - }, - "packages/app/node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "packages/app/node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "packages/app/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "packages/app/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "packages/app/node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "packages/app/node_modules/yarn-or-npm": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.5", - "pkg-dir": "^4.2.0" - }, - "bin": { - "yarn-or-npm": "bin/index.js", - "yon": "bin/index.js" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "packages/app/node_modules/yarn-or-npm/node_modules/cross-spawn": { - "version": "6.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "packages/app/node_modules/yarn-or-npm/node_modules/path-key": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "packages/app/node_modules/yarn-or-npm/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "packages/app/node_modules/yarn-or-npm/node_modules/shebang-command": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/yarn-or-npm/node_modules/shebang-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/app/node_modules/yarn-or-npm/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "packages/app/node_modules/yauzl": { - "version": "2.10.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "packages/app/node_modules/yn": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/app/node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/app/node_modules/yoga-layout": { - "version": "3.1.0", - "license": "MIT" - }, - "packages/app/node_modules/zod-to-json-schema": { - "version": "3.23.2", - "license": "ISC", - "peerDependencies": { - "zod": "^3.23.3" - } - }, - "packages/app/node_modules/zwitch": { - "version": "2.0.4", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/app/node_modules/zx": { - "version": "8.1.4", - "license": "Apache-2.0", - "bin": { - "zx": "build/cli.js" - }, - "engines": { - "node": ">= 12.17.0" - }, - "optionalDependencies": { - "@types/fs-extra": ">=11", - "@types/node": ">=20" - } - }, - "packages/app/node_modules/zx/node_modules/@types/fs-extra": { - "version": "11.0.4", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - } - } -} diff --git a/package.json b/package.json index 7b3bdcc4..c1cc1d0d 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@clapper/monorepo", + "name": "@aitube/clapper-monorepo", "version": "1.0.0", "private": true, "description": "A monorepo for the Clapper project. Individual packages are in the packages directory.", diff --git a/packages/app/package.json b/packages/app/package.json index 0fe7c484..f5fe21b4 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,5 +1,5 @@ { - "name": "@clapper/app", + "name": "@aitube/clapper", "version": "0.0.8", "private": true, "description": "🎬 Clapper", From 29f4e9178a698d98a14d41bd8ce26c81de4b78fe Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 14 Aug 2024 18:42:01 -0700 Subject: [PATCH 342/346] packages --- packages/app/package-lock.json | 21714 ------------------------------- packages/app/package.json | 2 +- 2 files changed, 1 insertion(+), 21715 deletions(-) delete mode 100644 packages/app/package-lock.json diff --git a/packages/app/package-lock.json b/packages/app/package-lock.json deleted file mode 100644 index ff73b9cc..00000000 --- a/packages/app/package-lock.json +++ /dev/null @@ -1,21714 +0,0 @@ -{ - "name": "clapper", - "version": "0.0.8", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "clapper", - "version": "0.0.8", - "license": "GPL-3.0-only", - "dependencies": { - "@aitube/broadway": "0.2.3", - "@aitube/clap": "0.2.3", - "@aitube/clapper-services": "0.2.3-2", - "@aitube/client": "0.2.3", - "@aitube/engine": "0.2.3", - "@aitube/timeline": "0.2.3", - "@fal-ai/serverless-client": "^0.13.0", - "@ffmpeg/ffmpeg": "^0.12.10", - "@ffmpeg/util": "^0.12.1", - "@gradio/client": "^1.5.0", - "@huggingface/hub": "^0.15.1", - "@huggingface/inference": "^2.8.0", - "@langchain/anthropic": "^0.2.14", - "@langchain/cohere": "^0.2.2", - "@langchain/core": "^0.2.23", - "@langchain/google-vertexai": "^0.0.25", - "@langchain/groq": "^0.0.16", - "@langchain/mistralai": "^0.0.28", - "@langchain/openai": "^0.2.6", - "@monaco-editor/react": "^4.6.0", - "@radix-ui/react-accordion": "^1.1.2", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-checkbox": "^1.0.4", - "@radix-ui/react-collapsible": "^1.0.3", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-menubar": "^1.0.4", - "@radix-ui/react-popover": "^1.0.7", - "@radix-ui/react-progress": "^1.0.3", - "@radix-ui/react-scroll-area": "^1.0.5", - "@radix-ui/react-select": "^2.0.0", - "@radix-ui/react-separator": "^1.0.3", - "@radix-ui/react-slider": "^1.1.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-switch": "^1.0.3", - "@radix-ui/react-tabs": "^1.0.4", - "@radix-ui/react-toast": "^1.1.5", - "@radix-ui/react-tooltip": "^1.0.7", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.106.0", - "@react-three/fiber": "^8.16.6", - "@react-three/uikit": "^0.3.4", - "@react-three/uikit-lucide": "^0.3.4", - "@saintno/comfyui-sdk": "^0.1.11", - "@tailwindcss/container-queries": "^0.1.1", - "@types/dom-speech-recognition": "^0.0.4", - "@types/pngjs": "^6.0.5", - "@xenova/transformers": "github:xenova/transformers.js#v3", - "@xyflow/react": "^12.0.3", - "autoprefixer": "10.4.19", - "base64-arraybuffer": "^1.0.2", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "cmdk": "^0.2.1", - "comfydeploy": "^0.0.21", - "date-fns": "^3.6.0", - "dotenv": "^16.4.5", - "fflate": "^0.8.2", - "fluent-ffmpeg": "^2.1.3", - "framer-motion": "11.1.7", - "fs-extra": "^11.2.0", - "is-hotkey": "^0.2.0", - "lucide-react": "^0.396.0", - "mediainfo.js": "^0.3.2", - "mlt-xml": "^2.0.2", - "monaco-editor": "^0.50.0", - "next": "^14.2.5", - "next-themes": "^0.3.0", - "pngjs": "^7.0.0", - "qs": "^6.12.1", - "query-string": "^9.0.0", - "react": "^18.3.1", - "react-device-frameset": "^1.3.4", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-drag-drop-files": "^2.3.10", - "react-error-boundary": "^4.0.13", - "react-hook-consent": "^3.5.3", - "react-hotkeys-hook": "^4.5.0", - "react-icons": "^5.2.1", - "react-markdown": "^9.0.1", - "react-reflex": "^4.2.6", - "react-speakup": "^1.0.0", - "remark-gfm": "^4.0.0", - "replicate": "^0.32.0", - "sharp": "0.33.4", - "sonner": "^1.5.0", - "tailwind-merge": "^2.5.2", - "tailwindcss-animate": "^1.0.7", - "three": "^0.164.1", - "ts-node": "^10.9.2", - "use-file-picker": "^2.1.2", - "usehooks-ts": "^2.14.0", - "uuid": "^9.0.1", - "web-audio-beat-detector": "^8.2.12", - "yaml": "^2.4.5", - "zustand": "4.5.2", - "zx": "^8.1.4" - }, - "devDependencies": { - "@electron-forge/cli": "^7.4.0", - "@electron-forge/maker-deb": "^7.4.0", - "@electron-forge/maker-dmg": "^7.4.0", - "@electron-forge/maker-rpm": "^7.4.0", - "@electron-forge/maker-squirrel": "^7.4.0", - "@electron-forge/maker-zip": "^7.4.0", - "@electron-forge/plugin-auto-unpack-natives": "^7.4.0", - "@electron-forge/publisher-github": "^7.4.0", - "@playwright/test": "^1.45.1", - "@testing-library/react": "^16.0.0", - "@types/fluent-ffmpeg": "^2.1.24", - "@types/is-hotkey": "^0.1.10", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@types/uuid": "^9.0.8", - "@vitejs/plugin-react": "^4.3.1", - "@webgpu/types": "^0.1.44", - "electron": "^31.2.1", - "eslint": "^8", - "eslint-config-next": "14.2.5", - "eslint-config-prettier": "^9.1.0", - "jsdom": "^24.1.0", - "node-gyp": "^10.2.0", - "postcss": "^8", - "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.5", - "tailwind-scrollbar": "^3.1.0", - "tailwindcss": "^3.4.3", - "typescript": "^5.5.0", - "vitest": "^2.0.2" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-libvips-win32-ia32": "1.0.2", - "@img/sharp-libvips-win32-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/@aitube/broadway": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/broadway/-/broadway-0.2.3.tgz", - "integrity": "sha512-zuJ8zsVbTury3Phw7flMit8TnlnlLaSympkuxdR1Aea5YeZOOZmJh5+S/Y1f+xkcj9wox2ej8J8XGfIJWbd3RA==", - "dependencies": { - "@datagica/parse-entities": "^0.3.0", - "@datagica/parse-names": "^0.0.8", - "indexeddb-fs": "^2.1.5" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/colors": "0.2.3" - } - }, - "node_modules/@aitube/clap": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.2.3.tgz", - "integrity": "sha512-qT0wI6R5BrkIWDr1Dog/GPMYjKnwy5glwO3MibPcM0BWJVQlbj0cy0qbwH+wZPC1ZmRZnaJPlhCEj5e3/U6UsA==", - "dependencies": { - "pure-uuid": "^1.8.1" - }, - "peerDependencies": { - "yaml": "^2.5.0" - } - }, - "node_modules/@aitube/clapper-services": { - "version": "0.2.3-2", - "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.2.3-2.tgz", - "integrity": "sha512-Qd6Riridk4FVcTjlscxw5wsbUgojwi1wkTIjlgPluhT5J5kLyEJQL/hmT2gBDBRsB4kyieVNZiGflgXnauDENw==", - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/timeline": "0.2.3", - "@monaco-editor/react": "4.6.0", - "monaco-editor": "0.50.0", - "react": "*", - "react-dom": "*", - "zustand": "4.5.2" - } - }, - "node_modules/@aitube/client": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/client/-/client-0.2.3.tgz", - "integrity": "sha512-REgFjqvK2I+Qe4tbabHwtU5uNxQwOHMXY2XQAIN34Ff7wrd4Y4vaWB3EZ37l/yKgt7Bd3kldp2ddDt09osedMQ==", - "dependencies": { - "query-string": "^9.0.0" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "node_modules/@aitube/colors": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/colors/-/colors-0.2.3.tgz", - "integrity": "sha512-bqie0eFUG/UA62lhJIibCVPdBNyudqE9YF6HoWMY2JpFtjV3EHJlla3NuXtTgfTgs7XGcmtTyqoXtmPsRSHZtw==", - "peer": true, - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "node_modules/@aitube/engine": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/engine/-/engine-0.2.3.tgz", - "integrity": "sha512-y6KktN1BU5L/WFC5rrNwx0CHdQYM9xPJX1fTPZVDYfZC/6NJhn1Rm1SAnV1SkkP+3NCDQBabKvUivjmZY0CFDw==", - "peerDependencies": { - "@aitube/clap": "0.2.3" - } - }, - "node_modules/@aitube/timeline": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.2.3.tgz", - "integrity": "sha512-zr9G5t/koz/vwXxKHs2qFot5gSau72J+luTfBK0o1tgf/TK/+yP6ACO3QbO8kAmkqa6wtWuBHdVXkVceB8z7Rw==", - "dependencies": { - "date-fns": "^3.6.0", - "react-virtualized-auto-sizer": "^1.0.24" - }, - "peerDependencies": { - "@aitube/clap": "0.2.3", - "@radix-ui/react-slider": "^1.1.2", - "@react-spring/three": "^9.7.3", - "@react-spring/types": "^9.7.3", - "@react-three/drei": "^9.105.4", - "@react-three/fiber": "^8.16.2", - "clsx": "^2.1.1", - "react": "*", - "react-dom": "*", - "tailwind-merge": "^2.4.0", - "tailwindcss": "^3.4.6", - "three": "^0.164.1", - "zustand": "4.5.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.22.0.tgz", - "integrity": "sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", - "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/crc32/node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.624.0.tgz", - "integrity": "sha512-imw3bNptHdhcogU3lwSVlQJsRpTxnkT4bQbchS/qX6+fF0Pk6ERZ+Q0YjzitPqTjkeyAWecUT4riyqv2djo+5w==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sagemaker": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.624.0.tgz", - "integrity": "sha512-J04HAxGhC3dQRn43aPcPL6C+uW0wd0gR/dehFqJJA+XvSNLxa9HEiTjYUHCHUY+iaLQn5QCk7ICKRosynhQkxw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", - "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", - "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", - "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", - "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.624.0.tgz", - "integrity": "sha512-gbXaxZP29yzMmEUzsGqUrHpKBnfMBtemvrlufJbaz/MGJNIa5qtJQp7n1LMI5R49DBVUN9s/e9Rf5liyMvlHiw==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", - "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", - "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.624.0.tgz", - "integrity": "sha512-SX+F5x/w8laQkhXLd1oww2lTuBDJSxzXWyxuOi25a9s4bMDs0V/wOj885Vr6h8QEGi3F8jZ8aWLwpsm2yuk9BA==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/credential-provider-cognito-identity": "3.624.0", - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.374.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.374.0.tgz", - "integrity": "sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==", - "deprecated": "This package has moved to @smithy/protocol-http", - "dependencies": { - "@smithy/protocol-http": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/protocol-http": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", - "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", - "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4": { - "version": "3.374.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.374.0.tgz", - "integrity": "sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==", - "deprecated": "This package has moved to @smithy/signature-v4", - "dependencies": { - "@smithy/signature-v4": "^1.0.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", - "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/signature-v4": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", - "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", - "dependencies": { - "@smithy/eventstream-codec": "^1.1.0", - "@smithy/is-array-buffer": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "@smithy/util-middleware": "^1.1.0", - "@smithy/util-uri-escape": "^1.1.0", - "@smithy/util-utf8": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", - "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", - "dependencies": { - "@smithy/is-array-buffer": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", - "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-middleware": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", - "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-uri-escape": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", - "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", - "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", - "dependencies": { - "@smithy/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@datagica/fast-index": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@datagica/fast-index/-/fast-index-0.1.0.tgz", - "integrity": "sha512-e6jK4wWGROc8lgps2agayuKXQIqOjvTL8brgFLEtzUzYwdVbzfc8foOW4SpmA43/desLU1YgoASredFmmFWqcQ==" - }, - "node_modules/@datagica/parse-entities": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@datagica/parse-entities/-/parse-entities-0.3.0.tgz", - "integrity": "sha512-Ai/SZAANZ4sUpcAIeW8C7M5I5tVymKengXaKYiNtmJmWBl79e+VBWUPxcv2DLmIcZ5CQxWnJUgSVyQ9NIfyQUw==", - "dependencies": { - "@datagica/treegram": "^0.3.0" - } - }, - "node_modules/@datagica/parse-names": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@datagica/parse-names/-/parse-names-0.0.8.tgz", - "integrity": "sha512-wfpGYgJIB35XOPlb4CFC148XrYcbXN+ZP3pt/mSJbxF46tyacgfZ+9+KHfDK0M0H6eKx7Ngm1DhYCbAY3JyXyA==", - "dependencies": { - "@datagica/parse-entities": "^0.2.7" - } - }, - "node_modules/@datagica/parse-names/node_modules/@datagica/fast-index": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@datagica/fast-index/-/fast-index-0.0.7.tgz", - "integrity": "sha512-S0bBOIh15KRjQkUvmGijhPci8K+/k0yw5oatGwDGPL1AOVoJNkXt8d8Dnt71k7uWr1S2k4akIlytkh9V3TrlQw==" - }, - "node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@datagica/parse-entities/-/parse-entities-0.2.8.tgz", - "integrity": "sha512-RP0ol+uG7jzpWR3kBZMtoQ3/8F71Sjrt/3LtDp6By3/8EA5wxeHCXwy8iqFQUpQiC0L1K9sjg0wRjKqLwECw2g==", - "dependencies": { - "@datagica/treegram": "^0.2.8" - } - }, - "node_modules/@datagica/parse-names/node_modules/@datagica/treegram": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@datagica/treegram/-/treegram-0.2.9.tgz", - "integrity": "sha512-IDhQUFmA8TqkjBnJtXRXFTPOPmorJswFEw7k5YCbxvLj7O2hqojs5pfCaS31rdOe0VXxmde+AFidUZqVtLaR6w==", - "dependencies": { - "@datagica/fast-index": "^0.0.7", - "@datagica/tokenize": "^0.0.2" - } - }, - "node_modules/@datagica/tokenize": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@datagica/tokenize/-/tokenize-0.0.2.tgz", - "integrity": "sha512-MmZwlj5yzp3HzFSFEYOCvzC/IURsaQmRuLKy5rfoOzPk7NPHYnq0Vct9MxeZ+3jjRoTHI/PpUlDKKF93ngVe7Q==" - }, - "node_modules/@datagica/treegram": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@datagica/treegram/-/treegram-0.3.0.tgz", - "integrity": "sha512-iZAqiQI1jsgI+MYwbCRhKUpev+eIVyP0JZoL/E7rJE0k5V5yTbunt7K/KyyLYRpGfRIkzaDga1qfr8wrskeJIQ==", - "dependencies": { - "@datagica/fast-index": "^0.1.0", - "@datagica/tokenize": "^0.0.2" - } - }, - "node_modules/@electron-forge/cli": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.4.0.tgz", - "integrity": "sha512-a+zZv3ja/IxkJzNyx4sOHSZv6DPV85S0PEVF6pcRjUpbDL5r+DxjRFsNc0Nq4UIWyFm1nw7RWoPdd9uDst4Tvg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "@electron-forge/core": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@electron/get": "^3.0.0", - "chalk": "^4.0.0", - "commander": "^4.1.1", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "listr2": "^7.0.2", - "semver": "^7.2.1" - }, - "bin": { - "electron-forge": "dist/electron-forge.js", - "electron-forge-vscode-nix": "script/vscode.sh", - "electron-forge-vscode-win": "script/vscode.cmd" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/cli/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/core": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.4.0.tgz", - "integrity": "sha512-pYHKpB2CKeQgWsb+gox+FPkEvP+6Q2zGj2eZtgZRtKppoWIXrHIpOtcm6FllJ/gZ5u4AsQzVIYReAHGaBa0osw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "@electron-forge/core-utils": "7.4.0", - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/plugin-base": "7.4.0", - "@electron-forge/publisher-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "@electron-forge/template-vite": "7.4.0", - "@electron-forge/template-vite-typescript": "7.4.0", - "@electron-forge/template-webpack": "7.4.0", - "@electron-forge/template-webpack-typescript": "7.4.0", - "@electron-forge/tracer": "7.4.0", - "@electron/get": "^3.0.0", - "@electron/packager": "^18.3.1", - "@electron/rebuild": "^3.2.10", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "fast-glob": "^3.2.7", - "filenamify": "^4.1.0", - "find-up": "^5.0.0", - "fs-extra": "^10.0.0", - "got": "^11.8.5", - "interpret": "^3.1.1", - "listr2": "^7.0.2", - "lodash": "^4.17.20", - "log-symbols": "^4.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "rechoir": "^0.8.0", - "resolve-package": "^1.0.1", - "semver": "^7.2.1", - "source-map-support": "^0.5.13", - "sudo-prompt": "^9.1.1", - "username": "^5.1.0", - "yarn-or-npm": "^3.0.1" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/core-utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.4.0.tgz", - "integrity": "sha512-9RLG0F9SX466TpkaTcW+V15KmnGuTpmr7NKMRlngtHXmnkBUJz4Mxp1x33WZLgL90dJrxrRgHSfVBtA4lstDPw==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron/rebuild": "^3.2.10", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "find-up": "^5.0.0", - "fs-extra": "^10.0.0", - "log-symbols": "^4.0.0", - "semver": "^7.2.1", - "yarn-or-npm": "^3.0.1" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/core-utils/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/core/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.4.0.tgz", - "integrity": "sha512-LwWS4VPdwjISl1KpLhmM1Qr1M3sRTTQ/RsX+GlFd7cQ1W/FsgxMjaTG4Od1d+a5CGVTh3s6X2g99TSUfxjOveg==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/maker-base/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-deb": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.4.0.tgz", - "integrity": "sha512-npWea3IpGeu96xNqJpsCOYX6V4E+HY6u/okeTUzUOMX96UteT14MecdUefMam158glRTX84k2ryh7WcBoOa4mg==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-debian": "^3.2.0" - } - }, - "node_modules/@electron-forge/maker-dmg": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.4.0.tgz", - "integrity": "sha512-xRCMNtnpvQNwrDYvwbVFegnErnIMpHGZANrjwushlH9+Fsu60DFvf5s3AVkgsYdQTqlY7wYRG1mziYZmRlPAIw==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-dmg": "^4.0.0" - } - }, - "node_modules/@electron-forge/maker-dmg/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-rpm": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.4.0.tgz", - "integrity": "sha512-N64Yh/K/91GzIk28T1jKsCGgYaquDuhXcEJW+TkVyP5tPZ9aTz9SjXLBxAg8WhcroArAZEsVyPOFKthmFzAUuA==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-installer-redhat": "^3.2.0" - } - }, - "node_modules/@electron-forge/maker-squirrel": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.4.0.tgz", - "integrity": "sha512-mCQyufnSNfjffiKho59ZqVg4W601zGOl6h01OyfDwjOU/G4iQtpnnDEOXGe26q7OVT5ORb1WDnfyGgBeJ6Ge7g==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - }, - "optionalDependencies": { - "electron-winstaller": "^5.3.0" - } - }, - "node_modules/@electron-forge/maker-squirrel/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/maker-zip": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.4.0.tgz", - "integrity": "sha512-UGbMdpuK/P29x1FFRWNOs3bNz+7QNFWVWyTM5hcWqib66cNuUmoaPifQyuwW2POIrIohrxlzLK87/i9Zc8g4dA==", - "dev": true, - "dependencies": { - "@electron-forge/maker-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "cross-zip": "^4.0.0", - "fs-extra": "^10.0.0", - "got": "^11.8.5" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/maker-zip/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/plugin-auto-unpack-natives": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.4.0.tgz", - "integrity": "sha512-jJ/v2blH32bcvdlJbeeW/yO99K9SduW8yrS7zuFN6y+B1cmzLd+S7L8oCcOghFDMAlYjQaBlnCe/nMJbT9mN4g==", - "dev": true, - "dependencies": { - "@electron-forge/plugin-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/plugin-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.4.0.tgz", - "integrity": "sha512-LcTNtEc2YaWvhhqWVIfdJ+J0/krSgc2dqYAHhOH2aLUSm9End3dKO/PZ1Y6DPsiPiJKHnSLBJ/XBN/16NY4Sjw==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/publisher-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.4.0.tgz", - "integrity": "sha512-PiJk4RfaC55SnVnteLW2ZIQNM9DpGOi6YoUn5t8i9UcVp2rFIdya7bJY/b9u1hwubm4d5+TdypMVEuJjM44CJQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/publisher-github": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-github/-/publisher-github-7.4.0.tgz", - "integrity": "sha512-hrxKNssJyU8Yuz0qv384y5RKojMG0nWeG7/kidjp8PX/RnqjGRU/JJ0Worl28g8LGiLt5R5JIfNLngLaFMn8tg==", - "dev": true, - "dependencies": { - "@electron-forge/publisher-base": "7.4.0", - "@electron-forge/shared-types": "7.4.0", - "@octokit/core": "^3.2.4", - "@octokit/plugin-retry": "^3.0.9", - "@octokit/request-error": "^2.0.5", - "@octokit/rest": "^18.0.11", - "@octokit/types": "^6.1.2", - "chalk": "^4.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "log-symbols": "^4.0.0", - "mime-types": "^2.1.25" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/publisher-github/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/shared-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.4.0.tgz", - "integrity": "sha512-5Ehy6enUjBaU08odf9u9TOhmOVXlqobzMvKUixtkdAWgV1XZAUJmn+p21xhj0IkO92MQiXMGv66w9pDNjRT8uQ==", - "dev": true, - "dependencies": { - "@electron-forge/tracer": "7.4.0", - "@electron/packager": "^18.3.1", - "@electron/rebuild": "^3.2.10", - "listr2": "^7.0.2" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-base": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.4.0.tgz", - "integrity": "sha512-3YWdRSGzQfQPQkQxStn2wkJ/SuNGGKo9slwFJGvqMV+Pbx3/M/hYi9sMXOuaqVZgeaBp8Ap27yFPxaIIOC3vcA==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "fs-extra": "^10.0.0", - "username": "^5.1.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-base/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-vite": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.4.0.tgz", - "integrity": "sha512-YPVyCGiBKmZPCxK/Bd2louV3PBcxI2nT2+tRKP+mlEHOWrxbZIfmZSR2lIAFvK/ALKlwUKROdmlwyi7ZcdT7JQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-vite-typescript": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.4.0.tgz", - "integrity": "sha512-wdByG807VWcUd81E6572b/G/Ki8gb+GrCIWxO7Cl3qBa+yNaU1sHhBwB1RyTbQy1r8ubSBtsWrRD1J/yzHKWoQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-vite-typescript/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-vite/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-webpack": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.4.0.tgz", - "integrity": "sha512-W558AEGwQrwEtKIbIJPPs0LIsaC/1Vncj5NgqKehEMJjBb0KQq4hwBu/6dauQrfun4jRCOp7LV+OVrf5XPJ7QA==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-webpack-typescript": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.4.0.tgz", - "integrity": "sha512-O5gwjNSGFNRdJWyiCtevcOBDPAMhgOPvLORh9qR1GcjyTutWwHWmZzycqH+MmkhpQPgrAYDEeipXcOQhSbzNZA==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "7.4.0", - "@electron-forge/template-base": "7.4.0", - "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">= 16.4.0" - } - }, - "node_modules/@electron-forge/template-webpack-typescript/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/template-webpack/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron-forge/tracer": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.4.0.tgz", - "integrity": "sha512-F4jbnDn4yIZjmky1FZ6rgBKTM05AZQQfHkyJW2hdS4pDKJjdKAqWytoZKDi1/S6Cr6tN+DD0TFGD3V0i6HPHYQ==", - "dev": true, - "dependencies": { - "chrome-trace-event": "^1.0.3" - }, - "engines": { - "node": ">= 14.17.5" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", - "dev": true, - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", - "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", - "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "dev": true, - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/packager": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.3.tgz", - "integrity": "sha512-hGXzwbUdxv49XvlYwlVPC6W6j6WaXUAzKkYyyTeiwdhxvHFMfQSEJxVHsQpqMFzZZ7wrr7iqiokOFZ/qkgEzUQ==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "@electron/get": "^3.0.0", - "@electron/notarize": "^2.1.0", - "@electron/osx-sign": "^1.0.5", - "@electron/universal": "^2.0.1", - "@electron/windows-sign": "^1.0.0", - "debug": "^4.0.1", - "extract-zip": "^2.0.0", - "filenamify": "^4.1.0", - "fs-extra": "^11.1.0", - "galactus": "^1.0.0", - "get-package-info": "^1.0.0", - "junk": "^3.1.0", - "parse-author": "^2.0.0", - "plist": "^3.0.0", - "resedit": "^2.0.0", - "resolve": "^1.1.6", - "semver": "^7.1.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "electron-packager": "bin/electron-packager.js" - }, - "engines": { - "node": ">= 16.13.0" - }, - "funding": { - "url": "https://github.com/electron/packager?sponsor=1" - } - }, - "node_modules/@electron/rebuild": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", - "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/@electron/rebuild/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@electron/rebuild/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/rebuild/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@electron/rebuild/node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/@electron/rebuild/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@electron/rebuild/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/windows-sign": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.3.tgz", - "integrity": "sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw==", - "dev": true, - "dependencies": { - "cross-dirname": "^0.1.0", - "debug": "^4.3.4", - "fs-extra": "^11.1.1", - "minimist": "^1.2.8", - "postject": "^1.0.0-alpha.6" - }, - "bin": { - "electron-windows-sign": "bin/electron-windows-sign.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", - "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fal-ai/serverless-client": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@fal-ai/serverless-client/-/serverless-client-0.13.0.tgz", - "integrity": "sha512-Nkb/5YXJIPQHzM79+fRb1LZ1zQLSSvNhDVL2l62sN6/H4XqAWueIOqAAvPF8ds39uSGn8nF1WQV1mt7raVMlWw==", - "dependencies": { - "@msgpack/msgpack": "^3.0.0-beta2", - "eventsource-parser": "^1.1.2", - "robot3": "^0.4.1", - "uuid-random": "^1.3.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ffmpeg/ffmpeg": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.12.10.tgz", - "integrity": "sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ==", - "dependencies": { - "@ffmpeg/types": "^0.12.2" - }, - "engines": { - "node": ">=18.x" - } - }, - "node_modules/@ffmpeg/types": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@ffmpeg/types/-/types-0.12.2.tgz", - "integrity": "sha512-NJtxwPoLb60/z1Klv0ueshguWQ/7mNm106qdHkB4HL49LXszjhjCCiL+ldHJGQ9ai2Igx0s4F24ghigy//ERdA==", - "engines": { - "node": ">=16.x" - } - }, - "node_modules/@ffmpeg/util": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@ffmpeg/util/-/util-0.12.1.tgz", - "integrity": "sha512-10jjfAKWaDyb8+nAkijcsi9wgz/y26LOc1NKJradNMyCIl6usQcBbhkjX5qhALrSBcOy6TOeksunTYa+a03qNQ==", - "engines": { - "node": ">=18.x" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", - "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", - "dependencies": { - "@floating-ui/utils": "^0.2.7" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", - "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", - "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", - "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@gradio/client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@gradio/client/-/client-1.5.0.tgz", - "integrity": "sha512-ZQ1coiujVZjVfas0zyyFgVQOocUL+pnYJagRNfLTzCsJ0m/DXGngELhGTM/QjIVkJGVDuhUyY5VCM7vD1n4LDQ==", - "dependencies": { - "@types/eventsource": "^1.1.15", - "bufferutil": "^4.0.7", - "eventsource": "^2.0.2", - "fetch-event-stream": "^0.1.5", - "msw": "^2.2.1", - "semiver": "^1.1.0", - "textlinestream": "^1.1.1", - "typescript": "^5.0.0", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@huggingface/hub": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-0.15.1.tgz", - "integrity": "sha512-uHb4aFkJDoGfLeRHfFTjkI36Z8IV6Z1c+KzhMDqUSC56opyr7Mn1Nsx7Rri/C7KDwROhQfBp/fOOqqjTzn6Cgg==", - "dependencies": { - "@huggingface/tasks": "^0.10.6", - "hash-wasm": "^4.9.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/inference": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@huggingface/inference/-/inference-2.8.0.tgz", - "integrity": "sha512-Ti681P1qckcCAqgzmL53jBnluPuZGelmMIuXNjgAwC5+RIjF4S0SDQu6oy44ZTwekwNp2ETaZ2sXsOk+45aC4w==", - "dependencies": { - "@huggingface/tasks": "^0.11.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/inference/node_modules/@huggingface/tasks": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.11.8.tgz", - "integrity": "sha512-HOdx2vwhd/rCmy6gpDPiUbsXD+vwVpYSS/h2Tx+yV1uMDfS98MWl/TvoVGV+u5cJWTFbvdiTHMXIuw8B6JbHuQ==" - }, - "node_modules/@huggingface/jinja": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.0.tgz", - "integrity": "sha512-GLJzso0M07ZncFkrJMIXVU4os6GFbPocD4g8fMQPMGJubf48FtGOsUORH2rtFdXPIPelz8SLBMn8ZRmOTwXm9Q==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/tasks": { - "version": "0.10.22", - "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.10.22.tgz", - "integrity": "sha512-sCtp+A6sq6NXoUU7NXuXWoVNNjKddk1GTQIh3cJ6illF8S4zmFoerCVRvFf19BdgICGvF+RVZiv9sGGK9KRDTg==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", - "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", - "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=11", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", - "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "macos": ">=10.13", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", - "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", - "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", - "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", - "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", - "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-win32-ia32": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-win32-ia32/-/sharp-libvips-win32-ia32-1.0.2.tgz", - "integrity": "sha512-NDMPtXP7TTnm7588hpVwzUm48oMH3GOP8UKZLeBpL4yTLY89Jya3QBuKTVkh22GJGs8rV0ben7raSWXWsfMyww==", - "optional": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-win32-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-win32-x64/-/sharp-libvips-win32-x64-1.0.2.tgz", - "integrity": "sha512-rpNEXU8TJSrwmYh/pOoKNxsYcnA92MfuUmNWEz7Twb2kRffK23zIIIIf2Km3wqLhbLR2hqvGB5g2avN9SMQTvg==", - "optional": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", - "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", - "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", - "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.26", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", - "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", - "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "musl": ">=1.2.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.2" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", - "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", - "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", - "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", - "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", - "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.2", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.1.0", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@inquirer/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", - "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "optional": true, - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@langchain/anthropic": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.14.tgz", - "integrity": "sha512-qTFlsMej8SE0hz6IrqcQTkza/TGnlc7Tq/9W65TjQGLX51rGCYkprbLfpTi/LL9gahdB9VvB2Q5knUL0/N/xtQ==", - "dependencies": { - "@anthropic-ai/sdk": "^0.22.0", - "@langchain/core": ">=0.2.21 <0.3.0", - "fast-xml-parser": "^4.4.1", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/cohere": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@langchain/cohere/-/cohere-0.2.2.tgz", - "integrity": "sha512-XbH6vBnPz0dmJaTMKMFriFhh4eYiajYrEg7Jr0bdejj7s7lxhST92znNrJezi76LjSTtDQo3PyLBKDktk8OxKw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "cohere-ai": "^7.10.5", - "uuid": "^10.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/cohere/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/core": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.23.tgz", - "integrity": "sha512-elPg6WpAkxWEIGC9u38F2anbzqfYYEy32lJdsd9dtChcHSFmFLlXqa+SnpO3R772gUuJmcu+Pd+fCvmRFy029w==", - "dependencies": { - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", - "js-tiktoken": "^1.0.12", - "langsmith": "~0.1.39", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "p-retry": "4", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/core/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@langchain/core/node_modules/langsmith": { - "version": "0.1.41", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.41.tgz", - "integrity": "sha512-8R7s/225Pxmv0ipMfd6sqmWVsfHLQivYlQZ0vx5K+ReoknummTenQlVK8gapk3kqRMnzkrouuRHMhWjMR6RgUA==", - "dependencies": { - "@types/uuid": "^9.0.1", - "commander": "^10.0.1", - "p-queue": "^6.6.2", - "p-retry": "4", - "semver": "^7.6.3", - "uuid": "^9.0.0" - }, - "peerDependencies": { - "@langchain/core": "*", - "langchain": "*", - "openai": "*" - }, - "peerDependenciesMeta": { - "@langchain/core": { - "optional": true - }, - "langchain": { - "optional": true - }, - "openai": { - "optional": true - } - } - }, - "node_modules/@langchain/core/node_modules/langsmith/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/core/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/google-common": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/google-common/-/google-common-0.0.25.tgz", - "integrity": "sha512-5k9WrEAVT7po+NBa+36Xr2mkZzbw5JAV9kkdi4hjE3mCK8KS8s1kIqkbKZ4wfYCCP59ZcPs5MZayzbNdq8Dhag==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "uuid": "^10.0.0", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/google-common/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/google-gauth": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/google-gauth/-/google-gauth-0.0.25.tgz", - "integrity": "sha512-M6kFGZNDGwYNQvr0kNCMQEWvxk8P8yGDk/KQul9UjjWrAmJuJ8qsVEtucvTzFIppj4ee6LR5CGxSJSmIynKMhQ==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/google-common": "~0.0.25", - "google-auth-library": "^8.9.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/google-vertexai": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/google-vertexai/-/google-vertexai-0.0.25.tgz", - "integrity": "sha512-hXiTz7gsTXou8CXZVauDmFZWzsjIKUTBUa9hPgpxj/Rh3/EV6esixI9+HWVn20kATjaZ7bY1aD8RI0+krQ52vw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/google-gauth": "~0.0.25" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/groq": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@langchain/groq/-/groq-0.0.16.tgz", - "integrity": "sha512-rwD57PzT54clE4WigMzTMmA9rIifXq82uQ9nqFHJ4hfDV38P2lbQ1/N21QE0+L8c9oKvdY+TVm0vlilxV4w22A==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@langchain/openai": "~0.2.6", - "groq-sdk": "^0.5.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/mistralai": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-0.0.28.tgz", - "integrity": "sha512-6+6AUlRtNTw+fZatbrYNBaZn2Qgn8s+EMBhrpmT5pG4n5usQ57zIKT9VKfv4nJOauBF9J3+3+GiA4bwC8tmkNw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "@mistralai/mistralai": "^0.4.0", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@langchain/mistralai/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/openai": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.6.tgz", - "integrity": "sha512-LZgSzHOZPJGsZr2ZXJICqZo1GN0kUyP9/RN+T45g7HDdMRfS5Df7fJgY9w7EIfznT83Q0Ywhz+At/UvWMR3xhw==", - "dependencies": { - "@langchain/core": ">=0.2.21 <0.3.0", - "js-tiktoken": "^1.0.12", - "openai": "^4.55.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", - "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" - }, - "node_modules/@mistralai/mistralai": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.4.0.tgz", - "integrity": "sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==", - "dependencies": { - "node-fetch": "^2.6.7" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "dependencies": { - "@monaco-editor/loader": "^1.4.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", - "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@msgpack/msgpack": { - "version": "3.0.0-beta2", - "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz", - "integrity": "sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@next/env": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", - "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", - "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", - "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", - "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", - "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.40.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz", - "integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "bottleneck": "^2.15.3" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", - "dev": true, - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.46.0.tgz", - "integrity": "sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w==", - "devOptional": true, - "dependencies": { - "playwright": "1.46.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@pmndrs/uikit": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@pmndrs/uikit/-/uikit-0.3.13.tgz", - "integrity": "sha512-DxKE1kHBnp6C7Bp57KwfPcM4BSwlE+7sbyntwzIyIBHPqH2786nEeZNn5hkYMIw9Gjw1ioEXRLoyIZ16UwYGfQ==", - "dependencies": { - "@preact/signals-core": "^1.5.1", - "inline-style-parser": "^0.2.3", - "node-html-parser": "^6.1.13", - "tw-to-css": "^0.0.12", - "yoga-layout": "^3.0.4" - }, - "peerDependencies": { - "three": ">=0.160" - } - }, - "node_modules/@preact/signals-core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", - "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", - "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.0.tgz", - "integrity": "sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collapsible": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", - "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz", - "integrity": "sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", - "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz", - "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", - "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", - "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", - "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", - "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", - "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", - "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", - "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-icons": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", - "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", - "peerDependencies": { - "react": "^16.x || ^17.x || ^18.x" - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", - "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", - "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.1.tgz", - "integrity": "sha512-V05Hryq/BE2m+rs8d5eLfrS0jmSWSDHEbG7jEyLA5D5J9jTvWj/o3v3xDN9YsOlH6QIkJgiaNDaP+S4T1rdykw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", - "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", - "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", - "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", - "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.0.tgz", - "integrity": "sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", - "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz", - "integrity": "sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", - "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", - "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slider": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", - "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-switch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", - "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", - "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", - "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", - "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", - "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", - "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" - }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" - }, - "node_modules/@react-spring/animated": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.4.tgz", - "integrity": "sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ==", - "dependencies": { - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.4.tgz", - "integrity": "sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw==", - "dependencies": { - "@react-spring/animated": "~9.7.4", - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.4.tgz", - "integrity": "sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA==" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.4.tgz", - "integrity": "sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w==", - "dependencies": { - "@react-spring/rafz": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.4.tgz", - "integrity": "sha512-HKUhrrvWW7F/MAroObOloqcYyFqsUHp1ANIDvPVxk9cSh7veW7gQbJm2Sc7Ka+L4gVJEwSkS+MRfr8kk+sRZBw==", - "dependencies": { - "@react-spring/animated": "~9.7.4", - "@react-spring/core": "~9.7.4", - "@react-spring/shared": "~9.7.4", - "@react-spring/types": "~9.7.4" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.4.tgz", - "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==" - }, - "node_modules/@react-three/drei": { - "version": "9.109.5", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.5.tgz", - "integrity": "sha512-Ftw2d01N+83aXTOOMA5y8hF2KBU0w7gBEctyjeHJihUyRuLBdfcgfu5c1OhBjhrdy23ycSYRINaeLkqUBPDFxQ==", - "dependencies": { - "@babel/runtime": "^7.11.2", - "@mediapipe/tasks-vision": "0.10.8", - "@monogrid/gainmap-js": "^3.0.5", - "@react-spring/three": "~9.6.1", - "@use-gesture/react": "^10.2.24", - "camera-controls": "^2.4.2", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.28", - "glsl-noise": "^0.0.0", - "hls.js": "1.3.5", - "maath": "^0.10.7", - "meshline": "^3.1.6", - "react-composer": "^5.0.3", - "stats-gl": "^2.0.0", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.0", - "three-stdlib": "^2.29.9", - "troika-three-text": "^0.49.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.10.0", - "uuid": "^9.0.1", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=8.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/animated": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", - "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", - "dependencies": { - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/core": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", - "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/rafz": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/rafz": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", - "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" - }, - "node_modules/@react-three/drei/node_modules/@react-spring/shared": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", - "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", - "dependencies": { - "@react-spring/rafz": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/three": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", - "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", - "dependencies": { - "@react-spring/animated": "~9.6.1", - "@react-spring/core": "~9.6.1", - "@react-spring/shared": "~9.6.1", - "@react-spring/types": "~9.6.1" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-three/drei/node_modules/@react-spring/types": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", - "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" - }, - "node_modules/@react-three/drei/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber": { - "version": "8.16.8", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", - "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.1", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@react-three/uikit": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@react-three/uikit/-/uikit-0.3.13.tgz", - "integrity": "sha512-tS6JFpKygxJSCr0z3K7KEv+VFkBQckDgcOpQzcqaCHgDNf/jGr1uudieqCCct31hChO6bosIq42SRhIvR//DnA==", - "dependencies": { - "@pmndrs/uikit": "^0.3.13", - "@preact/signals-core": "^1.5.1", - "chalk": "^5.3.0", - "commander": "^12.0.0", - "ora": "^8.0.1", - "prettier": "^3.2.5", - "prompts": "^2.4.2", - "zod": "^3.22.4", - "zustand": "^4.5.2" - }, - "bin": { - "uikit": "dist/cli/index.js" - }, - "peerDependencies": { - "@react-three/fiber": ">=8", - "react": ">=18" - } - }, - "node_modules/@react-three/uikit-lucide": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@react-three/uikit-lucide/-/uikit-lucide-0.3.13.tgz", - "integrity": "sha512-VFdwvR7YTPlia4o8rsiIbrB6k2d31Bkm/gcEqS/1+J6kkXaLOwGCE0jmmPu3/4um7bsUK83Ni1/KiafhsmBnOQ==", - "dependencies": { - "@react-three/uikit": "^0.3.13" - } - }, - "node_modules/@react-three/uikit/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@react-three/uikit/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@react-three/uikit/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-three/uikit/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" - }, - "node_modules/@react-three/uikit/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-three/uikit/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true - }, - "node_modules/@saintno/comfyui-sdk": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@saintno/comfyui-sdk/-/comfyui-sdk-0.1.11.tgz", - "integrity": "sha512-k8Wui1ejYKOKhEF4WvNiNz3DTCtg+zJSnwKBKP6AHn9xOp+73mNF7F+TXXTTTuq9SCVNQdalEXTkDS6uDnEmxg==", - "dependencies": { - "@types/node": "^22.2.0", - "bun-types": "^1.1.22", - "ws": "^8.18.0" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } - }, - "node_modules/@saintno/comfyui-sdk/node_modules/@types/node": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", - "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", - "dependencies": { - "undici-types": "~6.13.0" - } - }, - "node_modules/@saintno/comfyui-sdk/node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", - "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", - "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^1.2.0", - "@smithy/util-hex-encoding": "^1.1.0", - "tslib": "^2.5.0" - } - }, - "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", - "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tailwindcss/container-queries": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", - "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", - "peerDependencies": { - "tailwindcss": ">=3.2.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", - "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==" - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/dom-speech-recognition": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.4.tgz", - "integrity": "sha512-zf2GwV/G6TdaLwpLDcGTIkHnXf8JEf/viMux+khqKQKDa8/8BAUtXXZS563GnvJ4Fg0PBLGAaFf2GekEVSZ6GQ==" - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/eventsource": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-1.1.15.tgz", - "integrity": "sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==" - }, - "node_modules/@types/fluent-ffmpeg": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.25.tgz", - "integrity": "sha512-a9/Jtv/RVaCG4lUwWIcuClWE5eXJFoFS/oHOecOv/RS8n+lQdJzcJVmDlxA8Xbk4B82YpO88Dijcoljb6sYTcA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/is-hotkey": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.10.tgz", - "integrity": "sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "optional": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" - }, - "node_modules/@types/pngjs": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", - "integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "devOptional": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/stats.js": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", - "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" - }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==" - }, - "node_modules/@types/three": { - "version": "0.167.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.167.1.tgz", - "integrity": "sha512-OCd2Uv/8/4TbmSaIRFawrCOnDMLdpaa+QGJdhlUBmdfbHjLY8k6uFc0tde2/UvcaHQ6NtLl28onj/vJfofV+Tg==", - "peer": true, - "dependencies": { - "@tweenjs/tween.js": "~23.1.2", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" - }, - "node_modules/@types/webxr": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", - "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" - }, - "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dev": true, - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dev": true, - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dev": true, - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@webgpu/types": { - "version": "0.1.44", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.44.tgz", - "integrity": "sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ==", - "dev": true - }, - "node_modules/@xenova/transformers": { - "version": "3.0.0-alpha.0", - "resolved": "git+ssh://git@github.com/xenova/transformers.js.git#222b94ed69158798c463d5fb374efbe44da199da", - "dependencies": { - "@huggingface/jinja": "^0.3.0", - "onnxruntime-web": "^1.18.0", - "sharp": "^0.33.2" - }, - "optionalDependencies": { - "onnxruntime-node": "^1.18.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xyflow/react": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.0.4.tgz", - "integrity": "sha512-eeQzw1gIbLKOB55rp2+20uB1PASDUf1q6zy2VsgugnuPEcL/olVMX3WT42XxyG8m3rcbUiHlq2NSmPTFWEjiUQ==", - "dependencies": { - "@xyflow/system": "0.0.37", - "classcat": "^5.0.3", - "zustand": "^4.4.0" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@xyflow/system": { - "version": "0.0.37", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.37.tgz", - "integrity": "sha512-hSIhezhxgftPUpC+xiQVIorcRILZUOWlLjpYPTyGWRu8s4RJvM4GqvrsFmD5OnMKXLgpU7/PqqUibDVO67oWQQ==", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appdmg": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", - "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "async": "^1.4.2", - "ds-store": "^0.1.5", - "execa": "^1.0.0", - "fs-temp": "^1.0.0", - "fs-xattr": "^0.3.0", - "image-size": "^0.7.4", - "is-my-json-valid": "^2.20.0", - "minimist": "^1.1.3", - "parse-color": "^1.0.0", - "path-exists": "^4.0.0", - "repeat-string": "^1.5.4" - }, - "bin": { - "appdmg": "bin/appdmg.js" - }, - "engines": { - "node": ">=8.5" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "peer": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", - "dev": true, - "optional": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" - } - }, - "node_modules/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "optional": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/automation-events": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/automation-events/-/automation-events-7.0.7.tgz", - "integrity": "sha512-eg7aK2P0jrq4QqnZRWXOQJDYs6lxZXK/erfZ/WPTVPP/YQlgt+J0KvIzTo86zYszkru2J/QCW1FFJYgJVd7TgA==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.2.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", - "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base32-encode": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", - "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", - "dev": true, - "optional": true, - "dependencies": { - "to-data-view": "^1.1.0" - } - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "optional": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/bplist-creator": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", - "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", - "dev": true, - "optional": true, - "dependencies": { - "stream-buffers": "~2.2.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bun-types": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.22.tgz", - "integrity": "sha512-PBgj4pQd+1WZJ8kWCho7D6i1RMS9/6WkiRikIfqYFzFomfyWZET32Wy83xK2zmF9HiKXd2+bjtVahJ6546oraA==", - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/bun-types/node_modules/@types/node": { - "version": "20.12.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", - "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camera-controls": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", - "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "optional": true - }, - "node_modules/class-variance-authority": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", - "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", - "dependencies": { - "clsx": "2.0.0" - }, - "funding": { - "url": "https://joebell.co.uk" - } - }, - "node_modules/class-variance-authority/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", - "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", - "dependencies": { - "@radix-ui/react-dialog": "1.0.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", - "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", - "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", - "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-dismissable-layer": "1.0.0", - "@radix-ui/react-focus-guards": "1.0.0", - "@radix-ui/react-focus-scope": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-portal": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-slot": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", - "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-escape-keydown": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", - "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", - "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", - "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", - "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", - "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", - "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", - "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", - "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cohere-ai": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.11.2.tgz", - "integrity": "sha512-IImDbZLg+kApTH9KswRAEGd0dRuZiChnsqC8gf6RepuklLuSxEkqto4uwSQQSUTj50Ns4uN7yaxzVyS6OmLpIg==", - "dependencies": { - "@aws-sdk/client-sagemaker": "^3.583.0", - "@aws-sdk/credential-providers": "^3.583.0", - "@aws-sdk/protocol-http": "^3.374.0", - "@aws-sdk/signature-v4": "^3.374.0", - "form-data": "^4.0.0", - "form-data-encoder": "^4.0.2", - "formdata-node": "^6.0.3", - "js-base64": "3.7.2", - "node-fetch": "2.7.0", - "qs": "6.11.2", - "readable-stream": "^4.5.2", - "url-join": "4.0.1" - } - }, - "node_modules/cohere-ai/node_modules/form-data-encoder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", - "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", - "engines": { - "node": ">= 18" - } - }, - "node_modules/cohere-ai/node_modules/formdata-node": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", - "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", - "engines": { - "node": ">= 18" - } - }, - "node_modules/cohere-ai/node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", - "dev": true, - "optional": true - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comfydeploy": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/comfydeploy/-/comfydeploy-0.0.21.tgz", - "integrity": "sha512-v5i6igitVWN6jmDlg35g8XyJuGsToD1sbhEZIz4nM3F6gSXZf2YjJzL/wzabsHlOtHhKsO/vdQAXuvO7/w8deQ==", - "dependencies": { - "zod": "^3.22.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/cross-dirname": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", - "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", - "dev": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-zip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", - "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.10" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dev": true, - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decode-uri-component": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", - "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-gpu": { - "version": "5.0.42", - "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.42.tgz", - "integrity": "sha512-Vdhe87ZNhxIS+OGesy9DOx8P3YBbCBapoomGR9kH26HuDAZ6c0FohsrK47j9efL972kLCaD22EbNUYHVLkqx/w==", - "dependencies": { - "webgl-constants": "^1.1.1" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "peer": true - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" - }, - "node_modules/ds-store": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", - "integrity": "sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==", - "dev": true, - "optional": true, - "dependencies": { - "bplist-creator": "~0.0.3", - "macos-alias": "~0.2.5", - "tn1150": "^0.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/electron": { - "version": "31.3.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.3.1.tgz", - "integrity": "sha512-9fiuWlRhBfygtcT+auRd/WdBK/f8LZZcrpx0RjpXhH2DPTP/PfnkC4JB1PW55qCbGbh4wAgkYbf4ExIag8oGCA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-installer-common": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", - "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", - "dev": true, - "optional": true, - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "asar": "^3.0.0", - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "glob": "^7.1.4", - "lodash": "^4.17.15", - "parse-author": "^2.0.0", - "semver": "^7.1.1", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" - }, - "optionalDependencies": { - "@types/fs-extra": "^9.0.1" - } - }, - "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-installer-common/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-debian": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", - "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", - "dev": true, - "optional": true, - "os": [ - "darwin", - "linux" - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "debug": "^4.1.1", - "electron-installer-common": "^0.10.2", - "fs-extra": "^9.0.0", - "get-folder-size": "^2.0.1", - "lodash": "^4.17.4", - "word-wrap": "^1.2.3", - "yargs": "^16.0.2" - }, - "bin": { - "electron-installer-debian": "src/cli.js" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-installer-debian/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-installer-debian/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/electron-installer-debian/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-installer-debian/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "optional": true - }, - "node_modules/electron-installer-debian/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/electron-installer-debian/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-debian/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-dmg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-4.0.0.tgz", - "integrity": "sha512-g3W6XnyUa7QGrAF7ViewHdt6bXV2KYU1Pm1CY3pZpp+H6mOjCHHAhf/iZAxtaX1ERCb+SQHz7xSsAHuNH9I8ZQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^4.3.2", - "minimist": "^1.1.1" - }, - "bin": { - "electron-installer-dmg": "bin/electron-installer-dmg.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "optionalDependencies": { - "appdmg": "^0.6.4" - } - }, - "node_modules/electron-installer-redhat": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", - "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", - "dev": true, - "optional": true, - "os": [ - "darwin", - "linux" - ], - "dependencies": { - "@malept/cross-spawn-promise": "^1.0.0", - "debug": "^4.1.1", - "electron-installer-common": "^0.10.2", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "word-wrap": "^1.2.3", - "yargs": "^16.0.2" - }, - "bin": { - "electron-installer-redhat": "src/cli.js" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/electron-installer-redhat/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/electron-installer-redhat/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/electron-installer-redhat/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/electron-installer-redhat/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "optional": true - }, - "node_modules/electron-installer-redhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-redhat/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-redhat/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-redhat/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/electron-installer-redhat/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-installer-redhat/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==" - }, - "node_modules/electron-winstaller": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", - "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.21", - "temp": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "@electron/windows-sign": "^1.1.2" - } - }, - "node_modules/electron-winstaller/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/electron-winstaller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optional": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-winstaller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/electron/node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/electron/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/electron/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/electron/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true, - "optional": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", - "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.2.5", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", - "dev": true, - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.9.1", - "axobject-query": "~3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz", - "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" - }, - "node_modules/fast-unique-numbers": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.7.tgz", - "integrity": "sha512-K6hYNu8ZsVb7mwmd9OKxHmw4aLa+IFiBxt1e/FZVFFta94ZgNAHqIgUtDzd7AJaVoo/CoNTgr6sj1Dbj3PQPKg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=18.2.0" - } - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-event-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/fetch-event-stream/-/fetch-event-stream-0.1.5.tgz", - "integrity": "sha512-V1PWovkspxQfssq/NnxoEyQo1DV+MRK/laPuPblIZmSjMN8P5u46OhlFQznSr9p/t0Sp8Uc6SbM3yCMfr0KU8g==" - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-selector": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", - "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", - "dependencies": { - "tslib": "^2.0.3" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", - "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/flora-colossus": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", - "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/flora-colossus/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fluent-ffmpeg": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", - "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", - "dependencies": { - "async": "^0.2.9", - "which": "^1.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/fluent-ffmpeg/node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, - "node_modules/fluent-ffmpeg/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/fmix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", - "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", - "dev": true, - "optional": true, - "dependencies": { - "imul": "^1.0.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "11.1.7", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.7.tgz", - "integrity": "sha512-cW11Pu53eDAXUEhv5hEiWuIXWhfkbV32PlgVISn7jRdcAiVrJ1S03YQQ0/DzoswGYYwKi4qYmHHjCzAH52eSdQ==", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-temp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", - "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", - "dev": true, - "optional": true, - "dependencies": { - "random-path": "^0.1.0" - } - }, - "node_modules/fs-xattr": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", - "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/galactus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", - "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "flora-colossus": "^2.0.0", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/galactus/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", - "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "optional": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gaxios/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-property": "^1.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-folder-size": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", - "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", - "dev": true, - "optional": true, - "dependencies": { - "gar": "^1.0.4", - "tiny-each-async": "2.0.3" - }, - "bin": { - "get-folder-size": "bin/get-folder-size" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-installed-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", - "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", - "dev": true, - "dependencies": { - "global-modules": "1.0.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-node-dimensions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz", - "integrity": "sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ==" - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-package-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", - "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", - "dev": true, - "dependencies": { - "bluebird": "^3.1.1", - "debug": "^2.2.0", - "lodash.get": "^4.0.0", - "read-pkg-up": "^2.0.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/get-package-info/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/get-package-info/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glsl-noise": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", - "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" - }, - "node_modules/google-auth-library": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", - "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.3.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-auth-library/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-auth-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/google-p12-pem": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", - "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", - "deprecated": "Package is no longer maintained", - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/groq-sdk": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.5.0.tgz", - "integrity": "sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7", - "web-streams-polyfill": "^3.2.1" - } - }, - "node_modules/groq-sdk/node_modules/@types/node": { - "version": "18.19.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", - "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/gtoken": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", - "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", - "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hash-wasm": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.11.0.tgz", - "integrity": "sha512-HVusNXlVqHe0fzIzdQOGolnFN6mX/fqcrSAOcTBXdvzrXVHwTz11vXeKRmkR5gTuwVpvHZEIyKoePDvuAR+XwQ==" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==" - }, - "node_modules/hls.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", - "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-url-attributes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", - "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", - "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imul": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/indexeddb-fs": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/indexeddb-fs/-/indexeddb-fs-2.1.5.tgz", - "integrity": "sha512-4TDdof4ou+l1P3O9D+U09DAc2VQ/bWzgKBxC3nQ9qqMhNR2Y3p8JDgELzkY3bwLP8JULMTf2UHsjnYpiKExH2w==", - "dependencies": { - "jsonschema": "^1.4.1" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-hotkey": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz", - "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-my-ip-valid": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", - "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", - "dev": true, - "optional": true - }, - "node_modules/is-my-json-valid": { - "version": "2.20.6", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", - "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", - "dev": true, - "optional": true, - "dependencies": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^5.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "dev": true, - "optional": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", - "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-base64": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", - "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" - }, - "node_modules/js-tiktoken": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.12.tgz", - "integrity": "sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==", - "dependencies": { - "base64-js": "^1.5.1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jsdom": { - "version": "24.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", - "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", - "dev": true, - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/listr2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", - "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", - "dev": true, - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.396.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.396.0.tgz", - "integrity": "sha512-N/zP+9vEfEYHiMWMpjwH/M5diaV0e4UFe07BpgdzaRYce5QvXi87hixf7F0Xqdr3zuX/9u7H/2D4MVXIK22O0A==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/maath": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", - "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", - "peerDependencies": { - "@types/three": ">=0.134.0", - "three": ">=0.134.0" - } - }, - "node_modules/macos-alias": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", - "integrity": "sha512-zIUs3+qpml+w3wiRuADutd7XIO8UABqksot10Utl/tji4UxZzLG4fWDC+yJZoO8/Ehg5RqsvSRE/6TS5AEOeWw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "nan": "^2.4.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mediainfo.js": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/mediainfo.js/-/mediainfo.js-0.3.2.tgz", - "integrity": "sha512-SC8z72ESV1z2lq2zfheoo9zgcoqjeBn0mzq6MhIn3aqlkh3RV84FwOiMtYA0HWY7mi1igM89Jcll4r2sk/yyZA==", - "dependencies": { - "yargs": "^17.7.2" - }, - "bin": { - "mediainfo.js": "dist/esm/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/meshline": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", - "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", - "peerDependencies": { - "three": ">=0.137" - } - }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlt-xml": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mlt-xml/-/mlt-xml-2.0.2.tgz", - "integrity": "sha512-UkbC0IaWS1LAIAm99/UukRq1htYTgBsalxUtBAVMUJn7LZl6EqpziU7Sv6dgoeo1UtXsUkWBAc37gwHOdPkoJA==" - }, - "node_modules/monaco-editor": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", - "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/msw": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.5.tgz", - "integrity": "sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==", - "hasInstallScript": true, - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.7.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/msw/node_modules/type-fest": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", - "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/murmur-32": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", - "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", - "dev": true, - "optional": true, - "dependencies": { - "encode-utf8": "^1.0.3", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "dev": true, - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", - "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", - "dependencies": { - "@next/env": "14.2.5", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.5", - "@next/swc-darwin-x64": "14.2.5", - "@next/swc-linux-arm64-gnu": "14.2.5", - "@next/swc-linux-arm64-musl": "14.2.5", - "@next/swc-linux-x64-gnu": "14.2.5", - "@next/swc-linux-x64-musl": "14.2.5", - "@next/swc-win32-arm64-msvc": "14.2.5", - "@next/swc-win32-ia32-msvc": "14.2.5", - "@next/swc-win32-x64-msvc": "14.2.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-themes": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", - "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18", - "react-dom": "^16.8 || ^17 || ^18" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-api-version": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", - "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", - "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz", - "integrity": "sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==" - }, - "node_modules/onnxruntime-node": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.18.0.tgz", - "integrity": "sha512-iTnFcxKpmywCatx8ov4GTbECe3tJk2Bp1OA2mWRJde78q+7tpPYBhKMnwhlaoKy9oKQcy4UoEuuhoy2PSD13ww==", - "hasInstallScript": true, - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "onnxruntime-common": "1.18.0", - "tar": "^7.0.1" - } - }, - "node_modules/onnxruntime-node/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/onnxruntime-node/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "optional": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/onnxruntime-node/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "optional": true, - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/onnxruntime-node/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "optional": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "optional": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/onnxruntime-node/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "optional": true, - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.18.0.tgz", - "integrity": "sha512-o1UKj4ABIj1gmG7ae0RKJ3/GT+3yoF0RRpfDfeoe0huzRW4FDRLfbkDETmdFAvnJEXuYDE0YT+hhkia0352StQ==", - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.18.0", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/openai": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.55.2.tgz", - "integrity": "sha512-Z81nbAPvlLl5eDLNldkixAayhUzbbCbOef/dqqW3uuN0Fkgj5GZn2kgUDTqGPOp2RHtcOYMfZltXNPoC6kEkTQ==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", - "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", - "dev": true, - "dependencies": { - "author-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-color": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", - "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "~0.5.0" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pe-library": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", - "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==", - "dev": true, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, - "node_modules/playwright": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", - "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", - "devOptional": true, - "dependencies": { - "playwright-core": "1.46.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", - "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", - "devOptional": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "engines": { - "node": ">=14.19.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-css-variables": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz", - "integrity": "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==", - "dependencies": { - "balanced-match": "^1.0.0", - "escape-string-regexp": "^1.0.3", - "extend": "^3.0.1" - }, - "peerDependencies": { - "postcss": "^8.2.6" - } - }, - "node_modules/postcss-css-variables/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postject": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", - "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", - "dev": true, - "dependencies": { - "commander": "^9.4.0" - }, - "bin": { - "postject": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/postject/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.5.tgz", - "integrity": "sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==", - "dev": true, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig-melody": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig-melody": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-uuid": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/pure-uuid/-/pure-uuid-1.8.1.tgz", - "integrity": "sha512-PIwHXU7NZb/wTBwUfzCSjI85tfwx6DQOm74sRLtNLH8KHsFZEvAQbBQdz7E5ij8SNSv9WGdQPWiiM6NpNIeNfA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", - "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", - "dependencies": { - "decode-uri-component": "^0.4.1", - "filter-obj": "^5.1.0", - "split-on-first": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/random-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", - "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", - "dev": true, - "optional": true, - "dependencies": { - "base32-encode": "^0.1.0 || ^1.0.0", - "murmur-32": "^0.1.0 || ^0.2.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-composer": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", - "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-device-frameset": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/react-device-frameset/-/react-device-frameset-1.3.4.tgz", - "integrity": "sha512-M9VUa2up9TFOgsELHBFRkZf8ER0AyOYF5+5qbtYseQCZfg6XUxuNDX5VsJNfMGu6Zz6x9Dgh4rfFDFONK9H7dg==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-drag-drop-files": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/react-drag-drop-files/-/react-drag-drop-files-2.3.10.tgz", - "integrity": "sha512-Fv614W9+OtXFB5O+gjompTxQZLYGO7wJeT4paETGiXtiADB9yPOMGYD4A3PMCTY9Be874/wcpl+2dm3MvCIRzg==", - "dependencies": { - "prop-types": "^15.7.2", - "styled-components": "^5.3.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/react-error-boundary": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", - "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-hook-consent": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/react-hook-consent/-/react-hook-consent-3.5.3.tgz", - "integrity": "sha512-/HUD/zw2fJbERVHIMYwbfI5WStizTjgVX7qFS8QLaFTdGOSJ7RLa7zMYrnieqW7KqtL5qriUhxySaATfanAvfA==", - "dependencies": { - "object-hash": "^3.0.0", - "react-toggle": "^4.1.3" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-hotkeys-hook": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.5.0.tgz", - "integrity": "sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==", - "peerDependencies": { - "react": ">=16.8.1", - "react-dom": ">=16.8.1" - } - }, - "node_modules/react-icons": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", - "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "peer": true - }, - "node_modules/react-markdown": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", - "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-measure": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/react-measure/-/react-measure-2.5.2.tgz", - "integrity": "sha512-M+rpbTLWJ3FD6FXvYV6YEGvQ5tMayQ3fGrZhRPHrE9bVlBYfDCLuDcgNttYfk8IqfOI03jz6cbpqMRTUclQnaA==", - "dependencies": { - "@babel/runtime": "^7.2.0", - "get-node-dimensions": "^1.2.1", - "prop-types": "^15.6.2", - "resize-observer-polyfill": "^1.5.0" - }, - "peerDependencies": { - "react": ">0.13.0", - "react-dom": ">0.13.0" - } - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-reflex": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/react-reflex/-/react-reflex-4.2.6.tgz", - "integrity": "sha512-MLGty/ii/BTipKZ47dfs8Ue5g1xqgCxUCDM34ruEr0UVJuXGDzcSX9wPMzRcv4dUR+1tw4hm4c3a6V6hLO2XcA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.5.8", - "react-measure": "^2.0.2" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", - "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-speakup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-speakup/-/react-speakup-1.0.0.tgz", - "integrity": "sha512-uZlLfBrWcdlw9fC6N5NY14GA8olnXh7DNaWNQya1osBPIE2nd/URv3nc6+yXeIlu55bwdGYSPoyAXEo5znN1hg==", - "peerDependencies": { - "react": ">=16" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-toggle": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.3.tgz", - "integrity": "sha512-WoPrvbwfQSvoagbrDnXPrlsxwzuhQIrs+V0I162j/s+4XPgY/YDAUmHSeWiroznfI73wj+MBydvW95zX8ABbSg==", - "dependencies": { - "classnames": "^2.2.5" - }, - "peerDependencies": { - "prop-types": ">= 15.3.0 < 19", - "react": ">= 15.3.0 < 19", - "react-dom": ">= 15.3.0 < 19" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", - "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", - "dependencies": { - "debounce": "^1.2.1" - }, - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - } - }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.24.tgz", - "integrity": "sha512-3kCn7N9NEb3FlvJrSHWGQ4iVl+ydQObq2fHMn12i5wbtm74zHOPhz/i64OL3c1S1vi9i2GXtZqNqUJTQ+BnNfg==", - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replicate": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/replicate/-/replicate-0.32.0.tgz", - "integrity": "sha512-XOJBnV/FpRsz/r7DEj8KL4pdDk9BpptkljGOhKmjlZGdNcBvt532GxxmjT4ZaqdExg7STxrh1JHhI91zg+CZTw==", - "engines": { - "git": ">=2.11.0", - "node": ">=18.0.0", - "npm": ">=7.19.0", - "yarn": ">=1.7.0" - }, - "optionalDependencies": { - "readable-stream": ">=4.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resedit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.2.tgz", - "integrity": "sha512-UKTnq602iVe+W5SyRAQx/WdWMnlDiONfXBLFg/ur4QE4EQQ8eP7Jgm5mNXdK12kKawk1vvXPja2iXKqZiGDW6Q==", - "dev": true, - "dependencies": { - "pe-library": "^1.0.1" - }, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", - "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", - "dev": true, - "dependencies": { - "get-installed-path": "^2.0.3" - }, - "engines": { - "node": ">=4", - "npm": ">=2" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/robot3": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/robot3/-/robot3-0.4.1.tgz", - "integrity": "sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==" - }, - "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semiver": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", - "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/sharp": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.4.tgz", - "integrity": "sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.0" - }, - "engines": { - "libvips": ">=8.15.2", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sonner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", - "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true - }, - "node_modules/split-on-first": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", - "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/standardized-audio-context": { - "version": "25.3.75", - "resolved": "https://registry.npmjs.org/standardized-audio-context/-/standardized-audio-context-25.3.75.tgz", - "integrity": "sha512-N7/Si1d0kuo1umRnWOsQESqxJlkMxBZfdfNRo5HeE7pA0lmo6PNrMkOSiM0NutFxpwA+KcPexo5JkTWWAAUaNQ==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "automation-events": "^7.0.7", - "tslib": "^2.6.3" - } - }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "node_modules/stats-gl": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", - "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", - "dependencies": { - "@types/three": "^0.163.0" - } - }, - "node_modules/stats-gl/node_modules/@types/three": { - "version": "0.163.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", - "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", - "dependencies": { - "@tweenjs/tween.js": "~23.1.1", - "@types/stats.js": "*", - "@types/webxr": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, - "node_modules/stats.js": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", - "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, - "node_modules/styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "dev": true - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tailwind-merge": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", - "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwind-scrollbar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", - "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", - "dev": true, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "3.x" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz", - "integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dev": true, - "optional": true, - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/textlinestream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/textlinestream/-/textlinestream-1.1.1.tgz", - "integrity": "sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/three": { - "version": "0.164.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.164.1.tgz", - "integrity": "sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==" - }, - "node_modules/three-mesh-bvh": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", - "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", - "peerDependencies": { - "three": ">= 0.151.0" - } - }, - "node_modules/three-stdlib": { - "version": "2.32.1", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.1.tgz", - "integrity": "sha512-ZgxxLAwtEaKkvfGP+hkW4s6IaDzif47evTdBPwVvdvLsOul3M6l0D4vO4/fzFguXT6FdoBlaTLhteOcn3uDzPg==", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-stdlib/node_modules/fflate": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" - }, - "node_modules/tiny-each-async": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", - "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", - "dev": true, - "optional": true - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "optional": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/tn1150": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", - "integrity": "sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==", - "dev": true, - "optional": true, - "dependencies": { - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/to-data-view": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", - "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", - "dev": true, - "optional": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/troika-three-text": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", - "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", - "dependencies": { - "bidi-js": "^1.0.2", - "troika-three-utils": "^0.49.0", - "troika-worker-utils": "^0.49.0", - "webgl-sdf-generator": "1.1.1" - }, - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-three-utils": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", - "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", - "peerDependencies": { - "three": ">=0.125.0" - } - }, - "node_modules/troika-worker-utils": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", - "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/tunnel-rat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", - "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", - "dependencies": { - "zustand": "^4.3.2" - } - }, - "node_modules/tw-to-css": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.12.tgz", - "integrity": "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw==", - "dependencies": { - "postcss": "8.4.31", - "postcss-css-variables": "0.18.0", - "tailwindcss": "3.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tw-to-css/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/tw-to-css/node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-file-picker": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/use-file-picker/-/use-file-picker-2.1.2.tgz", - "integrity": "sha512-ZEIzRi1wXeIXDWr5i55gRBVER8rTkSGskDUY94bciTTAZJHlBnOTRLL/LDYjgz6d+US3yELHnRvtBhLxFGtB0A==", - "dependencies": { - "file-selector": "0.2.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16" - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/usehooks-ts": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.16.0.tgz", - "integrity": "sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w==", - "dependencies": { - "lodash.debounce": "^4.0.8" - }, - "engines": { - "node": ">=16.15.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/username": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", - "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "mem": "^4.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uuid-random": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/uuid-random/-/uuid-random-1.3.2.tgz", - "integrity": "sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", - "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.40", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/vitest": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-audio-beat-detector": { - "version": "8.2.12", - "resolved": "https://registry.npmjs.org/web-audio-beat-detector/-/web-audio-beat-detector-8.2.12.tgz", - "integrity": "sha512-wno9QdH3UPtQNu8VSi82z6Q6QiSURI0nRjtlLkfVZ+qvM8ITVq9c+VZFJpbEKR8FsehkVN8i44vqu39zh+m7/g==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3", - "web-audio-beat-detector-broker": "^4.1.11", - "web-audio-beat-detector-worker": "^5.2.54" - } - }, - "node_modules/web-audio-beat-detector-broker": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/web-audio-beat-detector-broker/-/web-audio-beat-detector-broker-4.1.11.tgz", - "integrity": "sha512-meOMbFMmLnAogLW7GiPo0teQho9RitsaB47NPIUy2WMfth4PCps2hgIQoW2DXtNwU0R4p0YEEpZnioXFoRlHqg==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "fast-unique-numbers": "^9.0.7", - "standardized-audio-context": "^25.3.75", - "tslib": "^2.6.3", - "web-audio-beat-detector-worker": "^5.2.54" - } - }, - "node_modules/web-audio-beat-detector-worker": { - "version": "5.2.54", - "resolved": "https://registry.npmjs.org/web-audio-beat-detector-worker/-/web-audio-beat-detector-worker-5.2.54.tgz", - "integrity": "sha512-rFAKJhxUgEpRxJYaWjIDMhQ7tZ6E41LwTQ4GZ3mh95BjBOGpTLMiy+26vBTd2Xkc7E0VWyzhmPNb5/5aBxO6ZQ==", - "dependencies": { - "@babel/runtime": "^7.24.8", - "tslib": "^2.6.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/webgl-constants": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", - "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" - }, - "node_modules/webgl-sdf-generator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", - "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yarn-or-npm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", - "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.5", - "pkg-dir": "^4.2.0" - }, - "bin": { - "yarn-or-npm": "bin/index.js", - "yon": "bin/index.js" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/yarn-or-npm/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/yarn-or-npm/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yarn-or-npm/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/yarn-or-npm/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-or-npm/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-or-npm/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoga-layout": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.1.0.tgz", - "integrity": "sha512-auzJ8lEovThZIpR8wLGWNo/JEj4VTO79q9/gOJ0dWb3shAYPFdX3t9VN0fC0v+jeQF77STUdCzebLwRMqzn5gQ==" - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", - "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", - "peerDependencies": { - "zod": "^3.23.3" - } - }, - "node_modules/zustand": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", - "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/zx": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/zx/-/zx-8.1.4.tgz", - "integrity": "sha512-QFDYYpnzdpRiJ3dL2102Cw26FpXpWshW4QLTGxiYfIcwdAqg084jRCkK/kuP/NOSkxOjydRwNFG81qzA5r1a6w==", - "bin": { - "zx": "build/cli.js" - }, - "engines": { - "node": ">= 12.17.0" - }, - "optionalDependencies": { - "@types/fs-extra": ">=11", - "@types/node": ">=20" - } - }, - "node_modules/zx/node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "optional": true, - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - } - } -} diff --git a/packages/app/package.json b/packages/app/package.json index f5fe21b4..9bac7898 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -36,7 +36,7 @@ "electron:make": "npm run build && electron-forge make" }, "dependencies": { - "@aitube/broadway": "0.2.3", + "@aitube/broadway": "file:../broadway", "@aitube/clap": "0.2.3", "@aitube/clapper-services": "0.2.3-2", "@aitube/client": "0.2.3", From 3e03786e1a6102237ff7d7f4bbf0e2e4d63b1c09 Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 14 Aug 2024 18:55:17 -0700 Subject: [PATCH 343/346] move packages and add file links --- package.json | 2 +- packages/{aitube-clap => api-client}/.gitignore | 0 packages/{aitube-clap => api-client}/.npmignore | 0 .../{aitube-clap => api-client}/.prettierrc.json | 0 packages/{aitube-clap => api-client}/LICENSE.md | 0 packages/{aitube-client => api-client}/README.md | 0 packages/{aitube-client => api-client}/bun.lockb | Bin packages/{aitube-client => api-client}/package.json | 2 +- .../src/api/createClap.ts | 0 .../src/api/editClapDialogues.ts | 0 .../src/api/editClapEntities.ts | 0 .../src/api/editClapMusic.ts | 0 .../src/api/editClapSounds.ts | 0 .../src/api/editClapStory.ts | 0 .../src/api/editClapStoryboards.ts | 0 .../src/api/editClapVideos.ts | 0 .../src/api/exportClapToVideo.ts | 0 .../{aitube-client => api-client}/src/api/index.ts | 0 .../src/constants/config.ts | 0 .../src/constants/defaultValues.ts | 0 .../src/constants/index.ts | 0 .../src/constants/types.ts | 0 packages/{aitube-client => api-client}/src/index.ts | 0 .../src/parsers/index.ts | 0 .../src/parsers/parseEntityPrompt.ts | 0 .../src/parsers/parseString.ts | 0 .../src/parsers/parseStringArray.ts | 0 .../src/utils/applyClapCompletion.ts | 0 .../src/utils/index.ts | 0 packages/{aitube-clap => api-client}/tsconfig.json | 0 .../{aitube-clap => api-client}/tsconfig.types.json | 0 packages/app/package.json | 10 +++++----- packages/broadway/package.json | 6 +++--- .../{aitube-clapper-services => clap}/.gitignore | 0 .../{aitube-clapper-services => clap}/.npmignore | 0 .../.prettierrc.json | 0 .../{aitube-clapper-services => clap}/LICENSE.md | 0 packages/{aitube-clap => clap}/README.md | 0 packages/{aitube-clap => clap}/bun.lockb | Bin packages/{aitube-clap => clap}/package.json | 0 .../src/constants/defaultValues.ts | 0 .../{aitube-clap => clap}/src/constants/index.ts | 0 .../src/converters/blobToDataUri.ts | 0 .../src/converters/clapToDataUri.ts | 0 .../src/converters/dataUriToBlob.ts | 0 .../{aitube-clap => clap}/src/converters/index.ts | 0 .../{aitube-clap => clap}/src/factories/index.ts | 0 .../{aitube-clap => clap}/src/factories/newClap.ts | 0 .../src/factories/newEntity.ts | 0 .../src/factories/newSegment.ts | 0 .../src/factories/newWorkflow.ts | 0 .../{aitube-clap => clap}/src/helpers/README.md | 0 .../src/helpers/buildEntityIndex.ts | 0 .../src/helpers/filterAssets.ts | 0 .../src/helpers/filterSegmentsByCategory.ts | 0 .../src/helpers/generateClapFromSimpleStory.ts | 0 .../src/helpers/getEmptyClap.ts | 0 packages/{aitube-clap => clap}/src/helpers/index.ts | 0 .../src/helpers/removeGeneratedAssetUrls.ts | 0 packages/{aitube-clap => clap}/src/index.ts | 0 packages/{aitube-clap => clap}/src/io/fetchClap.ts | 0 packages/{aitube-clap => clap}/src/io/index.ts | 0 packages/{aitube-clap => clap}/src/io/parseClap.ts | 0 .../{aitube-clap => clap}/src/io/serializeClap.ts | 0 packages/{aitube-clap => clap}/src/io/updateClap.ts | 0 .../{aitube-clap => clap}/src/samples/stories.ts | 0 .../{aitube-clap => clap}/src/sanitizers/index.ts | 0 .../src/sanitizers/sanitizeEntities.ts | 0 .../src/sanitizers/sanitizeEntity.ts | 0 .../src/sanitizers/sanitizeMeta.ts | 0 .../src/sanitizers/sanitizeSegment.ts | 0 .../src/sanitizers/sanitizeSegments.ts | 0 .../src/sanitizers/sanitizeWorkflow.ts | 0 .../src/sanitizers/sanitizeWorkflows.ts | 0 packages/{aitube-clap => clap}/src/types.ts | 0 .../src/utils/filterSegments.ts | 0 .../src/utils/filterSegmentsWithinRange.ts | 0 .../{aitube-clap => clap}/src/utils/generateSeed.ts | 0 .../src/utils/getClapAssetSourceType.ts | 0 .../src/utils/getValidNumber.ts | 0 packages/{aitube-clap => clap}/src/utils/index.ts | 0 .../src/utils/isValidNumber.ts | 0 .../src/utils/parseMediaOrientation.ts | 0 .../src/utils/parseOutputType.ts | 0 .../src/utils/parseSegmentCategory.ts | 0 .../src/utils/parseSegmentStatus.ts | 0 .../src/utils/parseWorkflowCategory.ts | 0 .../src/utils/parseWorkflowEngine.ts | 0 .../src/utils/parseWorkflowProvider.ts | 0 packages/{aitube-clap => clap}/src/utils/uuid.ts | 0 .../{aitube-clapper-services => clap}/tsconfig.json | 0 .../tsconfig.types.json | 0 packages/{aitube-client => engine}/.gitignore | 0 packages/{aitube-client => engine}/.npmignore | 0 packages/{aitube-client => engine}/.prettierrc.json | 0 packages/{aitube-client => engine}/LICENSE.md | 0 packages/{aitube-engine => engine}/README.md | 0 packages/{aitube-engine => engine}/bun.lockb | Bin packages/{aitube-engine => engine}/package.json | 2 +- packages/{aitube-engine => engine}/src/index.ts | 0 .../src/prompts/getBackgroundAudioPrompt.ts | 0 .../src/prompts/getCharacterPrompt.ts | 0 .../src/prompts/getCharacterReferencePrompt.ts | 0 .../src/prompts/getMusicPrompt.ts | 0 .../src/prompts/getPositivePrompt.ts | 0 .../src/prompts/getSoundPrompt.ts | 0 .../src/prompts/getSpeechBackgroundAudioPrompt.ts | 0 .../src/prompts/getSpeechForegroundAudioPrompt.ts | 0 .../src/prompts/getVideoPrompt.ts | 0 .../{aitube-engine => engine}/src/prompts/index.ts | 0 .../src/prompts/priorities.ts | 0 .../src/renderers/index.ts | 0 .../renderers/storyboard/renderShotToStoryboard.ts | 0 .../src/renderers/video/renderShotToVideo.ts | 0 packages/{aitube-engine => engine}/src/types.ts | 0 .../src/utils/deduplicate.ts | 0 .../src/utils/deduplicatePrompt.ts | 0 .../{aitube-engine => engine}/src/utils/index.ts | 0 packages/{aitube-client => engine}/tsconfig.json | 0 .../{aitube-client => engine}/tsconfig.types.json | 0 packages/{aitube-engine => services}/.gitignore | 0 packages/{aitube-engine => services}/.npmignore | 0 .../{aitube-engine => services}/.prettierrc.json | 0 packages/{aitube-engine => services}/LICENSE.md | 0 .../{aitube-clapper-services => services}/README.md | 0 .../{aitube-clapper-services => services}/bun.lockb | Bin .../package.json | 4 ++-- .../src/assistant.ts | 0 .../src/audio.ts | 0 .../src/base-types.ts | 0 .../src/broadcast.ts | 0 .../src/editors.ts | 0 .../src/entity-editor.ts | 0 .../src/filter-editor.ts | 0 .../src/index.ts | 0 .../{aitube-clapper-services => services}/src/io.ts | 0 .../src/mic.ts | 0 .../src/monitor.ts | 0 .../src/plugin.ts | 0 .../src/plugins.ts | 0 .../src/project-editor.ts | 0 .../src/renderer.ts | 0 .../src/resolver.ts | 0 .../src/script-editor.ts | 0 .../src/segment-editor.ts | 0 .../src/services.ts | 0 .../src/settings.ts | 0 .../src/simulator.ts | 0 .../src/speech.d.ts | 0 .../src/tasks.ts | 0 .../src/types.ts | 0 .../{aitube-clapper-services => services}/src/ui.ts | 0 .../src/version-control.ts | 0 .../src/workflow-editor.ts | 0 packages/{aitube-engine => services}/tsconfig.json | 0 .../{aitube-engine => services}/tsconfig.types.json | 0 packages/{aitube-timeline => timeline}/.gitignore | 0 packages/{aitube-timeline => timeline}/.npmignore | 0 .../{aitube-timeline => timeline}/.prettierrc.json | 0 packages/{aitube-timeline => timeline}/LICENSE.md | 0 packages/{aitube-timeline => timeline}/README.md | 0 packages/{aitube-timeline => timeline}/bun.lockb | Bin packages/{aitube-timeline => timeline}/index.html | 0 packages/{aitube-timeline => timeline}/package.json | 2 +- .../src/ClapTimeline.tsx | 0 .../src/components/camera/TimelineCamera.tsx | 0 .../src/components/camera/index.ts | 0 .../src/components/camera/types.tsx | 0 .../src/components/cells/AudioCell.tsx | 0 .../src/components/cells/Cell.tsx | 0 .../src/components/cells/ImageCell.tsx | 0 .../src/components/cells/RedrawButton.tsx | 0 .../src/components/cells/TextCell.tsx | 0 .../src/components/cells/VideoCell.tsx | 0 .../src/components/cells/Waveform.tsx | 0 .../src/components/cells/index.tsx | 0 .../src/components/cells/types.ts | 0 .../src/components/controls/TimelineControls.tsx | 0 .../src/components/controls/index.ts | 0 .../src/components/controls/types.ts | 0 .../src/components/icons/SegmentIcon.tsx | 0 .../src/components/icons/SvgIcon.tsx | 0 .../src/components/icons/SvgShapeMesh.tsx | 0 .../src/components/icons/icons.ts | 0 .../src/components/icons/loadSvgShapes.ts | 0 .../src/components/icons/segmentIcons.ts | 0 .../src/components/icons/types.ts | 0 .../src/components/icons/useSvgShapes.ts | 0 .../src/components/index.ts | 0 .../src/components/scroller/HorizontalScroller.tsx | 0 .../src/components/scroller/VerticalScroller.tsx | 0 .../src/components/scroller/index.ts | 0 .../src/components/slider/HorizontalSlider.tsx | 0 .../src/components/slider/TimelineSlider.tsx | 0 .../src/components/slider/TimelineSliderBase.tsx | 0 .../src/components/slider/VerticalSlider.tsx | 0 .../src/components/slider/index.ts | 0 .../src/components/timeline/Cells.tsx | 0 .../src/components/timeline/Cursor.tsx | 0 .../src/components/timeline/CursorWeird.tsx | 0 .../src/components/timeline/Grid.tsx | 0 .../src/components/timeline/LeftBarTrackScale.tsx | 0 .../src/components/timeline/Timeline.tsx | 0 .../src/components/timeline/TopBarTimeScale.tsx | 0 .../src/components/timeline/index.ts | 0 .../src/components/timeline/types.ts | 0 .../src/compute/README.md | 0 .../src/compute/computeCellHeight.ts | 0 .../src/compute/computeContentSizeMetrics.ts | 0 .../src/constants/defaults.ts | 0 .../src/constants/grid.ts | 0 .../src/constants/index.ts | 0 .../src/constants/priorities.ts | 0 .../src/constants/themes.ts | 0 packages/{aitube-timeline => timeline}/src/demo.tsx | 0 .../src/hooks/index.ts | 0 .../src/hooks/useAnimationFrame.ts | 0 .../src/hooks/useAxis.ts | 0 .../src/hooks/useCursorGeometry.ts | 0 .../src/hooks/useDebounce.ts | 0 .../src/hooks/useHorizontalGridLines.ts | 0 .../src/hooks/useHorizontalTrackLines.ts | 0 .../src/hooks/useHoveredSegment.ts | 0 .../src/hooks/useSegment.ts | 0 .../src/hooks/useSegmentChanges.ts | 0 .../src/hooks/useSegmentLoader.ts | 0 .../src/hooks/useTimeScaleGraduations.ts | 0 .../src/hooks/useTimeline.ts | 0 .../src/hooks/useVerticalGridLines.ts | 0 .../{aitube-timeline => timeline}/src/index.tsx | 0 .../{aitube-timeline => timeline}/src/types/grid.ts | 0 .../src/types/index.ts | 0 .../src/types/rendering.ts | 0 .../src/types/theme.ts | 0 .../src/types/timeline.ts | 0 .../src/utils/clamp.ts | 0 .../src/utils/clapSegmentToTimelineSegment.ts | 0 .../{aitube-timeline => timeline}/src/utils/cn.ts | 0 .../src/utils/debounceAsync.ts | 0 .../src/utils/debounceSync.ts | 0 .../src/utils/findFreeTrack.ts | 0 .../src/utils/formatTimestamp.ts | 0 .../src/utils/getAudioBuffer.ts | 0 .../src/utils/getDefaultState.ts | 0 .../src/utils/getFinalVideo.ts | 0 .../src/utils/getTextLength.ts | 0 .../src/utils/hslToHex.ts | 0 .../src/utils/index.ts | 0 .../src/utils/parseRenderingStrategy.ts | 0 .../src/utils/readFileAsArrayBuffer.ts | 0 ...removeFinalVideosAndConvertToTimelineSegments.ts | 0 .../src/utils/similar.ts | 0 .../src/utils/sleep.ts | 0 .../src/utils/sliceSegments.ts | 0 .../src/utils/throttle.ts | 0 .../src/utils/timelineSegmentToClapSegment.ts | 0 .../tailwind.config.js | 0 .../{aitube-timeline => timeline}/test/test.tsx | 0 .../{aitube-timeline => timeline}/tsconfig.json | 0 .../tsconfig.node.json | 0 .../tsconfig.types.json | 0 .../{aitube-timeline => timeline}/vite.config.js | 0 262 files changed, 14 insertions(+), 14 deletions(-) rename packages/{aitube-clap => api-client}/.gitignore (100%) rename packages/{aitube-clap => api-client}/.npmignore (100%) rename packages/{aitube-clap => api-client}/.prettierrc.json (100%) rename packages/{aitube-clap => api-client}/LICENSE.md (100%) rename packages/{aitube-client => api-client}/README.md (100%) rename packages/{aitube-client => api-client}/bun.lockb (100%) rename packages/{aitube-client => api-client}/package.json (97%) rename packages/{aitube-client => api-client}/src/api/createClap.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapDialogues.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapEntities.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapMusic.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapSounds.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapStory.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapStoryboards.ts (100%) rename packages/{aitube-client => api-client}/src/api/editClapVideos.ts (100%) rename packages/{aitube-client => api-client}/src/api/exportClapToVideo.ts (100%) rename packages/{aitube-client => api-client}/src/api/index.ts (100%) rename packages/{aitube-client => api-client}/src/constants/config.ts (100%) rename packages/{aitube-client => api-client}/src/constants/defaultValues.ts (100%) rename packages/{aitube-client => api-client}/src/constants/index.ts (100%) rename packages/{aitube-client => api-client}/src/constants/types.ts (100%) rename packages/{aitube-client => api-client}/src/index.ts (100%) rename packages/{aitube-client => api-client}/src/parsers/index.ts (100%) rename packages/{aitube-client => api-client}/src/parsers/parseEntityPrompt.ts (100%) rename packages/{aitube-client => api-client}/src/parsers/parseString.ts (100%) rename packages/{aitube-client => api-client}/src/parsers/parseStringArray.ts (100%) rename packages/{aitube-client => api-client}/src/utils/applyClapCompletion.ts (100%) rename packages/{aitube-client => api-client}/src/utils/index.ts (100%) rename packages/{aitube-clap => api-client}/tsconfig.json (100%) rename packages/{aitube-clap => api-client}/tsconfig.types.json (100%) rename packages/{aitube-clapper-services => clap}/.gitignore (100%) rename packages/{aitube-clapper-services => clap}/.npmignore (100%) rename packages/{aitube-clapper-services => clap}/.prettierrc.json (100%) rename packages/{aitube-clapper-services => clap}/LICENSE.md (100%) rename packages/{aitube-clap => clap}/README.md (100%) rename packages/{aitube-clap => clap}/bun.lockb (100%) rename packages/{aitube-clap => clap}/package.json (100%) rename packages/{aitube-clap => clap}/src/constants/defaultValues.ts (100%) rename packages/{aitube-clap => clap}/src/constants/index.ts (100%) rename packages/{aitube-clap => clap}/src/converters/blobToDataUri.ts (100%) rename packages/{aitube-clap => clap}/src/converters/clapToDataUri.ts (100%) rename packages/{aitube-clap => clap}/src/converters/dataUriToBlob.ts (100%) rename packages/{aitube-clap => clap}/src/converters/index.ts (100%) rename packages/{aitube-clap => clap}/src/factories/index.ts (100%) rename packages/{aitube-clap => clap}/src/factories/newClap.ts (100%) rename packages/{aitube-clap => clap}/src/factories/newEntity.ts (100%) rename packages/{aitube-clap => clap}/src/factories/newSegment.ts (100%) rename packages/{aitube-clap => clap}/src/factories/newWorkflow.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/README.md (100%) rename packages/{aitube-clap => clap}/src/helpers/buildEntityIndex.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/filterAssets.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/filterSegmentsByCategory.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/generateClapFromSimpleStory.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/getEmptyClap.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/index.ts (100%) rename packages/{aitube-clap => clap}/src/helpers/removeGeneratedAssetUrls.ts (100%) rename packages/{aitube-clap => clap}/src/index.ts (100%) rename packages/{aitube-clap => clap}/src/io/fetchClap.ts (100%) rename packages/{aitube-clap => clap}/src/io/index.ts (100%) rename packages/{aitube-clap => clap}/src/io/parseClap.ts (100%) rename packages/{aitube-clap => clap}/src/io/serializeClap.ts (100%) rename packages/{aitube-clap => clap}/src/io/updateClap.ts (100%) rename packages/{aitube-clap => clap}/src/samples/stories.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/index.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeEntities.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeEntity.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeMeta.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeSegment.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeSegments.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeWorkflow.ts (100%) rename packages/{aitube-clap => clap}/src/sanitizers/sanitizeWorkflows.ts (100%) rename packages/{aitube-clap => clap}/src/types.ts (100%) rename packages/{aitube-clap => clap}/src/utils/filterSegments.ts (100%) rename packages/{aitube-clap => clap}/src/utils/filterSegmentsWithinRange.ts (100%) rename packages/{aitube-clap => clap}/src/utils/generateSeed.ts (100%) rename packages/{aitube-clap => clap}/src/utils/getClapAssetSourceType.ts (100%) rename packages/{aitube-clap => clap}/src/utils/getValidNumber.ts (100%) rename packages/{aitube-clap => clap}/src/utils/index.ts (100%) rename packages/{aitube-clap => clap}/src/utils/isValidNumber.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseMediaOrientation.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseOutputType.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseSegmentCategory.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseSegmentStatus.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseWorkflowCategory.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseWorkflowEngine.ts (100%) rename packages/{aitube-clap => clap}/src/utils/parseWorkflowProvider.ts (100%) rename packages/{aitube-clap => clap}/src/utils/uuid.ts (100%) rename packages/{aitube-clapper-services => clap}/tsconfig.json (100%) rename packages/{aitube-clapper-services => clap}/tsconfig.types.json (100%) rename packages/{aitube-client => engine}/.gitignore (100%) rename packages/{aitube-client => engine}/.npmignore (100%) rename packages/{aitube-client => engine}/.prettierrc.json (100%) rename packages/{aitube-client => engine}/LICENSE.md (100%) rename packages/{aitube-engine => engine}/README.md (100%) rename packages/{aitube-engine => engine}/bun.lockb (100%) rename packages/{aitube-engine => engine}/package.json (96%) rename packages/{aitube-engine => engine}/src/index.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getBackgroundAudioPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getCharacterPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getCharacterReferencePrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getMusicPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getPositivePrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getSoundPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getSpeechBackgroundAudioPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getSpeechForegroundAudioPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/getVideoPrompt.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/index.ts (100%) rename packages/{aitube-engine => engine}/src/prompts/priorities.ts (100%) rename packages/{aitube-engine => engine}/src/renderers/index.ts (100%) rename packages/{aitube-engine => engine}/src/renderers/storyboard/renderShotToStoryboard.ts (100%) rename packages/{aitube-engine => engine}/src/renderers/video/renderShotToVideo.ts (100%) rename packages/{aitube-engine => engine}/src/types.ts (100%) rename packages/{aitube-engine => engine}/src/utils/deduplicate.ts (100%) rename packages/{aitube-engine => engine}/src/utils/deduplicatePrompt.ts (100%) rename packages/{aitube-engine => engine}/src/utils/index.ts (100%) rename packages/{aitube-client => engine}/tsconfig.json (100%) rename packages/{aitube-client => engine}/tsconfig.types.json (100%) rename packages/{aitube-engine => services}/.gitignore (100%) rename packages/{aitube-engine => services}/.npmignore (100%) rename packages/{aitube-engine => services}/.prettierrc.json (100%) rename packages/{aitube-engine => services}/LICENSE.md (100%) rename packages/{aitube-clapper-services => services}/README.md (100%) rename packages/{aitube-clapper-services => services}/bun.lockb (100%) rename packages/{aitube-clapper-services => services}/package.json (94%) rename packages/{aitube-clapper-services => services}/src/assistant.ts (100%) rename packages/{aitube-clapper-services => services}/src/audio.ts (100%) rename packages/{aitube-clapper-services => services}/src/base-types.ts (100%) rename packages/{aitube-clapper-services => services}/src/broadcast.ts (100%) rename packages/{aitube-clapper-services => services}/src/editors.ts (100%) rename packages/{aitube-clapper-services => services}/src/entity-editor.ts (100%) rename packages/{aitube-clapper-services => services}/src/filter-editor.ts (100%) rename packages/{aitube-clapper-services => services}/src/index.ts (100%) rename packages/{aitube-clapper-services => services}/src/io.ts (100%) rename packages/{aitube-clapper-services => services}/src/mic.ts (100%) rename packages/{aitube-clapper-services => services}/src/monitor.ts (100%) rename packages/{aitube-clapper-services => services}/src/plugin.ts (100%) rename packages/{aitube-clapper-services => services}/src/plugins.ts (100%) rename packages/{aitube-clapper-services => services}/src/project-editor.ts (100%) rename packages/{aitube-clapper-services => services}/src/renderer.ts (100%) rename packages/{aitube-clapper-services => services}/src/resolver.ts (100%) rename packages/{aitube-clapper-services => services}/src/script-editor.ts (100%) rename packages/{aitube-clapper-services => services}/src/segment-editor.ts (100%) rename packages/{aitube-clapper-services => services}/src/services.ts (100%) rename packages/{aitube-clapper-services => services}/src/settings.ts (100%) rename packages/{aitube-clapper-services => services}/src/simulator.ts (100%) rename packages/{aitube-clapper-services => services}/src/speech.d.ts (100%) rename packages/{aitube-clapper-services => services}/src/tasks.ts (100%) rename packages/{aitube-clapper-services => services}/src/types.ts (100%) rename packages/{aitube-clapper-services => services}/src/ui.ts (100%) rename packages/{aitube-clapper-services => services}/src/version-control.ts (100%) rename packages/{aitube-clapper-services => services}/src/workflow-editor.ts (100%) rename packages/{aitube-engine => services}/tsconfig.json (100%) rename packages/{aitube-engine => services}/tsconfig.types.json (100%) rename packages/{aitube-timeline => timeline}/.gitignore (100%) rename packages/{aitube-timeline => timeline}/.npmignore (100%) rename packages/{aitube-timeline => timeline}/.prettierrc.json (100%) rename packages/{aitube-timeline => timeline}/LICENSE.md (100%) rename packages/{aitube-timeline => timeline}/README.md (100%) rename packages/{aitube-timeline => timeline}/bun.lockb (100%) rename packages/{aitube-timeline => timeline}/index.html (100%) rename packages/{aitube-timeline => timeline}/package.json (98%) rename packages/{aitube-timeline => timeline}/src/ClapTimeline.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/camera/TimelineCamera.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/camera/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/camera/types.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/AudioCell.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/Cell.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/ImageCell.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/RedrawButton.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/TextCell.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/VideoCell.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/Waveform.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/index.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/cells/types.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/controls/TimelineControls.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/controls/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/controls/types.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/SegmentIcon.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/SvgIcon.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/SvgShapeMesh.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/icons.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/loadSvgShapes.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/segmentIcons.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/types.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/icons/useSvgShapes.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/scroller/HorizontalScroller.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/scroller/VerticalScroller.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/scroller/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/slider/HorizontalSlider.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/slider/TimelineSlider.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/slider/TimelineSliderBase.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/slider/VerticalSlider.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/slider/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/Cells.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/Cursor.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/CursorWeird.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/Grid.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/LeftBarTrackScale.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/Timeline.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/TopBarTimeScale.tsx (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/components/timeline/types.ts (100%) rename packages/{aitube-timeline => timeline}/src/compute/README.md (100%) rename packages/{aitube-timeline => timeline}/src/compute/computeCellHeight.ts (100%) rename packages/{aitube-timeline => timeline}/src/compute/computeContentSizeMetrics.ts (100%) rename packages/{aitube-timeline => timeline}/src/constants/defaults.ts (100%) rename packages/{aitube-timeline => timeline}/src/constants/grid.ts (100%) rename packages/{aitube-timeline => timeline}/src/constants/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/constants/priorities.ts (100%) rename packages/{aitube-timeline => timeline}/src/constants/themes.ts (100%) rename packages/{aitube-timeline => timeline}/src/demo.tsx (100%) rename packages/{aitube-timeline => timeline}/src/hooks/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useAnimationFrame.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useAxis.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useCursorGeometry.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useDebounce.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useHorizontalGridLines.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useHorizontalTrackLines.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useHoveredSegment.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useSegment.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useSegmentChanges.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useSegmentLoader.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useTimeScaleGraduations.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useTimeline.ts (100%) rename packages/{aitube-timeline => timeline}/src/hooks/useVerticalGridLines.ts (100%) rename packages/{aitube-timeline => timeline}/src/index.tsx (100%) rename packages/{aitube-timeline => timeline}/src/types/grid.ts (100%) rename packages/{aitube-timeline => timeline}/src/types/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/types/rendering.ts (100%) rename packages/{aitube-timeline => timeline}/src/types/theme.ts (100%) rename packages/{aitube-timeline => timeline}/src/types/timeline.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/clamp.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/clapSegmentToTimelineSegment.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/cn.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/debounceAsync.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/debounceSync.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/findFreeTrack.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/formatTimestamp.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/getAudioBuffer.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/getDefaultState.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/getFinalVideo.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/getTextLength.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/hslToHex.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/index.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/parseRenderingStrategy.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/readFileAsArrayBuffer.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/similar.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/sleep.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/sliceSegments.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/throttle.ts (100%) rename packages/{aitube-timeline => timeline}/src/utils/timelineSegmentToClapSegment.ts (100%) rename packages/{aitube-timeline => timeline}/tailwind.config.js (100%) rename packages/{aitube-timeline => timeline}/test/test.tsx (100%) rename packages/{aitube-timeline => timeline}/tsconfig.json (100%) rename packages/{aitube-timeline => timeline}/tsconfig.node.json (100%) rename packages/{aitube-timeline => timeline}/tsconfig.types.json (100%) rename packages/{aitube-timeline => timeline}/vite.config.js (100%) diff --git a/package.json b/package.json index c1cc1d0d..63a688ce 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "packages/*" ], "scripts": { - "install": "npm install --workspaces", + "install": "npm install --verbose --workspaces", "dev": "npm install && npm run dev --workspaces", "start": "npm run start --workspaces", "build": "npm install && npm run build --workspaces", diff --git a/packages/aitube-clap/.gitignore b/packages/api-client/.gitignore similarity index 100% rename from packages/aitube-clap/.gitignore rename to packages/api-client/.gitignore diff --git a/packages/aitube-clap/.npmignore b/packages/api-client/.npmignore similarity index 100% rename from packages/aitube-clap/.npmignore rename to packages/api-client/.npmignore diff --git a/packages/aitube-clap/.prettierrc.json b/packages/api-client/.prettierrc.json similarity index 100% rename from packages/aitube-clap/.prettierrc.json rename to packages/api-client/.prettierrc.json diff --git a/packages/aitube-clap/LICENSE.md b/packages/api-client/LICENSE.md similarity index 100% rename from packages/aitube-clap/LICENSE.md rename to packages/api-client/LICENSE.md diff --git a/packages/aitube-client/README.md b/packages/api-client/README.md similarity index 100% rename from packages/aitube-client/README.md rename to packages/api-client/README.md diff --git a/packages/aitube-client/bun.lockb b/packages/api-client/bun.lockb similarity index 100% rename from packages/aitube-client/bun.lockb rename to packages/api-client/bun.lockb diff --git a/packages/aitube-client/package.json b/packages/api-client/package.json similarity index 97% rename from packages/aitube-client/package.json rename to packages/api-client/package.json index 7bda0469..e51a401e 100644 --- a/packages/aitube-client/package.json +++ b/packages/api-client/package.json @@ -20,7 +20,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.3" + "@aitube/clap": "file:../clap" }, "repository": { "type": "git", diff --git a/packages/aitube-client/src/api/createClap.ts b/packages/api-client/src/api/createClap.ts similarity index 100% rename from packages/aitube-client/src/api/createClap.ts rename to packages/api-client/src/api/createClap.ts diff --git a/packages/aitube-client/src/api/editClapDialogues.ts b/packages/api-client/src/api/editClapDialogues.ts similarity index 100% rename from packages/aitube-client/src/api/editClapDialogues.ts rename to packages/api-client/src/api/editClapDialogues.ts diff --git a/packages/aitube-client/src/api/editClapEntities.ts b/packages/api-client/src/api/editClapEntities.ts similarity index 100% rename from packages/aitube-client/src/api/editClapEntities.ts rename to packages/api-client/src/api/editClapEntities.ts diff --git a/packages/aitube-client/src/api/editClapMusic.ts b/packages/api-client/src/api/editClapMusic.ts similarity index 100% rename from packages/aitube-client/src/api/editClapMusic.ts rename to packages/api-client/src/api/editClapMusic.ts diff --git a/packages/aitube-client/src/api/editClapSounds.ts b/packages/api-client/src/api/editClapSounds.ts similarity index 100% rename from packages/aitube-client/src/api/editClapSounds.ts rename to packages/api-client/src/api/editClapSounds.ts diff --git a/packages/aitube-client/src/api/editClapStory.ts b/packages/api-client/src/api/editClapStory.ts similarity index 100% rename from packages/aitube-client/src/api/editClapStory.ts rename to packages/api-client/src/api/editClapStory.ts diff --git a/packages/aitube-client/src/api/editClapStoryboards.ts b/packages/api-client/src/api/editClapStoryboards.ts similarity index 100% rename from packages/aitube-client/src/api/editClapStoryboards.ts rename to packages/api-client/src/api/editClapStoryboards.ts diff --git a/packages/aitube-client/src/api/editClapVideos.ts b/packages/api-client/src/api/editClapVideos.ts similarity index 100% rename from packages/aitube-client/src/api/editClapVideos.ts rename to packages/api-client/src/api/editClapVideos.ts diff --git a/packages/aitube-client/src/api/exportClapToVideo.ts b/packages/api-client/src/api/exportClapToVideo.ts similarity index 100% rename from packages/aitube-client/src/api/exportClapToVideo.ts rename to packages/api-client/src/api/exportClapToVideo.ts diff --git a/packages/aitube-client/src/api/index.ts b/packages/api-client/src/api/index.ts similarity index 100% rename from packages/aitube-client/src/api/index.ts rename to packages/api-client/src/api/index.ts diff --git a/packages/aitube-client/src/constants/config.ts b/packages/api-client/src/constants/config.ts similarity index 100% rename from packages/aitube-client/src/constants/config.ts rename to packages/api-client/src/constants/config.ts diff --git a/packages/aitube-client/src/constants/defaultValues.ts b/packages/api-client/src/constants/defaultValues.ts similarity index 100% rename from packages/aitube-client/src/constants/defaultValues.ts rename to packages/api-client/src/constants/defaultValues.ts diff --git a/packages/aitube-client/src/constants/index.ts b/packages/api-client/src/constants/index.ts similarity index 100% rename from packages/aitube-client/src/constants/index.ts rename to packages/api-client/src/constants/index.ts diff --git a/packages/aitube-client/src/constants/types.ts b/packages/api-client/src/constants/types.ts similarity index 100% rename from packages/aitube-client/src/constants/types.ts rename to packages/api-client/src/constants/types.ts diff --git a/packages/aitube-client/src/index.ts b/packages/api-client/src/index.ts similarity index 100% rename from packages/aitube-client/src/index.ts rename to packages/api-client/src/index.ts diff --git a/packages/aitube-client/src/parsers/index.ts b/packages/api-client/src/parsers/index.ts similarity index 100% rename from packages/aitube-client/src/parsers/index.ts rename to packages/api-client/src/parsers/index.ts diff --git a/packages/aitube-client/src/parsers/parseEntityPrompt.ts b/packages/api-client/src/parsers/parseEntityPrompt.ts similarity index 100% rename from packages/aitube-client/src/parsers/parseEntityPrompt.ts rename to packages/api-client/src/parsers/parseEntityPrompt.ts diff --git a/packages/aitube-client/src/parsers/parseString.ts b/packages/api-client/src/parsers/parseString.ts similarity index 100% rename from packages/aitube-client/src/parsers/parseString.ts rename to packages/api-client/src/parsers/parseString.ts diff --git a/packages/aitube-client/src/parsers/parseStringArray.ts b/packages/api-client/src/parsers/parseStringArray.ts similarity index 100% rename from packages/aitube-client/src/parsers/parseStringArray.ts rename to packages/api-client/src/parsers/parseStringArray.ts diff --git a/packages/aitube-client/src/utils/applyClapCompletion.ts b/packages/api-client/src/utils/applyClapCompletion.ts similarity index 100% rename from packages/aitube-client/src/utils/applyClapCompletion.ts rename to packages/api-client/src/utils/applyClapCompletion.ts diff --git a/packages/aitube-client/src/utils/index.ts b/packages/api-client/src/utils/index.ts similarity index 100% rename from packages/aitube-client/src/utils/index.ts rename to packages/api-client/src/utils/index.ts diff --git a/packages/aitube-clap/tsconfig.json b/packages/api-client/tsconfig.json similarity index 100% rename from packages/aitube-clap/tsconfig.json rename to packages/api-client/tsconfig.json diff --git a/packages/aitube-clap/tsconfig.types.json b/packages/api-client/tsconfig.types.json similarity index 100% rename from packages/aitube-clap/tsconfig.types.json rename to packages/api-client/tsconfig.types.json diff --git a/packages/app/package.json b/packages/app/package.json index 9bac7898..983dfba7 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -37,11 +37,11 @@ }, "dependencies": { "@aitube/broadway": "file:../broadway", - "@aitube/clap": "0.2.3", - "@aitube/clapper-services": "0.2.3-2", - "@aitube/client": "0.2.3", - "@aitube/engine": "0.2.3", - "@aitube/timeline": "0.2.3", + "@aitube/clap": "file:../clap", + "@aitube/clapper-services": "file:../services", + "@aitube/client": "file:../api-client", + "@aitube/engine": "file:../engine", + "@aitube/timeline": "file:../timeline", "@fal-ai/serverless-client": "^0.13.0", "@ffmpeg/ffmpeg": "^0.12.10", "@ffmpeg/util": "^0.12.1", diff --git a/packages/broadway/package.json b/packages/broadway/package.json index d9cacea4..c67dc7bd 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -15,15 +15,15 @@ "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { - "@aitube/io": "0.0.1", + "@aitube/io": "file:../io", "bun-types": "latest", "prettier": "^3.3.3", "rimraf": "^6.0.1", "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/colors": "0.2.3" + "@aitube/clap": "file:../clap", + "@aitube/colors": "file:../colors" }, "repository": { "type": "git", diff --git a/packages/aitube-clapper-services/.gitignore b/packages/clap/.gitignore similarity index 100% rename from packages/aitube-clapper-services/.gitignore rename to packages/clap/.gitignore diff --git a/packages/aitube-clapper-services/.npmignore b/packages/clap/.npmignore similarity index 100% rename from packages/aitube-clapper-services/.npmignore rename to packages/clap/.npmignore diff --git a/packages/aitube-clapper-services/.prettierrc.json b/packages/clap/.prettierrc.json similarity index 100% rename from packages/aitube-clapper-services/.prettierrc.json rename to packages/clap/.prettierrc.json diff --git a/packages/aitube-clapper-services/LICENSE.md b/packages/clap/LICENSE.md similarity index 100% rename from packages/aitube-clapper-services/LICENSE.md rename to packages/clap/LICENSE.md diff --git a/packages/aitube-clap/README.md b/packages/clap/README.md similarity index 100% rename from packages/aitube-clap/README.md rename to packages/clap/README.md diff --git a/packages/aitube-clap/bun.lockb b/packages/clap/bun.lockb similarity index 100% rename from packages/aitube-clap/bun.lockb rename to packages/clap/bun.lockb diff --git a/packages/aitube-clap/package.json b/packages/clap/package.json similarity index 100% rename from packages/aitube-clap/package.json rename to packages/clap/package.json diff --git a/packages/aitube-clap/src/constants/defaultValues.ts b/packages/clap/src/constants/defaultValues.ts similarity index 100% rename from packages/aitube-clap/src/constants/defaultValues.ts rename to packages/clap/src/constants/defaultValues.ts diff --git a/packages/aitube-clap/src/constants/index.ts b/packages/clap/src/constants/index.ts similarity index 100% rename from packages/aitube-clap/src/constants/index.ts rename to packages/clap/src/constants/index.ts diff --git a/packages/aitube-clap/src/converters/blobToDataUri.ts b/packages/clap/src/converters/blobToDataUri.ts similarity index 100% rename from packages/aitube-clap/src/converters/blobToDataUri.ts rename to packages/clap/src/converters/blobToDataUri.ts diff --git a/packages/aitube-clap/src/converters/clapToDataUri.ts b/packages/clap/src/converters/clapToDataUri.ts similarity index 100% rename from packages/aitube-clap/src/converters/clapToDataUri.ts rename to packages/clap/src/converters/clapToDataUri.ts diff --git a/packages/aitube-clap/src/converters/dataUriToBlob.ts b/packages/clap/src/converters/dataUriToBlob.ts similarity index 100% rename from packages/aitube-clap/src/converters/dataUriToBlob.ts rename to packages/clap/src/converters/dataUriToBlob.ts diff --git a/packages/aitube-clap/src/converters/index.ts b/packages/clap/src/converters/index.ts similarity index 100% rename from packages/aitube-clap/src/converters/index.ts rename to packages/clap/src/converters/index.ts diff --git a/packages/aitube-clap/src/factories/index.ts b/packages/clap/src/factories/index.ts similarity index 100% rename from packages/aitube-clap/src/factories/index.ts rename to packages/clap/src/factories/index.ts diff --git a/packages/aitube-clap/src/factories/newClap.ts b/packages/clap/src/factories/newClap.ts similarity index 100% rename from packages/aitube-clap/src/factories/newClap.ts rename to packages/clap/src/factories/newClap.ts diff --git a/packages/aitube-clap/src/factories/newEntity.ts b/packages/clap/src/factories/newEntity.ts similarity index 100% rename from packages/aitube-clap/src/factories/newEntity.ts rename to packages/clap/src/factories/newEntity.ts diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/clap/src/factories/newSegment.ts similarity index 100% rename from packages/aitube-clap/src/factories/newSegment.ts rename to packages/clap/src/factories/newSegment.ts diff --git a/packages/aitube-clap/src/factories/newWorkflow.ts b/packages/clap/src/factories/newWorkflow.ts similarity index 100% rename from packages/aitube-clap/src/factories/newWorkflow.ts rename to packages/clap/src/factories/newWorkflow.ts diff --git a/packages/aitube-clap/src/helpers/README.md b/packages/clap/src/helpers/README.md similarity index 100% rename from packages/aitube-clap/src/helpers/README.md rename to packages/clap/src/helpers/README.md diff --git a/packages/aitube-clap/src/helpers/buildEntityIndex.ts b/packages/clap/src/helpers/buildEntityIndex.ts similarity index 100% rename from packages/aitube-clap/src/helpers/buildEntityIndex.ts rename to packages/clap/src/helpers/buildEntityIndex.ts diff --git a/packages/aitube-clap/src/helpers/filterAssets.ts b/packages/clap/src/helpers/filterAssets.ts similarity index 100% rename from packages/aitube-clap/src/helpers/filterAssets.ts rename to packages/clap/src/helpers/filterAssets.ts diff --git a/packages/aitube-clap/src/helpers/filterSegmentsByCategory.ts b/packages/clap/src/helpers/filterSegmentsByCategory.ts similarity index 100% rename from packages/aitube-clap/src/helpers/filterSegmentsByCategory.ts rename to packages/clap/src/helpers/filterSegmentsByCategory.ts diff --git a/packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts b/packages/clap/src/helpers/generateClapFromSimpleStory.ts similarity index 100% rename from packages/aitube-clap/src/helpers/generateClapFromSimpleStory.ts rename to packages/clap/src/helpers/generateClapFromSimpleStory.ts diff --git a/packages/aitube-clap/src/helpers/getEmptyClap.ts b/packages/clap/src/helpers/getEmptyClap.ts similarity index 100% rename from packages/aitube-clap/src/helpers/getEmptyClap.ts rename to packages/clap/src/helpers/getEmptyClap.ts diff --git a/packages/aitube-clap/src/helpers/index.ts b/packages/clap/src/helpers/index.ts similarity index 100% rename from packages/aitube-clap/src/helpers/index.ts rename to packages/clap/src/helpers/index.ts diff --git a/packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts b/packages/clap/src/helpers/removeGeneratedAssetUrls.ts similarity index 100% rename from packages/aitube-clap/src/helpers/removeGeneratedAssetUrls.ts rename to packages/clap/src/helpers/removeGeneratedAssetUrls.ts diff --git a/packages/aitube-clap/src/index.ts b/packages/clap/src/index.ts similarity index 100% rename from packages/aitube-clap/src/index.ts rename to packages/clap/src/index.ts diff --git a/packages/aitube-clap/src/io/fetchClap.ts b/packages/clap/src/io/fetchClap.ts similarity index 100% rename from packages/aitube-clap/src/io/fetchClap.ts rename to packages/clap/src/io/fetchClap.ts diff --git a/packages/aitube-clap/src/io/index.ts b/packages/clap/src/io/index.ts similarity index 100% rename from packages/aitube-clap/src/io/index.ts rename to packages/clap/src/io/index.ts diff --git a/packages/aitube-clap/src/io/parseClap.ts b/packages/clap/src/io/parseClap.ts similarity index 100% rename from packages/aitube-clap/src/io/parseClap.ts rename to packages/clap/src/io/parseClap.ts diff --git a/packages/aitube-clap/src/io/serializeClap.ts b/packages/clap/src/io/serializeClap.ts similarity index 100% rename from packages/aitube-clap/src/io/serializeClap.ts rename to packages/clap/src/io/serializeClap.ts diff --git a/packages/aitube-clap/src/io/updateClap.ts b/packages/clap/src/io/updateClap.ts similarity index 100% rename from packages/aitube-clap/src/io/updateClap.ts rename to packages/clap/src/io/updateClap.ts diff --git a/packages/aitube-clap/src/samples/stories.ts b/packages/clap/src/samples/stories.ts similarity index 100% rename from packages/aitube-clap/src/samples/stories.ts rename to packages/clap/src/samples/stories.ts diff --git a/packages/aitube-clap/src/sanitizers/index.ts b/packages/clap/src/sanitizers/index.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/index.ts rename to packages/clap/src/sanitizers/index.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeEntities.ts b/packages/clap/src/sanitizers/sanitizeEntities.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeEntities.ts rename to packages/clap/src/sanitizers/sanitizeEntities.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeEntity.ts b/packages/clap/src/sanitizers/sanitizeEntity.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeEntity.ts rename to packages/clap/src/sanitizers/sanitizeEntity.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeMeta.ts b/packages/clap/src/sanitizers/sanitizeMeta.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeMeta.ts rename to packages/clap/src/sanitizers/sanitizeMeta.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts b/packages/clap/src/sanitizers/sanitizeSegment.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeSegment.ts rename to packages/clap/src/sanitizers/sanitizeSegment.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeSegments.ts b/packages/clap/src/sanitizers/sanitizeSegments.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeSegments.ts rename to packages/clap/src/sanitizers/sanitizeSegments.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts b/packages/clap/src/sanitizers/sanitizeWorkflow.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeWorkflow.ts rename to packages/clap/src/sanitizers/sanitizeWorkflow.ts diff --git a/packages/aitube-clap/src/sanitizers/sanitizeWorkflows.ts b/packages/clap/src/sanitizers/sanitizeWorkflows.ts similarity index 100% rename from packages/aitube-clap/src/sanitizers/sanitizeWorkflows.ts rename to packages/clap/src/sanitizers/sanitizeWorkflows.ts diff --git a/packages/aitube-clap/src/types.ts b/packages/clap/src/types.ts similarity index 100% rename from packages/aitube-clap/src/types.ts rename to packages/clap/src/types.ts diff --git a/packages/aitube-clap/src/utils/filterSegments.ts b/packages/clap/src/utils/filterSegments.ts similarity index 100% rename from packages/aitube-clap/src/utils/filterSegments.ts rename to packages/clap/src/utils/filterSegments.ts diff --git a/packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts b/packages/clap/src/utils/filterSegmentsWithinRange.ts similarity index 100% rename from packages/aitube-clap/src/utils/filterSegmentsWithinRange.ts rename to packages/clap/src/utils/filterSegmentsWithinRange.ts diff --git a/packages/aitube-clap/src/utils/generateSeed.ts b/packages/clap/src/utils/generateSeed.ts similarity index 100% rename from packages/aitube-clap/src/utils/generateSeed.ts rename to packages/clap/src/utils/generateSeed.ts diff --git a/packages/aitube-clap/src/utils/getClapAssetSourceType.ts b/packages/clap/src/utils/getClapAssetSourceType.ts similarity index 100% rename from packages/aitube-clap/src/utils/getClapAssetSourceType.ts rename to packages/clap/src/utils/getClapAssetSourceType.ts diff --git a/packages/aitube-clap/src/utils/getValidNumber.ts b/packages/clap/src/utils/getValidNumber.ts similarity index 100% rename from packages/aitube-clap/src/utils/getValidNumber.ts rename to packages/clap/src/utils/getValidNumber.ts diff --git a/packages/aitube-clap/src/utils/index.ts b/packages/clap/src/utils/index.ts similarity index 100% rename from packages/aitube-clap/src/utils/index.ts rename to packages/clap/src/utils/index.ts diff --git a/packages/aitube-clap/src/utils/isValidNumber.ts b/packages/clap/src/utils/isValidNumber.ts similarity index 100% rename from packages/aitube-clap/src/utils/isValidNumber.ts rename to packages/clap/src/utils/isValidNumber.ts diff --git a/packages/aitube-clap/src/utils/parseMediaOrientation.ts b/packages/clap/src/utils/parseMediaOrientation.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseMediaOrientation.ts rename to packages/clap/src/utils/parseMediaOrientation.ts diff --git a/packages/aitube-clap/src/utils/parseOutputType.ts b/packages/clap/src/utils/parseOutputType.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseOutputType.ts rename to packages/clap/src/utils/parseOutputType.ts diff --git a/packages/aitube-clap/src/utils/parseSegmentCategory.ts b/packages/clap/src/utils/parseSegmentCategory.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseSegmentCategory.ts rename to packages/clap/src/utils/parseSegmentCategory.ts diff --git a/packages/aitube-clap/src/utils/parseSegmentStatus.ts b/packages/clap/src/utils/parseSegmentStatus.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseSegmentStatus.ts rename to packages/clap/src/utils/parseSegmentStatus.ts diff --git a/packages/aitube-clap/src/utils/parseWorkflowCategory.ts b/packages/clap/src/utils/parseWorkflowCategory.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseWorkflowCategory.ts rename to packages/clap/src/utils/parseWorkflowCategory.ts diff --git a/packages/aitube-clap/src/utils/parseWorkflowEngine.ts b/packages/clap/src/utils/parseWorkflowEngine.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseWorkflowEngine.ts rename to packages/clap/src/utils/parseWorkflowEngine.ts diff --git a/packages/aitube-clap/src/utils/parseWorkflowProvider.ts b/packages/clap/src/utils/parseWorkflowProvider.ts similarity index 100% rename from packages/aitube-clap/src/utils/parseWorkflowProvider.ts rename to packages/clap/src/utils/parseWorkflowProvider.ts diff --git a/packages/aitube-clap/src/utils/uuid.ts b/packages/clap/src/utils/uuid.ts similarity index 100% rename from packages/aitube-clap/src/utils/uuid.ts rename to packages/clap/src/utils/uuid.ts diff --git a/packages/aitube-clapper-services/tsconfig.json b/packages/clap/tsconfig.json similarity index 100% rename from packages/aitube-clapper-services/tsconfig.json rename to packages/clap/tsconfig.json diff --git a/packages/aitube-clapper-services/tsconfig.types.json b/packages/clap/tsconfig.types.json similarity index 100% rename from packages/aitube-clapper-services/tsconfig.types.json rename to packages/clap/tsconfig.types.json diff --git a/packages/aitube-client/.gitignore b/packages/engine/.gitignore similarity index 100% rename from packages/aitube-client/.gitignore rename to packages/engine/.gitignore diff --git a/packages/aitube-client/.npmignore b/packages/engine/.npmignore similarity index 100% rename from packages/aitube-client/.npmignore rename to packages/engine/.npmignore diff --git a/packages/aitube-client/.prettierrc.json b/packages/engine/.prettierrc.json similarity index 100% rename from packages/aitube-client/.prettierrc.json rename to packages/engine/.prettierrc.json diff --git a/packages/aitube-client/LICENSE.md b/packages/engine/LICENSE.md similarity index 100% rename from packages/aitube-client/LICENSE.md rename to packages/engine/LICENSE.md diff --git a/packages/aitube-engine/README.md b/packages/engine/README.md similarity index 100% rename from packages/aitube-engine/README.md rename to packages/engine/README.md diff --git a/packages/aitube-engine/bun.lockb b/packages/engine/bun.lockb similarity index 100% rename from packages/aitube-engine/bun.lockb rename to packages/engine/bun.lockb diff --git a/packages/aitube-engine/package.json b/packages/engine/package.json similarity index 96% rename from packages/aitube-engine/package.json rename to packages/engine/package.json index 791349de..83b3b862 100644 --- a/packages/aitube-engine/package.json +++ b/packages/engine/package.json @@ -20,7 +20,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.3" + "@aitube/clap": "file:../clap" }, "repository": { "type": "git", diff --git a/packages/aitube-engine/src/index.ts b/packages/engine/src/index.ts similarity index 100% rename from packages/aitube-engine/src/index.ts rename to packages/engine/src/index.ts diff --git a/packages/aitube-engine/src/prompts/getBackgroundAudioPrompt.ts b/packages/engine/src/prompts/getBackgroundAudioPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getBackgroundAudioPrompt.ts rename to packages/engine/src/prompts/getBackgroundAudioPrompt.ts diff --git a/packages/aitube-engine/src/prompts/getCharacterPrompt.ts b/packages/engine/src/prompts/getCharacterPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getCharacterPrompt.ts rename to packages/engine/src/prompts/getCharacterPrompt.ts diff --git a/packages/aitube-engine/src/prompts/getCharacterReferencePrompt.ts b/packages/engine/src/prompts/getCharacterReferencePrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getCharacterReferencePrompt.ts rename to packages/engine/src/prompts/getCharacterReferencePrompt.ts diff --git a/packages/aitube-engine/src/prompts/getMusicPrompt.ts b/packages/engine/src/prompts/getMusicPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getMusicPrompt.ts rename to packages/engine/src/prompts/getMusicPrompt.ts diff --git a/packages/aitube-engine/src/prompts/getPositivePrompt.ts b/packages/engine/src/prompts/getPositivePrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getPositivePrompt.ts rename to packages/engine/src/prompts/getPositivePrompt.ts diff --git a/packages/aitube-engine/src/prompts/getSoundPrompt.ts b/packages/engine/src/prompts/getSoundPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getSoundPrompt.ts rename to packages/engine/src/prompts/getSoundPrompt.ts diff --git a/packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts b/packages/engine/src/prompts/getSpeechBackgroundAudioPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getSpeechBackgroundAudioPrompt.ts rename to packages/engine/src/prompts/getSpeechBackgroundAudioPrompt.ts diff --git a/packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts b/packages/engine/src/prompts/getSpeechForegroundAudioPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getSpeechForegroundAudioPrompt.ts rename to packages/engine/src/prompts/getSpeechForegroundAudioPrompt.ts diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/engine/src/prompts/getVideoPrompt.ts similarity index 100% rename from packages/aitube-engine/src/prompts/getVideoPrompt.ts rename to packages/engine/src/prompts/getVideoPrompt.ts diff --git a/packages/aitube-engine/src/prompts/index.ts b/packages/engine/src/prompts/index.ts similarity index 100% rename from packages/aitube-engine/src/prompts/index.ts rename to packages/engine/src/prompts/index.ts diff --git a/packages/aitube-engine/src/prompts/priorities.ts b/packages/engine/src/prompts/priorities.ts similarity index 100% rename from packages/aitube-engine/src/prompts/priorities.ts rename to packages/engine/src/prompts/priorities.ts diff --git a/packages/aitube-engine/src/renderers/index.ts b/packages/engine/src/renderers/index.ts similarity index 100% rename from packages/aitube-engine/src/renderers/index.ts rename to packages/engine/src/renderers/index.ts diff --git a/packages/aitube-engine/src/renderers/storyboard/renderShotToStoryboard.ts b/packages/engine/src/renderers/storyboard/renderShotToStoryboard.ts similarity index 100% rename from packages/aitube-engine/src/renderers/storyboard/renderShotToStoryboard.ts rename to packages/engine/src/renderers/storyboard/renderShotToStoryboard.ts diff --git a/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts b/packages/engine/src/renderers/video/renderShotToVideo.ts similarity index 100% rename from packages/aitube-engine/src/renderers/video/renderShotToVideo.ts rename to packages/engine/src/renderers/video/renderShotToVideo.ts diff --git a/packages/aitube-engine/src/types.ts b/packages/engine/src/types.ts similarity index 100% rename from packages/aitube-engine/src/types.ts rename to packages/engine/src/types.ts diff --git a/packages/aitube-engine/src/utils/deduplicate.ts b/packages/engine/src/utils/deduplicate.ts similarity index 100% rename from packages/aitube-engine/src/utils/deduplicate.ts rename to packages/engine/src/utils/deduplicate.ts diff --git a/packages/aitube-engine/src/utils/deduplicatePrompt.ts b/packages/engine/src/utils/deduplicatePrompt.ts similarity index 100% rename from packages/aitube-engine/src/utils/deduplicatePrompt.ts rename to packages/engine/src/utils/deduplicatePrompt.ts diff --git a/packages/aitube-engine/src/utils/index.ts b/packages/engine/src/utils/index.ts similarity index 100% rename from packages/aitube-engine/src/utils/index.ts rename to packages/engine/src/utils/index.ts diff --git a/packages/aitube-client/tsconfig.json b/packages/engine/tsconfig.json similarity index 100% rename from packages/aitube-client/tsconfig.json rename to packages/engine/tsconfig.json diff --git a/packages/aitube-client/tsconfig.types.json b/packages/engine/tsconfig.types.json similarity index 100% rename from packages/aitube-client/tsconfig.types.json rename to packages/engine/tsconfig.types.json diff --git a/packages/aitube-engine/.gitignore b/packages/services/.gitignore similarity index 100% rename from packages/aitube-engine/.gitignore rename to packages/services/.gitignore diff --git a/packages/aitube-engine/.npmignore b/packages/services/.npmignore similarity index 100% rename from packages/aitube-engine/.npmignore rename to packages/services/.npmignore diff --git a/packages/aitube-engine/.prettierrc.json b/packages/services/.prettierrc.json similarity index 100% rename from packages/aitube-engine/.prettierrc.json rename to packages/services/.prettierrc.json diff --git a/packages/aitube-engine/LICENSE.md b/packages/services/LICENSE.md similarity index 100% rename from packages/aitube-engine/LICENSE.md rename to packages/services/LICENSE.md diff --git a/packages/aitube-clapper-services/README.md b/packages/services/README.md similarity index 100% rename from packages/aitube-clapper-services/README.md rename to packages/services/README.md diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/services/bun.lockb similarity index 100% rename from packages/aitube-clapper-services/bun.lockb rename to packages/services/bun.lockb diff --git a/packages/aitube-clapper-services/package.json b/packages/services/package.json similarity index 94% rename from packages/aitube-clapper-services/package.json rename to packages/services/package.json index 48b4645e..1a08bfc4 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/services/package.json @@ -22,8 +22,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.3", - "@aitube/timeline": "0.2.3", + "@aitube/clap": "file:../clap", + "@aitube/timeline": "file:../timeline", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", diff --git a/packages/aitube-clapper-services/src/assistant.ts b/packages/services/src/assistant.ts similarity index 100% rename from packages/aitube-clapper-services/src/assistant.ts rename to packages/services/src/assistant.ts diff --git a/packages/aitube-clapper-services/src/audio.ts b/packages/services/src/audio.ts similarity index 100% rename from packages/aitube-clapper-services/src/audio.ts rename to packages/services/src/audio.ts diff --git a/packages/aitube-clapper-services/src/base-types.ts b/packages/services/src/base-types.ts similarity index 100% rename from packages/aitube-clapper-services/src/base-types.ts rename to packages/services/src/base-types.ts diff --git a/packages/aitube-clapper-services/src/broadcast.ts b/packages/services/src/broadcast.ts similarity index 100% rename from packages/aitube-clapper-services/src/broadcast.ts rename to packages/services/src/broadcast.ts diff --git a/packages/aitube-clapper-services/src/editors.ts b/packages/services/src/editors.ts similarity index 100% rename from packages/aitube-clapper-services/src/editors.ts rename to packages/services/src/editors.ts diff --git a/packages/aitube-clapper-services/src/entity-editor.ts b/packages/services/src/entity-editor.ts similarity index 100% rename from packages/aitube-clapper-services/src/entity-editor.ts rename to packages/services/src/entity-editor.ts diff --git a/packages/aitube-clapper-services/src/filter-editor.ts b/packages/services/src/filter-editor.ts similarity index 100% rename from packages/aitube-clapper-services/src/filter-editor.ts rename to packages/services/src/filter-editor.ts diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/services/src/index.ts similarity index 100% rename from packages/aitube-clapper-services/src/index.ts rename to packages/services/src/index.ts diff --git a/packages/aitube-clapper-services/src/io.ts b/packages/services/src/io.ts similarity index 100% rename from packages/aitube-clapper-services/src/io.ts rename to packages/services/src/io.ts diff --git a/packages/aitube-clapper-services/src/mic.ts b/packages/services/src/mic.ts similarity index 100% rename from packages/aitube-clapper-services/src/mic.ts rename to packages/services/src/mic.ts diff --git a/packages/aitube-clapper-services/src/monitor.ts b/packages/services/src/monitor.ts similarity index 100% rename from packages/aitube-clapper-services/src/monitor.ts rename to packages/services/src/monitor.ts diff --git a/packages/aitube-clapper-services/src/plugin.ts b/packages/services/src/plugin.ts similarity index 100% rename from packages/aitube-clapper-services/src/plugin.ts rename to packages/services/src/plugin.ts diff --git a/packages/aitube-clapper-services/src/plugins.ts b/packages/services/src/plugins.ts similarity index 100% rename from packages/aitube-clapper-services/src/plugins.ts rename to packages/services/src/plugins.ts diff --git a/packages/aitube-clapper-services/src/project-editor.ts b/packages/services/src/project-editor.ts similarity index 100% rename from packages/aitube-clapper-services/src/project-editor.ts rename to packages/services/src/project-editor.ts diff --git a/packages/aitube-clapper-services/src/renderer.ts b/packages/services/src/renderer.ts similarity index 100% rename from packages/aitube-clapper-services/src/renderer.ts rename to packages/services/src/renderer.ts diff --git a/packages/aitube-clapper-services/src/resolver.ts b/packages/services/src/resolver.ts similarity index 100% rename from packages/aitube-clapper-services/src/resolver.ts rename to packages/services/src/resolver.ts diff --git a/packages/aitube-clapper-services/src/script-editor.ts b/packages/services/src/script-editor.ts similarity index 100% rename from packages/aitube-clapper-services/src/script-editor.ts rename to packages/services/src/script-editor.ts diff --git a/packages/aitube-clapper-services/src/segment-editor.ts b/packages/services/src/segment-editor.ts similarity index 100% rename from packages/aitube-clapper-services/src/segment-editor.ts rename to packages/services/src/segment-editor.ts diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/services/src/services.ts similarity index 100% rename from packages/aitube-clapper-services/src/services.ts rename to packages/services/src/services.ts diff --git a/packages/aitube-clapper-services/src/settings.ts b/packages/services/src/settings.ts similarity index 100% rename from packages/aitube-clapper-services/src/settings.ts rename to packages/services/src/settings.ts diff --git a/packages/aitube-clapper-services/src/simulator.ts b/packages/services/src/simulator.ts similarity index 100% rename from packages/aitube-clapper-services/src/simulator.ts rename to packages/services/src/simulator.ts diff --git a/packages/aitube-clapper-services/src/speech.d.ts b/packages/services/src/speech.d.ts similarity index 100% rename from packages/aitube-clapper-services/src/speech.d.ts rename to packages/services/src/speech.d.ts diff --git a/packages/aitube-clapper-services/src/tasks.ts b/packages/services/src/tasks.ts similarity index 100% rename from packages/aitube-clapper-services/src/tasks.ts rename to packages/services/src/tasks.ts diff --git a/packages/aitube-clapper-services/src/types.ts b/packages/services/src/types.ts similarity index 100% rename from packages/aitube-clapper-services/src/types.ts rename to packages/services/src/types.ts diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/services/src/ui.ts similarity index 100% rename from packages/aitube-clapper-services/src/ui.ts rename to packages/services/src/ui.ts diff --git a/packages/aitube-clapper-services/src/version-control.ts b/packages/services/src/version-control.ts similarity index 100% rename from packages/aitube-clapper-services/src/version-control.ts rename to packages/services/src/version-control.ts diff --git a/packages/aitube-clapper-services/src/workflow-editor.ts b/packages/services/src/workflow-editor.ts similarity index 100% rename from packages/aitube-clapper-services/src/workflow-editor.ts rename to packages/services/src/workflow-editor.ts diff --git a/packages/aitube-engine/tsconfig.json b/packages/services/tsconfig.json similarity index 100% rename from packages/aitube-engine/tsconfig.json rename to packages/services/tsconfig.json diff --git a/packages/aitube-engine/tsconfig.types.json b/packages/services/tsconfig.types.json similarity index 100% rename from packages/aitube-engine/tsconfig.types.json rename to packages/services/tsconfig.types.json diff --git a/packages/aitube-timeline/.gitignore b/packages/timeline/.gitignore similarity index 100% rename from packages/aitube-timeline/.gitignore rename to packages/timeline/.gitignore diff --git a/packages/aitube-timeline/.npmignore b/packages/timeline/.npmignore similarity index 100% rename from packages/aitube-timeline/.npmignore rename to packages/timeline/.npmignore diff --git a/packages/aitube-timeline/.prettierrc.json b/packages/timeline/.prettierrc.json similarity index 100% rename from packages/aitube-timeline/.prettierrc.json rename to packages/timeline/.prettierrc.json diff --git a/packages/aitube-timeline/LICENSE.md b/packages/timeline/LICENSE.md similarity index 100% rename from packages/aitube-timeline/LICENSE.md rename to packages/timeline/LICENSE.md diff --git a/packages/aitube-timeline/README.md b/packages/timeline/README.md similarity index 100% rename from packages/aitube-timeline/README.md rename to packages/timeline/README.md diff --git a/packages/aitube-timeline/bun.lockb b/packages/timeline/bun.lockb similarity index 100% rename from packages/aitube-timeline/bun.lockb rename to packages/timeline/bun.lockb diff --git a/packages/aitube-timeline/index.html b/packages/timeline/index.html similarity index 100% rename from packages/aitube-timeline/index.html rename to packages/timeline/index.html diff --git a/packages/aitube-timeline/package.json b/packages/timeline/package.json similarity index 98% rename from packages/aitube-timeline/package.json rename to packages/timeline/package.json index 3801cb52..226dd839 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/timeline/package.json @@ -32,7 +32,7 @@ "vite": "^5.3.4" }, "peerDependencies": { - "@aitube/clap": "0.2.3", + "@aitube/clap": "file:../clap", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/timeline/src/ClapTimeline.tsx similarity index 100% rename from packages/aitube-timeline/src/ClapTimeline.tsx rename to packages/timeline/src/ClapTimeline.tsx diff --git a/packages/aitube-timeline/src/components/camera/TimelineCamera.tsx b/packages/timeline/src/components/camera/TimelineCamera.tsx similarity index 100% rename from packages/aitube-timeline/src/components/camera/TimelineCamera.tsx rename to packages/timeline/src/components/camera/TimelineCamera.tsx diff --git a/packages/aitube-timeline/src/components/camera/index.ts b/packages/timeline/src/components/camera/index.ts similarity index 100% rename from packages/aitube-timeline/src/components/camera/index.ts rename to packages/timeline/src/components/camera/index.ts diff --git a/packages/aitube-timeline/src/components/camera/types.tsx b/packages/timeline/src/components/camera/types.tsx similarity index 100% rename from packages/aitube-timeline/src/components/camera/types.tsx rename to packages/timeline/src/components/camera/types.tsx diff --git a/packages/aitube-timeline/src/components/cells/AudioCell.tsx b/packages/timeline/src/components/cells/AudioCell.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/AudioCell.tsx rename to packages/timeline/src/components/cells/AudioCell.tsx diff --git a/packages/aitube-timeline/src/components/cells/Cell.tsx b/packages/timeline/src/components/cells/Cell.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/Cell.tsx rename to packages/timeline/src/components/cells/Cell.tsx diff --git a/packages/aitube-timeline/src/components/cells/ImageCell.tsx b/packages/timeline/src/components/cells/ImageCell.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/ImageCell.tsx rename to packages/timeline/src/components/cells/ImageCell.tsx diff --git a/packages/aitube-timeline/src/components/cells/RedrawButton.tsx b/packages/timeline/src/components/cells/RedrawButton.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/RedrawButton.tsx rename to packages/timeline/src/components/cells/RedrawButton.tsx diff --git a/packages/aitube-timeline/src/components/cells/TextCell.tsx b/packages/timeline/src/components/cells/TextCell.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/TextCell.tsx rename to packages/timeline/src/components/cells/TextCell.tsx diff --git a/packages/aitube-timeline/src/components/cells/VideoCell.tsx b/packages/timeline/src/components/cells/VideoCell.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/VideoCell.tsx rename to packages/timeline/src/components/cells/VideoCell.tsx diff --git a/packages/aitube-timeline/src/components/cells/Waveform.tsx b/packages/timeline/src/components/cells/Waveform.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/Waveform.tsx rename to packages/timeline/src/components/cells/Waveform.tsx diff --git a/packages/aitube-timeline/src/components/cells/index.tsx b/packages/timeline/src/components/cells/index.tsx similarity index 100% rename from packages/aitube-timeline/src/components/cells/index.tsx rename to packages/timeline/src/components/cells/index.tsx diff --git a/packages/aitube-timeline/src/components/cells/types.ts b/packages/timeline/src/components/cells/types.ts similarity index 100% rename from packages/aitube-timeline/src/components/cells/types.ts rename to packages/timeline/src/components/cells/types.ts diff --git a/packages/aitube-timeline/src/components/controls/TimelineControls.tsx b/packages/timeline/src/components/controls/TimelineControls.tsx similarity index 100% rename from packages/aitube-timeline/src/components/controls/TimelineControls.tsx rename to packages/timeline/src/components/controls/TimelineControls.tsx diff --git a/packages/aitube-timeline/src/components/controls/index.ts b/packages/timeline/src/components/controls/index.ts similarity index 100% rename from packages/aitube-timeline/src/components/controls/index.ts rename to packages/timeline/src/components/controls/index.ts diff --git a/packages/aitube-timeline/src/components/controls/types.ts b/packages/timeline/src/components/controls/types.ts similarity index 100% rename from packages/aitube-timeline/src/components/controls/types.ts rename to packages/timeline/src/components/controls/types.ts diff --git a/packages/aitube-timeline/src/components/icons/SegmentIcon.tsx b/packages/timeline/src/components/icons/SegmentIcon.tsx similarity index 100% rename from packages/aitube-timeline/src/components/icons/SegmentIcon.tsx rename to packages/timeline/src/components/icons/SegmentIcon.tsx diff --git a/packages/aitube-timeline/src/components/icons/SvgIcon.tsx b/packages/timeline/src/components/icons/SvgIcon.tsx similarity index 100% rename from packages/aitube-timeline/src/components/icons/SvgIcon.tsx rename to packages/timeline/src/components/icons/SvgIcon.tsx diff --git a/packages/aitube-timeline/src/components/icons/SvgShapeMesh.tsx b/packages/timeline/src/components/icons/SvgShapeMesh.tsx similarity index 100% rename from packages/aitube-timeline/src/components/icons/SvgShapeMesh.tsx rename to packages/timeline/src/components/icons/SvgShapeMesh.tsx diff --git a/packages/aitube-timeline/src/components/icons/icons.ts b/packages/timeline/src/components/icons/icons.ts similarity index 100% rename from packages/aitube-timeline/src/components/icons/icons.ts rename to packages/timeline/src/components/icons/icons.ts diff --git a/packages/aitube-timeline/src/components/icons/loadSvgShapes.ts b/packages/timeline/src/components/icons/loadSvgShapes.ts similarity index 100% rename from packages/aitube-timeline/src/components/icons/loadSvgShapes.ts rename to packages/timeline/src/components/icons/loadSvgShapes.ts diff --git a/packages/aitube-timeline/src/components/icons/segmentIcons.ts b/packages/timeline/src/components/icons/segmentIcons.ts similarity index 100% rename from packages/aitube-timeline/src/components/icons/segmentIcons.ts rename to packages/timeline/src/components/icons/segmentIcons.ts diff --git a/packages/aitube-timeline/src/components/icons/types.ts b/packages/timeline/src/components/icons/types.ts similarity index 100% rename from packages/aitube-timeline/src/components/icons/types.ts rename to packages/timeline/src/components/icons/types.ts diff --git a/packages/aitube-timeline/src/components/icons/useSvgShapes.ts b/packages/timeline/src/components/icons/useSvgShapes.ts similarity index 100% rename from packages/aitube-timeline/src/components/icons/useSvgShapes.ts rename to packages/timeline/src/components/icons/useSvgShapes.ts diff --git a/packages/aitube-timeline/src/components/index.ts b/packages/timeline/src/components/index.ts similarity index 100% rename from packages/aitube-timeline/src/components/index.ts rename to packages/timeline/src/components/index.ts diff --git a/packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx b/packages/timeline/src/components/scroller/HorizontalScroller.tsx similarity index 100% rename from packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx rename to packages/timeline/src/components/scroller/HorizontalScroller.tsx diff --git a/packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx b/packages/timeline/src/components/scroller/VerticalScroller.tsx similarity index 100% rename from packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx rename to packages/timeline/src/components/scroller/VerticalScroller.tsx diff --git a/packages/aitube-timeline/src/components/scroller/index.ts b/packages/timeline/src/components/scroller/index.ts similarity index 100% rename from packages/aitube-timeline/src/components/scroller/index.ts rename to packages/timeline/src/components/scroller/index.ts diff --git a/packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx b/packages/timeline/src/components/slider/HorizontalSlider.tsx similarity index 100% rename from packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx rename to packages/timeline/src/components/slider/HorizontalSlider.tsx diff --git a/packages/aitube-timeline/src/components/slider/TimelineSlider.tsx b/packages/timeline/src/components/slider/TimelineSlider.tsx similarity index 100% rename from packages/aitube-timeline/src/components/slider/TimelineSlider.tsx rename to packages/timeline/src/components/slider/TimelineSlider.tsx diff --git a/packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx b/packages/timeline/src/components/slider/TimelineSliderBase.tsx similarity index 100% rename from packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx rename to packages/timeline/src/components/slider/TimelineSliderBase.tsx diff --git a/packages/aitube-timeline/src/components/slider/VerticalSlider.tsx b/packages/timeline/src/components/slider/VerticalSlider.tsx similarity index 100% rename from packages/aitube-timeline/src/components/slider/VerticalSlider.tsx rename to packages/timeline/src/components/slider/VerticalSlider.tsx diff --git a/packages/aitube-timeline/src/components/slider/index.ts b/packages/timeline/src/components/slider/index.ts similarity index 100% rename from packages/aitube-timeline/src/components/slider/index.ts rename to packages/timeline/src/components/slider/index.ts diff --git a/packages/aitube-timeline/src/components/timeline/Cells.tsx b/packages/timeline/src/components/timeline/Cells.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/Cells.tsx rename to packages/timeline/src/components/timeline/Cells.tsx diff --git a/packages/aitube-timeline/src/components/timeline/Cursor.tsx b/packages/timeline/src/components/timeline/Cursor.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/Cursor.tsx rename to packages/timeline/src/components/timeline/Cursor.tsx diff --git a/packages/aitube-timeline/src/components/timeline/CursorWeird.tsx b/packages/timeline/src/components/timeline/CursorWeird.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/CursorWeird.tsx rename to packages/timeline/src/components/timeline/CursorWeird.tsx diff --git a/packages/aitube-timeline/src/components/timeline/Grid.tsx b/packages/timeline/src/components/timeline/Grid.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/Grid.tsx rename to packages/timeline/src/components/timeline/Grid.tsx diff --git a/packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx b/packages/timeline/src/components/timeline/LeftBarTrackScale.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/LeftBarTrackScale.tsx rename to packages/timeline/src/components/timeline/LeftBarTrackScale.tsx diff --git a/packages/aitube-timeline/src/components/timeline/Timeline.tsx b/packages/timeline/src/components/timeline/Timeline.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/Timeline.tsx rename to packages/timeline/src/components/timeline/Timeline.tsx diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/timeline/src/components/timeline/TopBarTimeScale.tsx similarity index 100% rename from packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx rename to packages/timeline/src/components/timeline/TopBarTimeScale.tsx diff --git a/packages/aitube-timeline/src/components/timeline/index.ts b/packages/timeline/src/components/timeline/index.ts similarity index 100% rename from packages/aitube-timeline/src/components/timeline/index.ts rename to packages/timeline/src/components/timeline/index.ts diff --git a/packages/aitube-timeline/src/components/timeline/types.ts b/packages/timeline/src/components/timeline/types.ts similarity index 100% rename from packages/aitube-timeline/src/components/timeline/types.ts rename to packages/timeline/src/components/timeline/types.ts diff --git a/packages/aitube-timeline/src/compute/README.md b/packages/timeline/src/compute/README.md similarity index 100% rename from packages/aitube-timeline/src/compute/README.md rename to packages/timeline/src/compute/README.md diff --git a/packages/aitube-timeline/src/compute/computeCellHeight.ts b/packages/timeline/src/compute/computeCellHeight.ts similarity index 100% rename from packages/aitube-timeline/src/compute/computeCellHeight.ts rename to packages/timeline/src/compute/computeCellHeight.ts diff --git a/packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts b/packages/timeline/src/compute/computeContentSizeMetrics.ts similarity index 100% rename from packages/aitube-timeline/src/compute/computeContentSizeMetrics.ts rename to packages/timeline/src/compute/computeContentSizeMetrics.ts diff --git a/packages/aitube-timeline/src/constants/defaults.ts b/packages/timeline/src/constants/defaults.ts similarity index 100% rename from packages/aitube-timeline/src/constants/defaults.ts rename to packages/timeline/src/constants/defaults.ts diff --git a/packages/aitube-timeline/src/constants/grid.ts b/packages/timeline/src/constants/grid.ts similarity index 100% rename from packages/aitube-timeline/src/constants/grid.ts rename to packages/timeline/src/constants/grid.ts diff --git a/packages/aitube-timeline/src/constants/index.ts b/packages/timeline/src/constants/index.ts similarity index 100% rename from packages/aitube-timeline/src/constants/index.ts rename to packages/timeline/src/constants/index.ts diff --git a/packages/aitube-timeline/src/constants/priorities.ts b/packages/timeline/src/constants/priorities.ts similarity index 100% rename from packages/aitube-timeline/src/constants/priorities.ts rename to packages/timeline/src/constants/priorities.ts diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/timeline/src/constants/themes.ts similarity index 100% rename from packages/aitube-timeline/src/constants/themes.ts rename to packages/timeline/src/constants/themes.ts diff --git a/packages/aitube-timeline/src/demo.tsx b/packages/timeline/src/demo.tsx similarity index 100% rename from packages/aitube-timeline/src/demo.tsx rename to packages/timeline/src/demo.tsx diff --git a/packages/aitube-timeline/src/hooks/index.ts b/packages/timeline/src/hooks/index.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/index.ts rename to packages/timeline/src/hooks/index.ts diff --git a/packages/aitube-timeline/src/hooks/useAnimationFrame.ts b/packages/timeline/src/hooks/useAnimationFrame.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useAnimationFrame.ts rename to packages/timeline/src/hooks/useAnimationFrame.ts diff --git a/packages/aitube-timeline/src/hooks/useAxis.ts b/packages/timeline/src/hooks/useAxis.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useAxis.ts rename to packages/timeline/src/hooks/useAxis.ts diff --git a/packages/aitube-timeline/src/hooks/useCursorGeometry.ts b/packages/timeline/src/hooks/useCursorGeometry.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useCursorGeometry.ts rename to packages/timeline/src/hooks/useCursorGeometry.ts diff --git a/packages/aitube-timeline/src/hooks/useDebounce.ts b/packages/timeline/src/hooks/useDebounce.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useDebounce.ts rename to packages/timeline/src/hooks/useDebounce.ts diff --git a/packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts b/packages/timeline/src/hooks/useHorizontalGridLines.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useHorizontalGridLines.ts rename to packages/timeline/src/hooks/useHorizontalGridLines.ts diff --git a/packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts b/packages/timeline/src/hooks/useHorizontalTrackLines.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useHorizontalTrackLines.ts rename to packages/timeline/src/hooks/useHorizontalTrackLines.ts diff --git a/packages/aitube-timeline/src/hooks/useHoveredSegment.ts b/packages/timeline/src/hooks/useHoveredSegment.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useHoveredSegment.ts rename to packages/timeline/src/hooks/useHoveredSegment.ts diff --git a/packages/aitube-timeline/src/hooks/useSegment.ts b/packages/timeline/src/hooks/useSegment.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useSegment.ts rename to packages/timeline/src/hooks/useSegment.ts diff --git a/packages/aitube-timeline/src/hooks/useSegmentChanges.ts b/packages/timeline/src/hooks/useSegmentChanges.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useSegmentChanges.ts rename to packages/timeline/src/hooks/useSegmentChanges.ts diff --git a/packages/aitube-timeline/src/hooks/useSegmentLoader.ts b/packages/timeline/src/hooks/useSegmentLoader.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useSegmentLoader.ts rename to packages/timeline/src/hooks/useSegmentLoader.ts diff --git a/packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts b/packages/timeline/src/hooks/useTimeScaleGraduations.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useTimeScaleGraduations.ts rename to packages/timeline/src/hooks/useTimeScaleGraduations.ts diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/timeline/src/hooks/useTimeline.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useTimeline.ts rename to packages/timeline/src/hooks/useTimeline.ts diff --git a/packages/aitube-timeline/src/hooks/useVerticalGridLines.ts b/packages/timeline/src/hooks/useVerticalGridLines.ts similarity index 100% rename from packages/aitube-timeline/src/hooks/useVerticalGridLines.ts rename to packages/timeline/src/hooks/useVerticalGridLines.ts diff --git a/packages/aitube-timeline/src/index.tsx b/packages/timeline/src/index.tsx similarity index 100% rename from packages/aitube-timeline/src/index.tsx rename to packages/timeline/src/index.tsx diff --git a/packages/aitube-timeline/src/types/grid.ts b/packages/timeline/src/types/grid.ts similarity index 100% rename from packages/aitube-timeline/src/types/grid.ts rename to packages/timeline/src/types/grid.ts diff --git a/packages/aitube-timeline/src/types/index.ts b/packages/timeline/src/types/index.ts similarity index 100% rename from packages/aitube-timeline/src/types/index.ts rename to packages/timeline/src/types/index.ts diff --git a/packages/aitube-timeline/src/types/rendering.ts b/packages/timeline/src/types/rendering.ts similarity index 100% rename from packages/aitube-timeline/src/types/rendering.ts rename to packages/timeline/src/types/rendering.ts diff --git a/packages/aitube-timeline/src/types/theme.ts b/packages/timeline/src/types/theme.ts similarity index 100% rename from packages/aitube-timeline/src/types/theme.ts rename to packages/timeline/src/types/theme.ts diff --git a/packages/aitube-timeline/src/types/timeline.ts b/packages/timeline/src/types/timeline.ts similarity index 100% rename from packages/aitube-timeline/src/types/timeline.ts rename to packages/timeline/src/types/timeline.ts diff --git a/packages/aitube-timeline/src/utils/clamp.ts b/packages/timeline/src/utils/clamp.ts similarity index 100% rename from packages/aitube-timeline/src/utils/clamp.ts rename to packages/timeline/src/utils/clamp.ts diff --git a/packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts b/packages/timeline/src/utils/clapSegmentToTimelineSegment.ts similarity index 100% rename from packages/aitube-timeline/src/utils/clapSegmentToTimelineSegment.ts rename to packages/timeline/src/utils/clapSegmentToTimelineSegment.ts diff --git a/packages/aitube-timeline/src/utils/cn.ts b/packages/timeline/src/utils/cn.ts similarity index 100% rename from packages/aitube-timeline/src/utils/cn.ts rename to packages/timeline/src/utils/cn.ts diff --git a/packages/aitube-timeline/src/utils/debounceAsync.ts b/packages/timeline/src/utils/debounceAsync.ts similarity index 100% rename from packages/aitube-timeline/src/utils/debounceAsync.ts rename to packages/timeline/src/utils/debounceAsync.ts diff --git a/packages/aitube-timeline/src/utils/debounceSync.ts b/packages/timeline/src/utils/debounceSync.ts similarity index 100% rename from packages/aitube-timeline/src/utils/debounceSync.ts rename to packages/timeline/src/utils/debounceSync.ts diff --git a/packages/aitube-timeline/src/utils/findFreeTrack.ts b/packages/timeline/src/utils/findFreeTrack.ts similarity index 100% rename from packages/aitube-timeline/src/utils/findFreeTrack.ts rename to packages/timeline/src/utils/findFreeTrack.ts diff --git a/packages/aitube-timeline/src/utils/formatTimestamp.ts b/packages/timeline/src/utils/formatTimestamp.ts similarity index 100% rename from packages/aitube-timeline/src/utils/formatTimestamp.ts rename to packages/timeline/src/utils/formatTimestamp.ts diff --git a/packages/aitube-timeline/src/utils/getAudioBuffer.ts b/packages/timeline/src/utils/getAudioBuffer.ts similarity index 100% rename from packages/aitube-timeline/src/utils/getAudioBuffer.ts rename to packages/timeline/src/utils/getAudioBuffer.ts diff --git a/packages/aitube-timeline/src/utils/getDefaultState.ts b/packages/timeline/src/utils/getDefaultState.ts similarity index 100% rename from packages/aitube-timeline/src/utils/getDefaultState.ts rename to packages/timeline/src/utils/getDefaultState.ts diff --git a/packages/aitube-timeline/src/utils/getFinalVideo.ts b/packages/timeline/src/utils/getFinalVideo.ts similarity index 100% rename from packages/aitube-timeline/src/utils/getFinalVideo.ts rename to packages/timeline/src/utils/getFinalVideo.ts diff --git a/packages/aitube-timeline/src/utils/getTextLength.ts b/packages/timeline/src/utils/getTextLength.ts similarity index 100% rename from packages/aitube-timeline/src/utils/getTextLength.ts rename to packages/timeline/src/utils/getTextLength.ts diff --git a/packages/aitube-timeline/src/utils/hslToHex.ts b/packages/timeline/src/utils/hslToHex.ts similarity index 100% rename from packages/aitube-timeline/src/utils/hslToHex.ts rename to packages/timeline/src/utils/hslToHex.ts diff --git a/packages/aitube-timeline/src/utils/index.ts b/packages/timeline/src/utils/index.ts similarity index 100% rename from packages/aitube-timeline/src/utils/index.ts rename to packages/timeline/src/utils/index.ts diff --git a/packages/aitube-timeline/src/utils/parseRenderingStrategy.ts b/packages/timeline/src/utils/parseRenderingStrategy.ts similarity index 100% rename from packages/aitube-timeline/src/utils/parseRenderingStrategy.ts rename to packages/timeline/src/utils/parseRenderingStrategy.ts diff --git a/packages/aitube-timeline/src/utils/readFileAsArrayBuffer.ts b/packages/timeline/src/utils/readFileAsArrayBuffer.ts similarity index 100% rename from packages/aitube-timeline/src/utils/readFileAsArrayBuffer.ts rename to packages/timeline/src/utils/readFileAsArrayBuffer.ts diff --git a/packages/aitube-timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts b/packages/timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts similarity index 100% rename from packages/aitube-timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts rename to packages/timeline/src/utils/removeFinalVideosAndConvertToTimelineSegments.ts diff --git a/packages/aitube-timeline/src/utils/similar.ts b/packages/timeline/src/utils/similar.ts similarity index 100% rename from packages/aitube-timeline/src/utils/similar.ts rename to packages/timeline/src/utils/similar.ts diff --git a/packages/aitube-timeline/src/utils/sleep.ts b/packages/timeline/src/utils/sleep.ts similarity index 100% rename from packages/aitube-timeline/src/utils/sleep.ts rename to packages/timeline/src/utils/sleep.ts diff --git a/packages/aitube-timeline/src/utils/sliceSegments.ts b/packages/timeline/src/utils/sliceSegments.ts similarity index 100% rename from packages/aitube-timeline/src/utils/sliceSegments.ts rename to packages/timeline/src/utils/sliceSegments.ts diff --git a/packages/aitube-timeline/src/utils/throttle.ts b/packages/timeline/src/utils/throttle.ts similarity index 100% rename from packages/aitube-timeline/src/utils/throttle.ts rename to packages/timeline/src/utils/throttle.ts diff --git a/packages/aitube-timeline/src/utils/timelineSegmentToClapSegment.ts b/packages/timeline/src/utils/timelineSegmentToClapSegment.ts similarity index 100% rename from packages/aitube-timeline/src/utils/timelineSegmentToClapSegment.ts rename to packages/timeline/src/utils/timelineSegmentToClapSegment.ts diff --git a/packages/aitube-timeline/tailwind.config.js b/packages/timeline/tailwind.config.js similarity index 100% rename from packages/aitube-timeline/tailwind.config.js rename to packages/timeline/tailwind.config.js diff --git a/packages/aitube-timeline/test/test.tsx b/packages/timeline/test/test.tsx similarity index 100% rename from packages/aitube-timeline/test/test.tsx rename to packages/timeline/test/test.tsx diff --git a/packages/aitube-timeline/tsconfig.json b/packages/timeline/tsconfig.json similarity index 100% rename from packages/aitube-timeline/tsconfig.json rename to packages/timeline/tsconfig.json diff --git a/packages/aitube-timeline/tsconfig.node.json b/packages/timeline/tsconfig.node.json similarity index 100% rename from packages/aitube-timeline/tsconfig.node.json rename to packages/timeline/tsconfig.node.json diff --git a/packages/aitube-timeline/tsconfig.types.json b/packages/timeline/tsconfig.types.json similarity index 100% rename from packages/aitube-timeline/tsconfig.types.json rename to packages/timeline/tsconfig.types.json diff --git a/packages/aitube-timeline/vite.config.js b/packages/timeline/vite.config.js similarity index 100% rename from packages/aitube-timeline/vite.config.js rename to packages/timeline/vite.config.js From 5941eceb2e3e6a075e2c6dd84c799d6eee7b74ea Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 14 Aug 2024 18:58:34 -0700 Subject: [PATCH 344/346] Add colors and io and move packages --- packages/{aitube-colors => colors}/.gitignore | 0 packages/{aitube-colors => colors}/.npmignore | 0 packages/{aitube-colors => colors}/.prettierrc.json | 0 packages/{aitube-colors => colors}/LICENSE.md | 0 packages/{aitube-colors => colors}/README.md | 0 packages/{aitube-colors => colors}/bun.lockb | Bin packages/{aitube-colors => colors}/package.json | 2 +- .../src/constants/colors.ts | 0 .../src/constants/index.ts | 0 .../src/constants/segments.ts | 0 packages/{aitube-colors => colors}/src/index.ts | 0 packages/{aitube-colors => colors}/src/types.ts | 0 packages/{aitube-colors => colors}/tsconfig.json | 0 .../{aitube-colors => colors}/tsconfig.types.json | 0 packages/{aitube-io => io}/.gitignore | 0 packages/{aitube-io => io}/.npmignore | 0 packages/{aitube-io => io}/.prettierrc.json | 0 packages/{aitube-io => io}/LICENSE.md | 0 packages/{aitube-io => io}/README.md | 0 packages/{aitube-io => io}/bun.lockb | Bin packages/{aitube-io => io}/package.json | 0 packages/{aitube-io => io}/src/delete/deleteFile.ts | 0 .../src/delete/deleteFilesWithName.ts | 0 packages/{aitube-io => io}/src/delete/index.ts | 0 .../src/delete/removeTemporaryFiles.ts | 0 .../src/fetch/downloadFileAsBase64.ts | 0 packages/{aitube-io => io}/src/fetch/index.ts | 0 .../{aitube-io => io}/src/image/convertImageTo.ts | 0 .../src/image/convertImageToJpeg.ts | 0 .../src/image/convertImageToOriginal.ts | 0 .../src/image/convertImageToPng.ts | 0 .../src/image/convertImageToWebp.ts | 0 .../{aitube-io => io}/src/image/imageFormats.ts | 0 packages/{aitube-io => io}/src/image/index.ts | 0 packages/{aitube-io => io}/src/image/resizeImage.ts | 0 packages/{aitube-io => io}/src/index.ts | 0 packages/{aitube-io => io}/src/read/index.ts | 0 .../src/read/readJpegFileToBase64.ts | 0 .../src/read/readLocalOrRemotePlainText.ts | 0 .../src/read/readMp3FileToBase64.ts | 0 .../src/read/readMp4FileToBase64.ts | 0 .../{aitube-io => io}/src/read/readPlainText.ts | 0 .../src/read/readPngFileToBase64.ts | 0 .../src/read/readWavFileToBase64.ts | 0 .../{aitube-io => io}/src/tmp/getRandomDirectory.ts | 0 packages/{aitube-io => io}/src/tmp/index.ts | 0 packages/{aitube-io => io}/src/tmp/uuid.ts | 0 packages/{aitube-io => io}/src/write/index.ts | 0 .../src/write/writeBase64ToFile.ts | 0 packages/{aitube-io => io}/tsconfig.json | 0 packages/{aitube-io => io}/tsconfig.types.json | 0 51 files changed, 1 insertion(+), 1 deletion(-) rename packages/{aitube-colors => colors}/.gitignore (100%) rename packages/{aitube-colors => colors}/.npmignore (100%) rename packages/{aitube-colors => colors}/.prettierrc.json (100%) rename packages/{aitube-colors => colors}/LICENSE.md (100%) rename packages/{aitube-colors => colors}/README.md (100%) rename packages/{aitube-colors => colors}/bun.lockb (100%) rename packages/{aitube-colors => colors}/package.json (96%) rename packages/{aitube-colors => colors}/src/constants/colors.ts (100%) rename packages/{aitube-colors => colors}/src/constants/index.ts (100%) rename packages/{aitube-colors => colors}/src/constants/segments.ts (100%) rename packages/{aitube-colors => colors}/src/index.ts (100%) rename packages/{aitube-colors => colors}/src/types.ts (100%) rename packages/{aitube-colors => colors}/tsconfig.json (100%) rename packages/{aitube-colors => colors}/tsconfig.types.json (100%) rename packages/{aitube-io => io}/.gitignore (100%) rename packages/{aitube-io => io}/.npmignore (100%) rename packages/{aitube-io => io}/.prettierrc.json (100%) rename packages/{aitube-io => io}/LICENSE.md (100%) rename packages/{aitube-io => io}/README.md (100%) rename packages/{aitube-io => io}/bun.lockb (100%) rename packages/{aitube-io => io}/package.json (100%) rename packages/{aitube-io => io}/src/delete/deleteFile.ts (100%) rename packages/{aitube-io => io}/src/delete/deleteFilesWithName.ts (100%) rename packages/{aitube-io => io}/src/delete/index.ts (100%) rename packages/{aitube-io => io}/src/delete/removeTemporaryFiles.ts (100%) rename packages/{aitube-io => io}/src/fetch/downloadFileAsBase64.ts (100%) rename packages/{aitube-io => io}/src/fetch/index.ts (100%) rename packages/{aitube-io => io}/src/image/convertImageTo.ts (100%) rename packages/{aitube-io => io}/src/image/convertImageToJpeg.ts (100%) rename packages/{aitube-io => io}/src/image/convertImageToOriginal.ts (100%) rename packages/{aitube-io => io}/src/image/convertImageToPng.ts (100%) rename packages/{aitube-io => io}/src/image/convertImageToWebp.ts (100%) rename packages/{aitube-io => io}/src/image/imageFormats.ts (100%) rename packages/{aitube-io => io}/src/image/index.ts (100%) rename packages/{aitube-io => io}/src/image/resizeImage.ts (100%) rename packages/{aitube-io => io}/src/index.ts (100%) rename packages/{aitube-io => io}/src/read/index.ts (100%) rename packages/{aitube-io => io}/src/read/readJpegFileToBase64.ts (100%) rename packages/{aitube-io => io}/src/read/readLocalOrRemotePlainText.ts (100%) rename packages/{aitube-io => io}/src/read/readMp3FileToBase64.ts (100%) rename packages/{aitube-io => io}/src/read/readMp4FileToBase64.ts (100%) rename packages/{aitube-io => io}/src/read/readPlainText.ts (100%) rename packages/{aitube-io => io}/src/read/readPngFileToBase64.ts (100%) rename packages/{aitube-io => io}/src/read/readWavFileToBase64.ts (100%) rename packages/{aitube-io => io}/src/tmp/getRandomDirectory.ts (100%) rename packages/{aitube-io => io}/src/tmp/index.ts (100%) rename packages/{aitube-io => io}/src/tmp/uuid.ts (100%) rename packages/{aitube-io => io}/src/write/index.ts (100%) rename packages/{aitube-io => io}/src/write/writeBase64ToFile.ts (100%) rename packages/{aitube-io => io}/tsconfig.json (100%) rename packages/{aitube-io => io}/tsconfig.types.json (100%) diff --git a/packages/aitube-colors/.gitignore b/packages/colors/.gitignore similarity index 100% rename from packages/aitube-colors/.gitignore rename to packages/colors/.gitignore diff --git a/packages/aitube-colors/.npmignore b/packages/colors/.npmignore similarity index 100% rename from packages/aitube-colors/.npmignore rename to packages/colors/.npmignore diff --git a/packages/aitube-colors/.prettierrc.json b/packages/colors/.prettierrc.json similarity index 100% rename from packages/aitube-colors/.prettierrc.json rename to packages/colors/.prettierrc.json diff --git a/packages/aitube-colors/LICENSE.md b/packages/colors/LICENSE.md similarity index 100% rename from packages/aitube-colors/LICENSE.md rename to packages/colors/LICENSE.md diff --git a/packages/aitube-colors/README.md b/packages/colors/README.md similarity index 100% rename from packages/aitube-colors/README.md rename to packages/colors/README.md diff --git a/packages/aitube-colors/bun.lockb b/packages/colors/bun.lockb similarity index 100% rename from packages/aitube-colors/bun.lockb rename to packages/colors/bun.lockb diff --git a/packages/aitube-colors/package.json b/packages/colors/package.json similarity index 96% rename from packages/aitube-colors/package.json rename to packages/colors/package.json index aff82943..3097b74c 100644 --- a/packages/aitube-colors/package.json +++ b/packages/colors/package.json @@ -20,7 +20,7 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.2.3" + "@aitube/clap": "file:../clap" }, "repository": { "type": "git", diff --git a/packages/aitube-colors/src/constants/colors.ts b/packages/colors/src/constants/colors.ts similarity index 100% rename from packages/aitube-colors/src/constants/colors.ts rename to packages/colors/src/constants/colors.ts diff --git a/packages/aitube-colors/src/constants/index.ts b/packages/colors/src/constants/index.ts similarity index 100% rename from packages/aitube-colors/src/constants/index.ts rename to packages/colors/src/constants/index.ts diff --git a/packages/aitube-colors/src/constants/segments.ts b/packages/colors/src/constants/segments.ts similarity index 100% rename from packages/aitube-colors/src/constants/segments.ts rename to packages/colors/src/constants/segments.ts diff --git a/packages/aitube-colors/src/index.ts b/packages/colors/src/index.ts similarity index 100% rename from packages/aitube-colors/src/index.ts rename to packages/colors/src/index.ts diff --git a/packages/aitube-colors/src/types.ts b/packages/colors/src/types.ts similarity index 100% rename from packages/aitube-colors/src/types.ts rename to packages/colors/src/types.ts diff --git a/packages/aitube-colors/tsconfig.json b/packages/colors/tsconfig.json similarity index 100% rename from packages/aitube-colors/tsconfig.json rename to packages/colors/tsconfig.json diff --git a/packages/aitube-colors/tsconfig.types.json b/packages/colors/tsconfig.types.json similarity index 100% rename from packages/aitube-colors/tsconfig.types.json rename to packages/colors/tsconfig.types.json diff --git a/packages/aitube-io/.gitignore b/packages/io/.gitignore similarity index 100% rename from packages/aitube-io/.gitignore rename to packages/io/.gitignore diff --git a/packages/aitube-io/.npmignore b/packages/io/.npmignore similarity index 100% rename from packages/aitube-io/.npmignore rename to packages/io/.npmignore diff --git a/packages/aitube-io/.prettierrc.json b/packages/io/.prettierrc.json similarity index 100% rename from packages/aitube-io/.prettierrc.json rename to packages/io/.prettierrc.json diff --git a/packages/aitube-io/LICENSE.md b/packages/io/LICENSE.md similarity index 100% rename from packages/aitube-io/LICENSE.md rename to packages/io/LICENSE.md diff --git a/packages/aitube-io/README.md b/packages/io/README.md similarity index 100% rename from packages/aitube-io/README.md rename to packages/io/README.md diff --git a/packages/aitube-io/bun.lockb b/packages/io/bun.lockb similarity index 100% rename from packages/aitube-io/bun.lockb rename to packages/io/bun.lockb diff --git a/packages/aitube-io/package.json b/packages/io/package.json similarity index 100% rename from packages/aitube-io/package.json rename to packages/io/package.json diff --git a/packages/aitube-io/src/delete/deleteFile.ts b/packages/io/src/delete/deleteFile.ts similarity index 100% rename from packages/aitube-io/src/delete/deleteFile.ts rename to packages/io/src/delete/deleteFile.ts diff --git a/packages/aitube-io/src/delete/deleteFilesWithName.ts b/packages/io/src/delete/deleteFilesWithName.ts similarity index 100% rename from packages/aitube-io/src/delete/deleteFilesWithName.ts rename to packages/io/src/delete/deleteFilesWithName.ts diff --git a/packages/aitube-io/src/delete/index.ts b/packages/io/src/delete/index.ts similarity index 100% rename from packages/aitube-io/src/delete/index.ts rename to packages/io/src/delete/index.ts diff --git a/packages/aitube-io/src/delete/removeTemporaryFiles.ts b/packages/io/src/delete/removeTemporaryFiles.ts similarity index 100% rename from packages/aitube-io/src/delete/removeTemporaryFiles.ts rename to packages/io/src/delete/removeTemporaryFiles.ts diff --git a/packages/aitube-io/src/fetch/downloadFileAsBase64.ts b/packages/io/src/fetch/downloadFileAsBase64.ts similarity index 100% rename from packages/aitube-io/src/fetch/downloadFileAsBase64.ts rename to packages/io/src/fetch/downloadFileAsBase64.ts diff --git a/packages/aitube-io/src/fetch/index.ts b/packages/io/src/fetch/index.ts similarity index 100% rename from packages/aitube-io/src/fetch/index.ts rename to packages/io/src/fetch/index.ts diff --git a/packages/aitube-io/src/image/convertImageTo.ts b/packages/io/src/image/convertImageTo.ts similarity index 100% rename from packages/aitube-io/src/image/convertImageTo.ts rename to packages/io/src/image/convertImageTo.ts diff --git a/packages/aitube-io/src/image/convertImageToJpeg.ts b/packages/io/src/image/convertImageToJpeg.ts similarity index 100% rename from packages/aitube-io/src/image/convertImageToJpeg.ts rename to packages/io/src/image/convertImageToJpeg.ts diff --git a/packages/aitube-io/src/image/convertImageToOriginal.ts b/packages/io/src/image/convertImageToOriginal.ts similarity index 100% rename from packages/aitube-io/src/image/convertImageToOriginal.ts rename to packages/io/src/image/convertImageToOriginal.ts diff --git a/packages/aitube-io/src/image/convertImageToPng.ts b/packages/io/src/image/convertImageToPng.ts similarity index 100% rename from packages/aitube-io/src/image/convertImageToPng.ts rename to packages/io/src/image/convertImageToPng.ts diff --git a/packages/aitube-io/src/image/convertImageToWebp.ts b/packages/io/src/image/convertImageToWebp.ts similarity index 100% rename from packages/aitube-io/src/image/convertImageToWebp.ts rename to packages/io/src/image/convertImageToWebp.ts diff --git a/packages/aitube-io/src/image/imageFormats.ts b/packages/io/src/image/imageFormats.ts similarity index 100% rename from packages/aitube-io/src/image/imageFormats.ts rename to packages/io/src/image/imageFormats.ts diff --git a/packages/aitube-io/src/image/index.ts b/packages/io/src/image/index.ts similarity index 100% rename from packages/aitube-io/src/image/index.ts rename to packages/io/src/image/index.ts diff --git a/packages/aitube-io/src/image/resizeImage.ts b/packages/io/src/image/resizeImage.ts similarity index 100% rename from packages/aitube-io/src/image/resizeImage.ts rename to packages/io/src/image/resizeImage.ts diff --git a/packages/aitube-io/src/index.ts b/packages/io/src/index.ts similarity index 100% rename from packages/aitube-io/src/index.ts rename to packages/io/src/index.ts diff --git a/packages/aitube-io/src/read/index.ts b/packages/io/src/read/index.ts similarity index 100% rename from packages/aitube-io/src/read/index.ts rename to packages/io/src/read/index.ts diff --git a/packages/aitube-io/src/read/readJpegFileToBase64.ts b/packages/io/src/read/readJpegFileToBase64.ts similarity index 100% rename from packages/aitube-io/src/read/readJpegFileToBase64.ts rename to packages/io/src/read/readJpegFileToBase64.ts diff --git a/packages/aitube-io/src/read/readLocalOrRemotePlainText.ts b/packages/io/src/read/readLocalOrRemotePlainText.ts similarity index 100% rename from packages/aitube-io/src/read/readLocalOrRemotePlainText.ts rename to packages/io/src/read/readLocalOrRemotePlainText.ts diff --git a/packages/aitube-io/src/read/readMp3FileToBase64.ts b/packages/io/src/read/readMp3FileToBase64.ts similarity index 100% rename from packages/aitube-io/src/read/readMp3FileToBase64.ts rename to packages/io/src/read/readMp3FileToBase64.ts diff --git a/packages/aitube-io/src/read/readMp4FileToBase64.ts b/packages/io/src/read/readMp4FileToBase64.ts similarity index 100% rename from packages/aitube-io/src/read/readMp4FileToBase64.ts rename to packages/io/src/read/readMp4FileToBase64.ts diff --git a/packages/aitube-io/src/read/readPlainText.ts b/packages/io/src/read/readPlainText.ts similarity index 100% rename from packages/aitube-io/src/read/readPlainText.ts rename to packages/io/src/read/readPlainText.ts diff --git a/packages/aitube-io/src/read/readPngFileToBase64.ts b/packages/io/src/read/readPngFileToBase64.ts similarity index 100% rename from packages/aitube-io/src/read/readPngFileToBase64.ts rename to packages/io/src/read/readPngFileToBase64.ts diff --git a/packages/aitube-io/src/read/readWavFileToBase64.ts b/packages/io/src/read/readWavFileToBase64.ts similarity index 100% rename from packages/aitube-io/src/read/readWavFileToBase64.ts rename to packages/io/src/read/readWavFileToBase64.ts diff --git a/packages/aitube-io/src/tmp/getRandomDirectory.ts b/packages/io/src/tmp/getRandomDirectory.ts similarity index 100% rename from packages/aitube-io/src/tmp/getRandomDirectory.ts rename to packages/io/src/tmp/getRandomDirectory.ts diff --git a/packages/aitube-io/src/tmp/index.ts b/packages/io/src/tmp/index.ts similarity index 100% rename from packages/aitube-io/src/tmp/index.ts rename to packages/io/src/tmp/index.ts diff --git a/packages/aitube-io/src/tmp/uuid.ts b/packages/io/src/tmp/uuid.ts similarity index 100% rename from packages/aitube-io/src/tmp/uuid.ts rename to packages/io/src/tmp/uuid.ts diff --git a/packages/aitube-io/src/write/index.ts b/packages/io/src/write/index.ts similarity index 100% rename from packages/aitube-io/src/write/index.ts rename to packages/io/src/write/index.ts diff --git a/packages/aitube-io/src/write/writeBase64ToFile.ts b/packages/io/src/write/writeBase64ToFile.ts similarity index 100% rename from packages/aitube-io/src/write/writeBase64ToFile.ts rename to packages/io/src/write/writeBase64ToFile.ts diff --git a/packages/aitube-io/tsconfig.json b/packages/io/tsconfig.json similarity index 100% rename from packages/aitube-io/tsconfig.json rename to packages/io/tsconfig.json diff --git a/packages/aitube-io/tsconfig.types.json b/packages/io/tsconfig.types.json similarity index 100% rename from packages/aitube-io/tsconfig.types.json rename to packages/io/tsconfig.types.json From 2109deac106f7d1d42f8a8ebb4a3ac7184dac348 Mon Sep 17 00:00:00 2001 From: moon Date: Wed, 14 Aug 2024 19:00:35 -0700 Subject: [PATCH 345/346] tweak package.json --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 63a688ce..75502cca 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,9 @@ "packages/*" ], "scripts": { - "install": "npm install --verbose --workspaces", - "dev": "npm install && npm run dev --workspaces", + "dev": "npm install --verbose && npm run dev --workspaces", "start": "npm run start --workspaces", - "build": "npm install && npm run build --workspaces", + "build": "npm install --verbose && npm run build --workspaces", "test": "npm run test --workspaces", "format": "npm run format --workspaces" } From 68f0d0001693b81588d167a939643f530a90e6e9 Mon Sep 17 00:00:00 2001 From: moon Date: Thu, 15 Aug 2024 03:00:39 -0700 Subject: [PATCH 346/346] Monorepo working --- README.md | 2 +- bun.lockb | Bin 0 -> 677380 bytes package.json | 59 ++++-- packages/api-client/README.md | 6 +- packages/api-client/bun.lockb | Bin 19099 -> 0 bytes packages/api-client/package.json | 7 +- packages/api-client/src/api/editClapVideos.ts | 4 +- packages/app/package.json | 38 ++-- .../src/app/api/assistant/askAnyAssistant.ts | 2 +- .../app/api/resolve/providers/aitube/index.ts | 2 +- .../top-menu/lists/AssistantWorkflows.tsx | 2 +- .../top-menu/lists/ImageDepthWorkflows.tsx | 2 +- .../lists/ImageGenerationWorkflows.tsx | 2 +- .../lists/ImageSegmentationWorkflows.tsx | 2 +- .../lists/ImageUpscalingWorkflows.tsx | 2 +- .../lists/MusicGenerationWorkflows.tsx | 2 +- .../lists/SoundGenerationWorkflows.tsx | 2 +- .../top-menu/lists/VideoDepthWorkflows.tsx | 2 +- .../lists/VideoGenerationWorkflows.tsx | 2 +- .../lists/VideoSegmentationWorkflows.tsx | 2 +- .../lists/VideoUpscalingWorkflows.tsx | 2 +- .../lists/VoiceGenerationWorkflows.tsx | 2 +- .../autocomplete/extractCaptionsFromFrames.ts | 181 ++++++++++-------- .../services/autocomplete/useAutocomplete.ts | 12 +- packages/app/src/services/io/ffmpegUtils.ts | 1 + .../services/io/fix-xenova-transformers.d.ts | 1 - packages/app/tsconfig.json | 1 + packages/broadway/bun.lockb | Bin 33915 -> 0 bytes packages/broadway/package.json | 8 +- .../parsers/utils/getParserItemFromLabel.ts | 4 +- packages/broadway/src/types.ts | 4 +- packages/clap/bun.lockb | Bin 17277 -> 0 bytes packages/clap/package.json | 5 +- packages/clap/src/constants/index.ts | 2 +- packages/clap/src/converters/index.ts | 6 +- packages/clap/src/factories/index.ts | 8 +- packages/clap/src/factories/newSegment.ts | 2 +- packages/clap/src/helpers/index.ts | 12 +- packages/clap/src/index.ts | 16 +- packages/clap/src/io/index.ts | 8 +- packages/clap/src/io/parseClap.ts | 4 +- packages/clap/src/sanitizers/index.ts | 14 +- .../clap/src/sanitizers/sanitizeEntities.ts | 2 +- .../clap/src/sanitizers/sanitizeSegments.ts | 2 +- .../clap/src/sanitizers/sanitizeWorkflows.ts | 2 +- packages/clap/src/utils/filterSegments.ts | 2 +- packages/clap/src/utils/index.ts | 28 +-- .../clap/src/utils/parseSegmentCategory.ts | 2 +- .../{services => clapper-services}/.gitignore | 0 .../{services => clapper-services}/.npmignore | 0 .../.prettierrc.json | 0 .../{services => clapper-services}/LICENSE.md | 0 .../{services => clapper-services}/README.md | 0 .../package.json | 8 +- .../src/assistant.ts | 0 .../src/audio.ts | 0 .../src/base-types.ts | 0 .../src/broadcast.ts | 0 .../src/editors.ts | 0 .../src/entity-editor.ts | 0 .../src/filter-editor.ts | 0 .../src/index.ts | 0 .../{services => clapper-services}/src/io.ts | 0 .../{services => clapper-services}/src/mic.ts | 0 .../src/monitor.ts | 0 .../src/plugin.ts | 0 .../src/plugins.ts | 0 .../src/project-editor.ts | 0 .../src/renderer.ts | 0 .../src/resolver.ts | 0 .../src/script-editor.ts | 0 .../src/segment-editor.ts | 0 .../src/services.ts | 0 .../src/settings.ts | 0 .../src/simulator.ts | 0 .../src/speech.d.ts | 0 .../src/tasks.ts | 0 .../src/types.ts | 10 +- .../{services => clapper-services}/src/ui.ts | 0 .../src/version-control.ts | 0 .../src/workflow-editor.ts | 0 .../tsconfig.json | 0 .../tsconfig.types.json | 0 packages/colors/bun.lockb | Bin 17619 -> 0 bytes packages/colors/package.json | 10 +- packages/colors/src/types.ts | 4 +- packages/engine/bun.lockb | Bin 17619 -> 0 bytes packages/engine/package.json | 9 +- .../storyboard/renderShotToStoryboard.ts | 2 +- packages/io/bun.lockb | Bin 28648 -> 0 bytes packages/io/package.json | 3 +- packages/services/bun.lockb | Bin 89108 -> 0 bytes packages/timeline/README.md | 4 +- packages/timeline/bun.lockb | Bin 160755 -> 0 bytes packages/timeline/package.json | 17 +- .../src/components/timeline/Timeline.tsx | 13 +- .../src/compute/computeContentSizeMetrics.ts | 2 +- .../src/hooks/useHorizontalGridLines.ts | 2 +- .../src/hooks/useHorizontalTrackLines.ts | 2 +- packages/timeline/src/hooks/useTimeline.ts | 2 +- .../src/hooks/useVerticalGridLines.ts | 2 +- packages/timeline/src/utils/getFinalVideo.ts | 4 +- packages/timeline/tsconfig.json | 3 +- packages/timeline/vite.config.js | 17 ++ 104 files changed, 312 insertions(+), 273 deletions(-) create mode 100755 bun.lockb delete mode 100755 packages/api-client/bun.lockb delete mode 100644 packages/app/src/services/io/fix-xenova-transformers.d.ts delete mode 100755 packages/broadway/bun.lockb delete mode 100755 packages/clap/bun.lockb rename packages/{services => clapper-services}/.gitignore (100%) rename packages/{services => clapper-services}/.npmignore (100%) rename packages/{services => clapper-services}/.prettierrc.json (100%) rename packages/{services => clapper-services}/LICENSE.md (100%) rename packages/{services => clapper-services}/README.md (100%) rename packages/{services => clapper-services}/package.json (88%) rename packages/{services => clapper-services}/src/assistant.ts (100%) rename packages/{services => clapper-services}/src/audio.ts (100%) rename packages/{services => clapper-services}/src/base-types.ts (100%) rename packages/{services => clapper-services}/src/broadcast.ts (100%) rename packages/{services => clapper-services}/src/editors.ts (100%) rename packages/{services => clapper-services}/src/entity-editor.ts (100%) rename packages/{services => clapper-services}/src/filter-editor.ts (100%) rename packages/{services => clapper-services}/src/index.ts (100%) rename packages/{services => clapper-services}/src/io.ts (100%) rename packages/{services => clapper-services}/src/mic.ts (100%) rename packages/{services => clapper-services}/src/monitor.ts (100%) rename packages/{services => clapper-services}/src/plugin.ts (100%) rename packages/{services => clapper-services}/src/plugins.ts (100%) rename packages/{services => clapper-services}/src/project-editor.ts (100%) rename packages/{services => clapper-services}/src/renderer.ts (100%) rename packages/{services => clapper-services}/src/resolver.ts (100%) rename packages/{services => clapper-services}/src/script-editor.ts (100%) rename packages/{services => clapper-services}/src/segment-editor.ts (100%) rename packages/{services => clapper-services}/src/services.ts (100%) rename packages/{services => clapper-services}/src/settings.ts (100%) rename packages/{services => clapper-services}/src/simulator.ts (100%) rename packages/{services => clapper-services}/src/speech.d.ts (100%) rename packages/{services => clapper-services}/src/tasks.ts (100%) rename packages/{services => clapper-services}/src/types.ts (81%) rename packages/{services => clapper-services}/src/ui.ts (100%) rename packages/{services => clapper-services}/src/version-control.ts (100%) rename packages/{services => clapper-services}/src/workflow-editor.ts (100%) rename packages/{services => clapper-services}/tsconfig.json (100%) rename packages/{services => clapper-services}/tsconfig.types.json (100%) delete mode 100755 packages/colors/bun.lockb delete mode 100755 packages/engine/bun.lockb delete mode 100755 packages/io/bun.lockb delete mode 100755 packages/services/bun.lockb delete mode 100755 packages/timeline/bun.lockb diff --git a/README.md b/README.md index 0b42020b..9e7703d0 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ I have setup Prettier and ESLint, they use some basic rules (you can propose new To run all the tests (unit and e2e) please run: -`npm test` +`npm run test` This is not instantaneous: playwright may seems to do nothing for a while at first. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..a704420547a8c3b28c5266a6f4d9e7ea3fcb6554 GIT binary patch literal 677380 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

K|>U0pvG7`NqzET}?ELCHLfr#)yW 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%0A$j3~~U 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 75502cca..84ddfe40 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,44 @@ { - "name": "@aitube/clapper-monorepo", - "version": "1.0.0", - "private": true, - "description": "A monorepo for the Clapper project. Individual packages are in the packages directory.", - "workspaces": [ - "packages/*" - ], - "scripts": { - "dev": "npm install --verbose && npm run dev --workspaces", - "start": "npm run start --workspaces", - "build": "npm install --verbose && npm run build --workspaces", - "test": "npm run test --workspaces", - "format": "npm run format --workspaces" - } - } - \ No newline at end of file + "name": "@aitube/clapper-monorepo", + "version": "0.2.4", + "private": true, + "description": "A monorepo for the Clapper project. Individual packages are in the packages directory.", + "workspaces": [ + "packages/clap", + "packages/timeline", + "packages/api-client", + "packages/io", + "packages/colors", + "packages/engine", + "packages/broadway", + "packages/clapper-services", + "packages/app" + ], + "engines": { + "bun": ">=1.0.0" + }, + "scripts": { + "dev": "bun run --cwd packages/app dev", + "start": "bun run --cwd packages/app start", + "build": "bun run build:all", + "build:all": "bun run build:clap && bun run build:timeline && bun run build:api-client && bun run build:io && bun run build:colors && bun run build:engine && bun run build:broadway && bun run build:services && bun run build:app", + "build:clap": "bun run --cwd packages/clap build", + "build:timeline": "bun run --cwd packages/timeline build", + "build:api-client": "bun run --cwd packages/api-client build", + "build:io": "bun run --cwd packages/io build", + "build:colors": "bun run --cwd packages/colors build", + "build:engine": "bun run --cwd packages/engine build", + "build:broadway": "bun run --cwd packages/broadway build", + "build:clapper-services": "bun run --cwd packages/clapper-services build", + "build:app": "bun run --cwd packages/app build", + "test": "bun run test:all", + "test:all": "bun run --cwd packages/clap test && bun run --cwd packages/timeline test && bun run --cwd packages/api-client test && bun run --cwd packages/io test && bun run --cwd packages/colors test && bun run --cwd packages/engine test && bun run --cwd packages/broadway test && bun run --cwd packages/clapper-services test && bun run --cwd packages/app test", + "format": "bun run --cwd packages/app format" + }, + "packageManager": "bun@1.0.25", + "trustedDependencies": [ + "@aitube/clapper", + "onnxruntime-node", + "protobufjs" + ] +} \ No newline at end of file diff --git a/packages/api-client/README.md b/packages/api-client/README.md index 47bddcce..b2c17e1e 100644 --- a/packages/api-client/README.md +++ b/packages/api-client/README.md @@ -1,4 +1,4 @@ -# @aitube/client +# @aitube/api-client *Official API client for AiTube.at* @@ -20,7 +20,7 @@ so we need to perform all API calls to `jbilcke-hf-ai-tube.hf.space`. To install the package, run the following command: ```bash -npm install @aitube/client +npm install @aitube/api-client ``` ## Getting Started @@ -48,7 +48,7 @@ import { ClapEntityPrompt, SupportedExportFormat, applyClapCompletion, - } from '@aitube/client' + } from '@aitube/api-client' const ultraSecret = "ultra secret token unavailable to common mortals" diff --git a/packages/api-client/bun.lockb b/packages/api-client/bun.lockb deleted file mode 100755 index ad73771dedbecc24af7a7e78dcd798c5bc9864c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19099 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 PJq|)Z$_|?UegFRlLir;5 diff --git a/packages/api-client/package.json b/packages/api-client/package.json index e51a401e..67462a2f 100644 --- a/packages/api-client/package.json +++ b/packages/api-client/package.json @@ -1,10 +1,10 @@ { - "name": "@aitube/client", + "name": "@aitube/api-client", "module": "index.ts", "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3", + "version": "0.2.4", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -19,9 +19,6 @@ "rimraf": "^6.0.1", "typescript": "^5.5.4" }, - "peerDependencies": { - "@aitube/clap": "file:../clap" - }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-client.git" diff --git a/packages/api-client/src/api/editClapVideos.ts b/packages/api-client/src/api/editClapVideos.ts index 7f02456b..fd596f80 100644 --- a/packages/api-client/src/api/editClapVideos.ts +++ b/packages/api-client/src/api/editClapVideos.ts @@ -43,7 +43,7 @@ export async function editClapVideos({ } // special trick to not touch the generated // storyboards that are used by pending videos - const idsOfStoryboardsToKeep = clap.segments.map(segment => { + const idsOfStoryboardsToKeep = clap.segments.map((segment: ClapSegment) => { const isPendingVideo = ( segment.category === ClapSegmentCategory.VIDEO @@ -61,7 +61,7 @@ export async function editClapVideos({ ).at(0) return storyboard?.id - }).filter(x => x) as string[] + }).filter((x: any) => x) as string[] const newClap = await fetchClap(`${aitubeApiUrl}edit/videos?${queryString.stringify(params)}`, { method: "POST", diff --git a/packages/app/package.json b/packages/app/package.json index 983dfba7..f8cf45b6 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@aitube/clapper", - "version": "0.0.8", + "version": "0.2.4", "private": true, "description": "🎬 Clapper", "license": "GPL-3.0-only", @@ -13,35 +13,35 @@ "public:": "./public" }, "scripts": { - "dev": "npm run checks && next dev", - "build": "npm run prepare && npm run checks && rm -Rf out && next build && npm run build:copyassets", - "build:ci": "rm -Rf out && npm run prepare && next build && npm run build:copyassets", - "build:copyassets": "cp -R public .next/standalone/public && cp -R .next/static .next/standalone/.next/static", - "prepare": "cp -R node_modules/mediainfo.js/dist/MediaInfoModule.wasm public/wasm/", + "dev": "bun run checks && next dev", + "build": "bun run prepare && bun run checks && rm -Rf out && next build && bun run build:copyassets", + "build:ci": "rm -Rf out && bun run prepare && next build && bun run build:copyassets", + "build:copyassets": "cp -R public .next/standalone/public && cp -R .next/static .next/standalone/static", + "prepare": "cp -R ../../node_modules/mediainfo.js/dist/MediaInfoModule.wasm public/wasm/", "start": "next start", "start:prod": "node .next/standalone/server.js", - "checks": "npm run format:fix && npm run lint", + "checks": "bun run format:fix && bun run lint", "format": "prettier --check --ignore-path .gitignore ./src/", "format:fix": "prettier --write --ignore-path .gitignore ./src/", "lint": "next lint", "lint:fix": "next lint --fix", - "test": "npm run build && npm run test:unit:ci", - "test_TEMPORARY_DISABLED": "npm run build && npm run test:unit:ci && npm run test:e2e", + "test": "bun run build && bun run test:unit:ci", + "test_TEMPORARY_DISABLED": "bun run build && bun run test:unit:ci && bun run test:e2e", "test:unit:ci": "vitest run", "test:unit:watch": "vitest", "test:e2e": "npx playwright test", - "electron": "npm run build && electron .", - "electron:start": "npm run build && electron-forge start", - "electron:package": "npm run build && electron-forge package", - "electron:make": "npm run build && electron-forge make" + "electron": "bun run build && electron .", + "electron:start": "bun run build && electron-forge start", + "electron:package": "bun run build && electron-forge package", + "electron:make": "bun run build && electron-forge make" }, "dependencies": { - "@aitube/broadway": "file:../broadway", - "@aitube/clap": "file:../clap", - "@aitube/clapper-services": "file:../services", - "@aitube/client": "file:../api-client", - "@aitube/engine": "file:../engine", - "@aitube/timeline": "file:../timeline", + "@aitube/api-client": "workspace:*", + "@aitube/broadway": "workspace:*", + "@aitube/clap": "workspace:*", + "@aitube/clapper-services": "workspace:*", + "@aitube/engine": "workspace:*", + "@aitube/timeline": "workspace:*", "@fal-ai/serverless-client": "^0.13.0", "@ffmpeg/ffmpeg": "^0.12.10", "@ffmpeg/util": "^0.12.1", diff --git a/packages/app/src/app/api/assistant/askAnyAssistant.ts b/packages/app/src/app/api/assistant/askAnyAssistant.ts index 04718e52..4c0a7aaa 100644 --- a/packages/app/src/app/api/assistant/askAnyAssistant.ts +++ b/packages/app/src/app/api/assistant/askAnyAssistant.ts @@ -202,7 +202,7 @@ export async function askAnyAssistant({ }) // console.log('Lanchain success on the first time! rawResponse:', rawResponse) - assistantMessage = parseLangChainResponse(rawResponse) + assistantMessage = parseLangChainResponse(rawResponse as any) // console.log('assistantMessage:', assistantMessage) } catch (err) { // LangChain failure (this happens quite often, actually) diff --git a/packages/app/src/app/api/resolve/providers/aitube/index.ts b/packages/app/src/app/api/resolve/providers/aitube/index.ts index 11879347..f8454e39 100644 --- a/packages/app/src/app/api/resolve/providers/aitube/index.ts +++ b/packages/app/src/app/api/resolve/providers/aitube/index.ts @@ -12,7 +12,7 @@ import { editClapSounds, editClapStoryboards, editClapVideos, -} from '@aitube/client' +} from '@aitube/api-client' import { getWorkflowInputValues } from '../getWorkflowInputValues' diff --git a/packages/app/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx b/packages/app/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx index 821d07fc..d34915cc 100644 --- a/packages/app/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx +++ b/packages/app/src/components/toolbars/top-menu/lists/AssistantWorkflows.tsx @@ -62,7 +62,7 @@ export function AssistantWorkflows() { - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( - {workflows.map((w) => ( + {workflows?.map((w) => ( @@ -11,36 +11,36 @@ export const cache: { tokenizer?: Promise } = {} -export async function loadModel( - modelId: string, - onProgress: (progress: number) => void -) { - onProgress(0) - const model = await (cache.model - ? cache.model - : (cache.model = Florence2ForConditionalGeneration.from_pretrained( - modelId, - { - dtype: 'fp32', - } - ))) +// export async function loadModel( +// modelId: string, +// onProgress: (progress: number) => void +// ) { +// onProgress(0) +// const model = await (cache.model +// ? cache.model +// : (cache.model = Florence2ForConditionalGeneration.from_pretrained( +// modelId, +// { +// dtype: 'fp32', +// } +// ))) - onProgress(33) +// onProgress(33) - const processor = await (cache.processor - ? cache.processor - : (cache.processor = AutoProcessor.from_pretrained(modelId))) +// const processor = await (cache.processor +// ? cache.processor +// : (cache.processor = AutoProcessor.from_pretrained(modelId))) - onProgress(66) +// onProgress(66) - const tokenizer = await (cache.tokenizer - ? cache.tokenizer - : (cache.tokenizer = AutoTokenizer.from_pretrained(modelId))) +// const tokenizer = await (cache.tokenizer +// ? cache.tokenizer +// : (cache.tokenizer = AutoTokenizer.from_pretrained(modelId))) - onProgress(100) +// onProgress(100) - return { model, processor, tokenizer } -} +// return { model, processor, tokenizer } +// } export function closeModel() { cache.model = undefined @@ -54,75 +54,86 @@ export async function extractCaptionsFromFrames( progress: number, storyboardIndex: number, nbStoryboards: number - ) => void -): Promise { - if (!(navigator as any).gpu) { - throw new Error(`Please enable WebGPU to analyze video frames: - -1. You need a modern browser such as Google Chrome 113+, Microsoft Edge 113+, Safari 18 (macOS 15), Firefox Nightly + ) => any +) { + return +} -2. You need to enable WebGPU (depends on your browser, see below) +// export async function extractCaptionsFromFrames( +// images: string[] = [], +// onProgress: ( +// progress: number, +// storyboardIndex: number, +// nbStoryboards: number +// ) => void +// ): Promise { +// if (!(navigator as any).gpu) { +// throw new Error(`Please enable WebGPU to analyze video frames: -2.1 For Chrome: Perform the following operations in the Chrome / Microsoft Edge address bar -The chrome://flags/#enable-unsafe-webgpu flag must be enabled (not enable-webgpu-developer-features). -Linux experimental support also requires launching the browser with --enable-features=Vulkan. +// 1. You need a modern browser such as Google Chrome 113+, Microsoft Edge 113+, Safari 18 (macOS 15), Firefox Nightly -2.2 For Safari 18 (macOS 15): WebGPU is enabled by default +// 2. You need to enable WebGPU (depends on your browser, see below) -2.3 For Firefox Nightly: Type about:config in the address bar and set 'dom.webgpu.enabled" to true -`) - } +// 2.1 For Chrome: Perform the following operations in the Chrome / Microsoft Edge address bar +// The chrome://flags/#enable-unsafe-webgpu flag must be enabled (not enable-webgpu-developer-features). +// Linux experimental support also requires launching the browser with --enable-features=Vulkan. - let progress = 0 +// 2.2 For Safari 18 (macOS 15): WebGPU is enabled by default - // for code example, see: - // https://github.com/xenova/transformers.js/pull/545#issuecomment-2183625876 +// 2.3 For Firefox Nightly: Type about:config in the address bar and set 'dom.webgpu.enabled" to true +// `) +// } - // Load model, processor, and tokenizer - const model_id = 'onnx-community/Florence-2-base-ft' +// let progress = 0 - const { model, processor, tokenizer } = await loadModel(model_id, (p) => { - onProgress((progress = p * 15), 0, images.length) - }) +// // for code example, see: +// // https://github.com/xenova/transformers.js/pull/545#issuecomment-2183625876 - // not all prompts will work properly, see the official examples: - // https://huggingface.co/microsoft/Florence-2-base-ft/blob/e7a5acc73559546de6e12ec0319cd7cc1fa2437c/processing_florence2.py#L115-L117 +// // Load model, processor, and tokenizer +// const model_id = 'onnx-community/Florence-2-base-ft' - // Prepare text inputs - const prompts = 'Describe with a paragraph what is shown in the image.' - // const prompts = 'Decompose the following video frame into era, genre, location, weather, characters, and action. Give the answer in YAML.' +// const { model, processor, tokenizer } = await loadModel(model_id, (p) => { +// onProgress((progress = p * 15), 0, images.length) +// }) - const text_inputs = tokenizer(prompts) +// // not all prompts will work properly, see the official examples: +// // https://huggingface.co/microsoft/Florence-2-base-ft/blob/e7a5acc73559546de6e12ec0319cd7cc1fa2437c/processing_florence2.py#L115-L117 - let i = 1 - const captions: string[] = [] - for (const imageInBase64DataUri of images) { - console.log('analyzing image:', imageInBase64DataUri.slice(0, 64)) - // Prepare vision inputs - const image = await RawImage.fromURL(imageInBase64DataUri) - const vision_inputs = await processor(image) +// // Prepare text inputs +// const prompts = 'Describe with a paragraph what is shown in the image.' +// // const prompts = 'Decompose the following video frame into era, genre, location, weather, characters, and action. Give the answer in YAML.' - console.log(' - generating caption..') - // Generate text - const generated_ids = await model.generate({ - ...text_inputs, - ...vision_inputs, - max_new_tokens: 100, - }) +// const text_inputs = tokenizer(prompts) - // Decode generated text - const generated_text = tokenizer.batch_decode(generated_ids, { - skip_special_tokens: true, - }) +// let i = 1 +// const captions: string[] = [] +// for (const imageInBase64DataUri of images) { +// console.log('analyzing image:', imageInBase64DataUri.slice(0, 64)) +// // Prepare vision inputs +// const image = await RawImage.fromURL(imageInBase64DataUri) +// const vision_inputs = await processor(image) - const caption = `${generated_text[0] || ''}` - console.log(' - caption:', caption) +// console.log(' - generating caption..') +// // Generate text +// const generated_ids = await model.generate({ +// ...text_inputs, +// ...vision_inputs, +// max_new_tokens: 100, +// }) - const relativeProgress = i / images.length +// // Decode generated text +// const generated_text = tokenizer.batch_decode(generated_ids, { +// skip_special_tokens: true, +// }) - progress += relativeProgress * 75 - onProgress(progress, i, images.length) - captions.push(caption) - } - return captions -} +// const caption = `${generated_text[0] || ''}` +// console.log(' - caption:', caption) + +// const relativeProgress = i / images.length + +// progress += relativeProgress * 75 +// onProgress(progress, i, images.length) +// captions.push(caption) +// } +// return captions +// } diff --git a/packages/app/src/services/autocomplete/useAutocomplete.ts b/packages/app/src/services/autocomplete/useAutocomplete.ts index b0c4846f..997420e6 100644 --- a/packages/app/src/services/autocomplete/useAutocomplete.ts +++ b/packages/app/src/services/autocomplete/useAutocomplete.ts @@ -133,27 +133,27 @@ export const useAutocomplete = create((set, get) => ({ // able to decompose a scene automatically for (const sentence of sentences) { if (sentence.match(/(?:is wearing|wears)/)) { - categories.CHARACTER.push(sentence) + categories[ClapSegmentCategory.CHARACTER].push(sentence) } else if (sentence.match(/(?:the (?:image|screen) (?:is|has))/)) { - categories.STYLE.push(sentence) + categories[ClapSegmentCategory.STYLE].push(sentence) } else if ( sentence.match( /(?:the (?:lighting|lights|light|fire|sun|moon)|bright|dim|neon|candle|lit up)/ ) ) { - categories.LIGHTING.push(sentence) + categories[ClapSegmentCategory.LIGHTING].push(sentence) } else if ( sentence.match( /(?:the (?:man|woman|kid|child|person|animal|person|robot)|(?:she|he) (?:has|is))/ ) ) { - categories.CHARACTER.push(sentence) + categories[ClapSegmentCategory.CHARACTER].push(sentence) } else if ( sentence.match(/(?:behind the|background|room|location|place)/) ) { - categories.LOCATION.push(sentence) + categories[ClapSegmentCategory.LOCATION].push(sentence) } else { - categories.GENERIC.push(sentence) + categories[ClapSegmentCategory.GENERIC].push(sentence) } } diff --git a/packages/app/src/services/io/ffmpegUtils.ts b/packages/app/src/services/io/ffmpegUtils.ts index 40b85972..80eb8e07 100644 --- a/packages/app/src/services/io/ffmpegUtils.ts +++ b/packages/app/src/services/io/ffmpegUtils.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { UUID } from '@aitube/clap' import { FFmpeg } from '@ffmpeg/ffmpeg' import { toBlobURL } from '@ffmpeg/util' diff --git a/packages/app/src/services/io/fix-xenova-transformers.d.ts b/packages/app/src/services/io/fix-xenova-transformers.d.ts deleted file mode 100644 index f9e2aac7..00000000 --- a/packages/app/src/services/io/fix-xenova-transformers.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module '@xenova/transformers' diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index be58954c..c2cc2f87 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -7,6 +7,7 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", + "noImplicitAny": false, "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb deleted file mode 100755 index 42749859dd94430131bc6b196c3af726d78f95fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33915 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 Xw~$aC185s=gn(Q`FZ%x9`}= { return defaultEmptyItem } - const prompts: Partial> = + const prompts: Partial> = typeof item.prompts === "undefined" ? defaultEmptyItem.prompts! : item.prompts return { diff --git a/packages/broadway/src/types.ts b/packages/broadway/src/types.ts index 856d4547..574fcb49 100644 --- a/packages/broadway/src/types.ts +++ b/packages/broadway/src/types.ts @@ -1,5 +1,5 @@ import { ScreenplaySequenceType } from "@/constants/screenplaySequences" -import { ClapSegmentCategory } from "@aitube/clap" +// import { ClapSegmentCategory } from "@aitube/clap" export type NamedEntity = { label: string @@ -7,7 +7,7 @@ export type NamedEntity = { en: string[] } prompts: Omit< - Record, + Record, "SPLAT" | "INTERFACE" | "EVENT" | "EFFECT" | "PHENOMENON" | "MESH" | "DEPTH" | "VIDEO" | "STORYBOARD" | "GENERIC" > } diff --git a/packages/clap/bun.lockb b/packages/clap/bun.lockb deleted file mode 100755 index 8add52af2010d783c9258b706cba3781d77091f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17277 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 CCZQMr diff --git a/packages/clap/package.json b/packages/clap/package.json index c24adfff..92447360 100644 --- a/packages/clap/package.json +++ b/packages/clap/package.json @@ -2,9 +2,10 @@ "name": "@aitube/clap", "module": "index.ts", "main": "dist/index.js", + "private": false, "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3", + "version": "0.2.4", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", @@ -43,4 +44,4 @@ "dist/*.d.ts", "dist/**/*.d.ts" ] -} +} \ No newline at end of file diff --git a/packages/clap/src/constants/index.ts b/packages/clap/src/constants/index.ts index 0910633b..428d841b 100644 --- a/packages/clap/src/constants/index.ts +++ b/packages/clap/src/constants/index.ts @@ -1 +1 @@ -export { defaultMediaOrientation } from "./defaultValues" \ No newline at end of file +export { defaultMediaOrientation } from "@/constants/defaultValues" \ No newline at end of file diff --git a/packages/clap/src/converters/index.ts b/packages/clap/src/converters/index.ts index 1a4daa0a..5bfbdbeb 100644 --- a/packages/clap/src/converters/index.ts +++ b/packages/clap/src/converters/index.ts @@ -1,3 +1,3 @@ -export { blobToDataUri } from './blobToDataUri' -export { clapToDataUri } from './clapToDataUri' -export { dataUriToBlob } from './dataUriToBlob' +export { blobToDataUri } from '@/converters/blobToDataUri' +export { clapToDataUri } from '@/converters/clapToDataUri' +export { dataUriToBlob } from '@/converters/dataUriToBlob' diff --git a/packages/clap/src/factories/index.ts b/packages/clap/src/factories/index.ts index a51443d7..f324fa79 100644 --- a/packages/clap/src/factories/index.ts +++ b/packages/clap/src/factories/index.ts @@ -1,4 +1,4 @@ -export { newClap } from './newClap' -export { newEntity } from './newEntity' -export { newSegment } from './newSegment' -export { newWorkflow } from './newWorkflow' +export { newClap } from '@/factories/newClap' +export { newEntity } from '@/factories/newEntity' +export { newSegment } from '@/factories/newSegment' +export { newWorkflow } from '@/factories/newWorkflow' diff --git a/packages/clap/src/factories/newSegment.ts b/packages/clap/src/factories/newSegment.ts index 408c8ca6..9af3ca7d 100644 --- a/packages/clap/src/factories/newSegment.ts +++ b/packages/clap/src/factories/newSegment.ts @@ -3,7 +3,7 @@ import { isValidNumber } from "@/utils/isValidNumber" import { generateSeed } from "@/utils/generateSeed" import { UUID } from "@/utils/uuid" import { parseSegmentCategory } from "@/utils/parseSegmentCategory" -import { parseOutputType } from ".." +import { parseOutputType } from "@/index" export function newSegment(maybeSegment?: Partial) { diff --git a/packages/clap/src/helpers/index.ts b/packages/clap/src/helpers/index.ts index 885cd67c..ea7659ca 100644 --- a/packages/clap/src/helpers/index.ts +++ b/packages/clap/src/helpers/index.ts @@ -1,6 +1,6 @@ -export { buildEntityIndex } from './buildEntityIndex' -export { filterAssets } from './filterAssets' -export { filterSegmentsByCategory } from './filterSegmentsByCategory' -export { getEmptyClap } from './getEmptyClap' -export { generateClapFromSimpleStory } from './generateClapFromSimpleStory' -export { removeGeneratedAssetUrls } from './removeGeneratedAssetUrls' \ No newline at end of file +export { buildEntityIndex } from '@/helpers/buildEntityIndex' +export { filterAssets } from '@/helpers/filterAssets' +export { filterSegmentsByCategory } from '@/helpers/filterSegmentsByCategory' +export { getEmptyClap } from '@/helpers/getEmptyClap' +export { generateClapFromSimpleStory } from '@/helpers/generateClapFromSimpleStory' +export { removeGeneratedAssetUrls } from '@/helpers/removeGeneratedAssetUrls' \ No newline at end of file diff --git a/packages/clap/src/index.ts b/packages/clap/src/index.ts index 0e18cb90..46e8d8b1 100644 --- a/packages/clap/src/index.ts +++ b/packages/clap/src/index.ts @@ -37,22 +37,22 @@ export { ClapWorkflowCategory, ClapWorkflowProvider, ClapWorkflow -} from './types' +} from '@/types' export { defaultMediaOrientation -} from './constants' +} from '@/constants' export { newClap, newEntity, newSegment, newWorkflow -} from './factories' +} from '@/factories' export { parseClap, serializeClap, fetchClap, updateClap -} from './io' +} from '@/io' export { filterSegments, filterSegmentsWithinRange, @@ -68,12 +68,12 @@ export { parseSegmentCategory, parseSegmentStatus, UUID -} from './utils' +} from '@/utils' export { blobToDataUri, dataUriToBlob, clapToDataUri -} from './converters' +} from '@/converters' export { buildEntityIndex, filterAssets, @@ -81,7 +81,7 @@ export { generateClapFromSimpleStory, getEmptyClap, removeGeneratedAssetUrls, -} from './helpers' +} from '@/helpers' export { sanitizeEntities, sanitizeEntity, @@ -90,4 +90,4 @@ export { sanitizeSegments, sanitizeWorkflow, sanitizeWorkflows, -} from './sanitizers' \ No newline at end of file +} from '@/sanitizers' \ No newline at end of file diff --git a/packages/clap/src/io/index.ts b/packages/clap/src/io/index.ts index 8095718e..5a46c812 100644 --- a/packages/clap/src/io/index.ts +++ b/packages/clap/src/io/index.ts @@ -1,4 +1,4 @@ -export { parseClap } from './parseClap' -export { serializeClap } from './serializeClap' -export { fetchClap } from './fetchClap' -export { updateClap } from './updateClap' +export { parseClap } from '@/io/parseClap' +export { serializeClap } from '@/io/serializeClap' +export { fetchClap } from '@/io/fetchClap' +export { updateClap } from '@/io/updateClap' diff --git a/packages/clap/src/io/parseClap.ts b/packages/clap/src/io/parseClap.ts index dce62f82..d3cdecc1 100644 --- a/packages/clap/src/io/parseClap.ts +++ b/packages/clap/src/io/parseClap.ts @@ -1,7 +1,7 @@ import YAML from "yaml" -import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat, ParseClapProgressUpdate, ClapWorkflow } from "../types" -import { dataUriToBlob } from "../converters/dataUriToBlob" +import { ClapHeader, ClapMeta, ClapEntity, ClapProject, ClapScene, ClapSegment, ClapFormat, ParseClapProgressUpdate, ClapWorkflow } from "@/types" +import { dataUriToBlob } from "@/converters/dataUriToBlob" import { buildEntityIndex } from "@/helpers/buildEntityIndex" import { sanitizeWorkflows } from "@/sanitizers/sanitizeWorkflows" import { sanitizeEntities } from "@/sanitizers/sanitizeEntities" diff --git a/packages/clap/src/sanitizers/index.ts b/packages/clap/src/sanitizers/index.ts index 6cf2b0f5..df6b6bca 100644 --- a/packages/clap/src/sanitizers/index.ts +++ b/packages/clap/src/sanitizers/index.ts @@ -1,7 +1,7 @@ -export { sanitizeEntities } from "./sanitizeEntities" -export { sanitizeEntity } from "./sanitizeEntity" -export { sanitizeMeta } from "./sanitizeMeta" -export { sanitizeSegment } from "./sanitizeSegment" -export { sanitizeSegments } from "./sanitizeSegments" -export { sanitizeWorkflow } from "./sanitizeWorkflow" -export { sanitizeWorkflows } from "./sanitizeWorkflows" \ No newline at end of file +export { sanitizeEntities } from "@/sanitizers/sanitizeEntities" +export { sanitizeEntity } from "@/sanitizers/sanitizeEntity" +export { sanitizeMeta } from "@/sanitizers/sanitizeMeta" +export { sanitizeSegment } from "@/sanitizers/sanitizeSegment" +export { sanitizeSegments } from "@/sanitizers/sanitizeSegments" +export { sanitizeWorkflow } from "@/sanitizers/sanitizeWorkflow" +export { sanitizeWorkflows } from "@/sanitizers/sanitizeWorkflows" \ No newline at end of file diff --git a/packages/clap/src/sanitizers/sanitizeEntities.ts b/packages/clap/src/sanitizers/sanitizeEntities.ts index 78774c34..ad84dfda 100644 --- a/packages/clap/src/sanitizers/sanitizeEntities.ts +++ b/packages/clap/src/sanitizers/sanitizeEntities.ts @@ -1,5 +1,5 @@ import { ClapEntity } from "@/types"; -import { sanitizeEntity } from "./sanitizeEntity"; +import { sanitizeEntity } from "@/sanitizers/sanitizeEntity"; export function sanitizeEntities(maybeEntities: ClapEntity[] = []): ClapEntity[] { return maybeEntities.map(entity => sanitizeEntity(entity)) diff --git a/packages/clap/src/sanitizers/sanitizeSegments.ts b/packages/clap/src/sanitizers/sanitizeSegments.ts index a84e5b6d..e9bafcc4 100644 --- a/packages/clap/src/sanitizers/sanitizeSegments.ts +++ b/packages/clap/src/sanitizers/sanitizeSegments.ts @@ -1,5 +1,5 @@ import { ClapSegment } from "@/types"; -import { sanitizeSegment } from "./sanitizeSegment"; +import { sanitizeSegment } from "@/sanitizers/sanitizeSegment"; export function sanitizeSegments(maybeSegments: ClapSegment[] = []): ClapSegment[] { return maybeSegments.map(segment => sanitizeSegment(segment)) diff --git a/packages/clap/src/sanitizers/sanitizeWorkflows.ts b/packages/clap/src/sanitizers/sanitizeWorkflows.ts index 03c31064..ee70c018 100644 --- a/packages/clap/src/sanitizers/sanitizeWorkflows.ts +++ b/packages/clap/src/sanitizers/sanitizeWorkflows.ts @@ -1,5 +1,5 @@ import { ClapWorkflow } from "@/types"; -import { sanitizeWorkflow } from "./sanitizeWorkflow"; +import { sanitizeWorkflow } from "@/sanitizers/sanitizeWorkflow"; export function sanitizeWorkflows(maybeWorkflows: ClapWorkflow[] = []): ClapWorkflow[] { return maybeWorkflows.map(workflow => sanitizeWorkflow(workflow)) diff --git a/packages/clap/src/utils/filterSegments.ts b/packages/clap/src/utils/filterSegments.ts index fda915f7..336dd291 100644 --- a/packages/clap/src/utils/filterSegments.ts +++ b/packages/clap/src/utils/filterSegments.ts @@ -1,5 +1,5 @@ import { ClapSegment, ClapSegmentCategory, ClapSegmentFilteringMode } from "@/types" -import { filterSegmentsWithinRange } from "./filterSegmentsWithinRange" +import { filterSegmentsWithinRange } from "@/utils/filterSegmentsWithinRange" /** * Return all the segments within the provided reference segment, for the given mode: diff --git a/packages/clap/src/utils/index.ts b/packages/clap/src/utils/index.ts index 124e8dd5..0136dbf2 100644 --- a/packages/clap/src/utils/index.ts +++ b/packages/clap/src/utils/index.ts @@ -1,14 +1,14 @@ -export { filterSegments } from './filterSegments' -export { filterSegmentsWithinRange } from './filterSegmentsWithinRange' -export { generateSeed } from './generateSeed' -export { getClapAssetSourceType } from './getClapAssetSourceType' -export { getValidNumber } from './getValidNumber' -export { isValidNumber } from './isValidNumber' -export { parseMediaOrientation } from './parseMediaOrientation' -export { parseOutputType } from './parseOutputType' -export { parseSegmentCategory } from './parseSegmentCategory' -export { parseSegmentStatus } from './parseSegmentStatus' -export { parseWorkflowEngine } from './parseWorkflowEngine' -export { parseWorkflowCategory } from './parseWorkflowCategory' -export { parseWorkflowProvider } from './parseWorkflowProvider' -export { UUID } from './uuid' \ No newline at end of file +export { filterSegments } from '@/utils/filterSegments' +export { filterSegmentsWithinRange } from '@/utils/filterSegmentsWithinRange' +export { generateSeed } from '@/utils/generateSeed' +export { getClapAssetSourceType } from '@/utils/getClapAssetSourceType' +export { getValidNumber } from '@/utils/getValidNumber' +export { isValidNumber } from '@/utils/isValidNumber' +export { parseMediaOrientation } from '@/utils/parseMediaOrientation' +export { parseOutputType } from '@/utils/parseOutputType' +export { parseSegmentCategory } from '@/utils/parseSegmentCategory' +export { parseSegmentStatus } from '@/utils/parseSegmentStatus' +export { parseWorkflowEngine } from '@/utils/parseWorkflowEngine' +export { parseWorkflowCategory } from '@/utils/parseWorkflowCategory' +export { parseWorkflowProvider } from '@/utils/parseWorkflowProvider' +export { UUID } from '@/utils/uuid' \ No newline at end of file diff --git a/packages/clap/src/utils/parseSegmentCategory.ts b/packages/clap/src/utils/parseSegmentCategory.ts index b909725b..4dc78c23 100644 --- a/packages/clap/src/utils/parseSegmentCategory.ts +++ b/packages/clap/src/utils/parseSegmentCategory.ts @@ -1,4 +1,4 @@ -import { ClapSegmentCategory } from "@/types" +import { ClapSegmentCategory } from "../types" export function parseSegmentCategory(input: any, defaultCategory?: ClapSegmentCategory): ClapSegmentCategory { diff --git a/packages/services/.gitignore b/packages/clapper-services/.gitignore similarity index 100% rename from packages/services/.gitignore rename to packages/clapper-services/.gitignore diff --git a/packages/services/.npmignore b/packages/clapper-services/.npmignore similarity index 100% rename from packages/services/.npmignore rename to packages/clapper-services/.npmignore diff --git a/packages/services/.prettierrc.json b/packages/clapper-services/.prettierrc.json similarity index 100% rename from packages/services/.prettierrc.json rename to packages/clapper-services/.prettierrc.json diff --git a/packages/services/LICENSE.md b/packages/clapper-services/LICENSE.md similarity index 100% rename from packages/services/LICENSE.md rename to packages/clapper-services/LICENSE.md diff --git a/packages/services/README.md b/packages/clapper-services/README.md similarity index 100% rename from packages/services/README.md rename to packages/clapper-services/README.md diff --git a/packages/services/package.json b/packages/clapper-services/package.json similarity index 88% rename from packages/services/package.json rename to packages/clapper-services/package.json index 1a08bfc4..465c9ea2 100644 --- a/packages/services/package.json +++ b/packages/clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3-2", + "version": "0.2.4", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,8 +22,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "file:../clap", - "@aitube/timeline": "file:../timeline", + "@aitube/clap": "workspace:*", + "@aitube/timeline": "workspace:*", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", @@ -32,7 +32,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/jbilcke-hf/clapper-services.git" + "url": "https://github.com/jbilcke-hf/services.git" }, "keywords": [ "Clapper", diff --git a/packages/services/src/assistant.ts b/packages/clapper-services/src/assistant.ts similarity index 100% rename from packages/services/src/assistant.ts rename to packages/clapper-services/src/assistant.ts diff --git a/packages/services/src/audio.ts b/packages/clapper-services/src/audio.ts similarity index 100% rename from packages/services/src/audio.ts rename to packages/clapper-services/src/audio.ts diff --git a/packages/services/src/base-types.ts b/packages/clapper-services/src/base-types.ts similarity index 100% rename from packages/services/src/base-types.ts rename to packages/clapper-services/src/base-types.ts diff --git a/packages/services/src/broadcast.ts b/packages/clapper-services/src/broadcast.ts similarity index 100% rename from packages/services/src/broadcast.ts rename to packages/clapper-services/src/broadcast.ts diff --git a/packages/services/src/editors.ts b/packages/clapper-services/src/editors.ts similarity index 100% rename from packages/services/src/editors.ts rename to packages/clapper-services/src/editors.ts diff --git a/packages/services/src/entity-editor.ts b/packages/clapper-services/src/entity-editor.ts similarity index 100% rename from packages/services/src/entity-editor.ts rename to packages/clapper-services/src/entity-editor.ts diff --git a/packages/services/src/filter-editor.ts b/packages/clapper-services/src/filter-editor.ts similarity index 100% rename from packages/services/src/filter-editor.ts rename to packages/clapper-services/src/filter-editor.ts diff --git a/packages/services/src/index.ts b/packages/clapper-services/src/index.ts similarity index 100% rename from packages/services/src/index.ts rename to packages/clapper-services/src/index.ts diff --git a/packages/services/src/io.ts b/packages/clapper-services/src/io.ts similarity index 100% rename from packages/services/src/io.ts rename to packages/clapper-services/src/io.ts diff --git a/packages/services/src/mic.ts b/packages/clapper-services/src/mic.ts similarity index 100% rename from packages/services/src/mic.ts rename to packages/clapper-services/src/mic.ts diff --git a/packages/services/src/monitor.ts b/packages/clapper-services/src/monitor.ts similarity index 100% rename from packages/services/src/monitor.ts rename to packages/clapper-services/src/monitor.ts diff --git a/packages/services/src/plugin.ts b/packages/clapper-services/src/plugin.ts similarity index 100% rename from packages/services/src/plugin.ts rename to packages/clapper-services/src/plugin.ts diff --git a/packages/services/src/plugins.ts b/packages/clapper-services/src/plugins.ts similarity index 100% rename from packages/services/src/plugins.ts rename to packages/clapper-services/src/plugins.ts diff --git a/packages/services/src/project-editor.ts b/packages/clapper-services/src/project-editor.ts similarity index 100% rename from packages/services/src/project-editor.ts rename to packages/clapper-services/src/project-editor.ts diff --git a/packages/services/src/renderer.ts b/packages/clapper-services/src/renderer.ts similarity index 100% rename from packages/services/src/renderer.ts rename to packages/clapper-services/src/renderer.ts diff --git a/packages/services/src/resolver.ts b/packages/clapper-services/src/resolver.ts similarity index 100% rename from packages/services/src/resolver.ts rename to packages/clapper-services/src/resolver.ts diff --git a/packages/services/src/script-editor.ts b/packages/clapper-services/src/script-editor.ts similarity index 100% rename from packages/services/src/script-editor.ts rename to packages/clapper-services/src/script-editor.ts diff --git a/packages/services/src/segment-editor.ts b/packages/clapper-services/src/segment-editor.ts similarity index 100% rename from packages/services/src/segment-editor.ts rename to packages/clapper-services/src/segment-editor.ts diff --git a/packages/services/src/services.ts b/packages/clapper-services/src/services.ts similarity index 100% rename from packages/services/src/services.ts rename to packages/clapper-services/src/services.ts diff --git a/packages/services/src/settings.ts b/packages/clapper-services/src/settings.ts similarity index 100% rename from packages/services/src/settings.ts rename to packages/clapper-services/src/settings.ts diff --git a/packages/services/src/simulator.ts b/packages/clapper-services/src/simulator.ts similarity index 100% rename from packages/services/src/simulator.ts rename to packages/clapper-services/src/simulator.ts diff --git a/packages/services/src/speech.d.ts b/packages/clapper-services/src/speech.d.ts similarity index 100% rename from packages/services/src/speech.d.ts rename to packages/clapper-services/src/speech.d.ts diff --git a/packages/services/src/tasks.ts b/packages/clapper-services/src/tasks.ts similarity index 100% rename from packages/services/src/tasks.ts rename to packages/clapper-services/src/tasks.ts diff --git a/packages/services/src/types.ts b/packages/clapper-services/src/types.ts similarity index 81% rename from packages/services/src/types.ts rename to packages/clapper-services/src/types.ts index 995065b2..731e5dde 100644 --- a/packages/services/src/types.ts +++ b/packages/clapper-services/src/types.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapMeta } from "@aitube/clap" +// import { ClapEntity, ClapMeta } from "@aitube/clap" import { TimelineSegment } from "@aitube/timeline" @@ -14,14 +14,14 @@ export type ResolveRequest = { // the slice to use for rendering segments: TimelineSegment[] - entities: Record + entities: Record // ClapEntity speakingCharactersIds: string[] generalCharactersIds: string[] mainCharacterId?: string - mainCharacterEntity?: ClapEntity + mainCharacterEntity?: any // ClapEntity - meta: ClapMeta + meta: any // ClapMeta prompts: ResolveRequestPrompts } @@ -41,7 +41,7 @@ export type AssistantRequest = { actionLine: string // used to provide more context - entities: Record + entities: Record // ClapEntity // used to provide more context projectInfo: string diff --git a/packages/services/src/ui.ts b/packages/clapper-services/src/ui.ts similarity index 100% rename from packages/services/src/ui.ts rename to packages/clapper-services/src/ui.ts diff --git a/packages/services/src/version-control.ts b/packages/clapper-services/src/version-control.ts similarity index 100% rename from packages/services/src/version-control.ts rename to packages/clapper-services/src/version-control.ts diff --git a/packages/services/src/workflow-editor.ts b/packages/clapper-services/src/workflow-editor.ts similarity index 100% rename from packages/services/src/workflow-editor.ts rename to packages/clapper-services/src/workflow-editor.ts diff --git a/packages/services/tsconfig.json b/packages/clapper-services/tsconfig.json similarity index 100% rename from packages/services/tsconfig.json rename to packages/clapper-services/tsconfig.json diff --git a/packages/services/tsconfig.types.json b/packages/clapper-services/tsconfig.types.json similarity index 100% rename from packages/services/tsconfig.types.json rename to packages/clapper-services/tsconfig.types.json diff --git a/packages/colors/bun.lockb b/packages/colors/bun.lockb deleted file mode 100755 index 5e3bc4904bffbf3617bebdd7f57064b6415e901a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17619 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 diff --git a/packages/colors/package.json b/packages/colors/package.json index 3097b74c..f45799a4 100644 --- a/packages/colors/package.json +++ b/packages/colors/package.json @@ -4,13 +4,13 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3", + "version": "0.2.4", "description": "Various color settings and utilities for AiTube", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", - "publish": "npm run build && npm publish --access public", + "publish": "bun build && npm publish --access public", "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { @@ -19,9 +19,6 @@ "rimraf": "^6.0.1", "typescript": "^5.5.4" }, - "peerDependencies": { - "@aitube/clap": "file:../clap" - }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-colors.git" @@ -36,6 +33,5 @@ "dist/*.js", "dist/*.d.ts", "dist/**/*.d.ts" - ], - "dependencies": {} + ] } diff --git a/packages/colors/src/types.ts b/packages/colors/src/types.ts index a047ce92..93943536 100644 --- a/packages/colors/src/types.ts +++ b/packages/colors/src/types.ts @@ -1,10 +1,10 @@ -import { ClapSegmentCategory } from "@aitube/clap" +// import { ClapSegmentCategory } from "@aitube/clap" import { SegmentColor } from "./constants/colors" export interface ClapSegmentCategorySettings { - id: ClapSegmentCategory // eg. "country" + id: any // ClapSegmentCategory // eg. "country" title: string // eg. Country description: string // description in one sentence color: SegmentColor // base color name, in lowercase diff --git a/packages/engine/bun.lockb b/packages/engine/bun.lockb deleted file mode 100755 index 9429d8d5fd4df53c1779b11fd12976332bf17297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17619 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 diff --git a/packages/engine/package.json b/packages/engine/package.json index 83b3b862..3a1c71c6 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -4,14 +4,14 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.2.3", + "version": "0.2.4", "description": "The engine powering AiTube.at and Clapper.app", "scripts": { - "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", + "build": "bun build ./src/index.ts --outfile=dist/index.js && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public", - "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" + "update": "rm -Rf node_modules && rm bun.lockb && bun i && bun run build" }, "devDependencies": { "bun-types": "latest", @@ -19,9 +19,6 @@ "rimraf": "^6.0.1", "typescript": "^5.5.4" }, - "peerDependencies": { - "@aitube/clap": "file:../clap" - }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-engine.git" diff --git a/packages/engine/src/renderers/storyboard/renderShotToStoryboard.ts b/packages/engine/src/renderers/storyboard/renderShotToStoryboard.ts index 13a6f697..f61a9a6b 100644 --- a/packages/engine/src/renderers/storyboard/renderShotToStoryboard.ts +++ b/packages/engine/src/renderers/storyboard/renderShotToStoryboard.ts @@ -85,7 +85,7 @@ export async function renderShotToStoryboard({ // console.log(`we have ${existingClap.entities.length} entities`) // check if we have an entity image we can use - const identityImage = existingClap.entities.find(e => e.id === shotStoryboardSegment.entityId)?.imageId + const identityImage = existingClap.entities.find((e: any) => e.id === shotStoryboardSegment.entityId)?.imageId if (identityImage) { // if (debug) { console.log(`[@aitube-engine/renderShotToStoryboard] using an entity to generate the storyboard..`) } } diff --git a/packages/io/bun.lockb b/packages/io/bun.lockb deleted file mode 100755 index 739d9da8b3d96df50bc099b2ada453e030874f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28648 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 OK5z(5@Bi=p|9=3G5*`Tv diff --git a/packages/io/package.json b/packages/io/package.json index 0c47d10e..eb6d911e 100644 --- a/packages/io/package.json +++ b/packages/io/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.1", + "version": "0.2.4", "description": "Collection of useful I/O utilities for NodeJS. Used by AiTube.at", "scripts": { "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", @@ -19,7 +19,6 @@ "rimraf": "^5.0.7", "typescript": "^5.4.5" }, - "peerDependencies": {}, "dependencies": { "mime-types": "^2.1.35", "pure-uuid": "^1.8.1", diff --git a/packages/services/bun.lockb b/packages/services/bun.lockb deleted file mode 100755 index 5a369633b88be98dc7c26c06c10e366258c7ea2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89108 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 diff --git a/packages/timeline/README.md b/packages/timeline/README.md index fdac681e..5a424f08 100644 --- a/packages/timeline/README.md +++ b/packages/timeline/README.md @@ -18,13 +18,13 @@ Note: as warned before, this library is not ready for public use yet. I cannot provide support until the basic features have been implemented and some critical bugs fixed. ```bash -npm i @aitube/timeline +npm install @aitube/timeline ``` Depending on your project configuration and package manager, you may need to install some additional packages manually, such as React, Radix, Tailwind, Three.js, Zustand etc: ```bash -npm i @aitube/clap @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand +npm install @aitube/clap @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand ``` If you forget some dependencies you might get weird errors diff --git a/packages/timeline/bun.lockb b/packages/timeline/bun.lockb deleted file mode 100755 index 49c91d3d3eac7010244db4f9c5d084edaf8847b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160755 zcmeFac{o*V8#ca4A{nD(NJx>&*i4xfnW-dXp64k-DwXDlL>iR_r9qkpr7|ZfB16(- zXpS_f-*wsRexLO`zxS!V^ZoIC$MN1r%en92Jg@7%?qS_)ZJtM7RwW`VRK?XNP{kuK za*S(4;83_G`3JfAdHVQ!O!5p04R8sc6sbCtlfhtwarllOp;I>PYqa$3odNA;GHV-N z4rxCd;$gk`vDei4E1nv z3y05IAUF*2<$zeOL7}@#I5-y=7U>i2fg)9d7z{qBpTxy%?-}M1=@A$n78>O59}&!8 zRB$sG(ola25bbQI@-cv;Aio4~G~jf=v4G-$V*tMnW|r3h%0s>YP!4bhpbTIXh4z5R zpGoCM1EQTlfRcbc;1@q&a8OvdTUZ!F7c!Wi20w-Z2D$_W`M5I}9$~H#KK|~EK@gOY zQ2ttw!59HpN8t?$b1B>bCQh1EQ zoq!@xzm~#q3SB9*q);Em5&IMB6A;u^@~e3OO21Zu(vK(sdx>Jf*+pd;TN z5ZnJwCwUChkALa}hkAsE`*?&ZLcGAG1dlL(pFo)KIWWl-AfE(?^U0UOUYK+^J{FM2 z_Isca&aZ#=d($|kU+x~R5nd3-fH3$0X)5q=p34AYzxV)gzPtimjLT9*CXb98880y< zX8lk=?7vT-w@0W?c$iP1r@xPvcX(8&OK@;BgAo+yhQr2yA&NviIf2>U)88dL+{2ym zh_d795*8i;^`RaSVLqPGi~wb3zh+Nl#(e`Ij^AWJ^s9v8`A%ZC^9`F6?GoV6a0&Ga zb_oshaDs9iuhhv*TnC8bBd5X~Umvf)piuA(`{Uvt#;B&sJ;GoFpnRSxvz?1uP-r0d z<>K4#K0`qb<}T<617e(xfgk8sM5xasUx;aNL}0XAkh{l4syqu2=i4?w^e2(RQyR>; z9tOnu77gVX$3O~w!Y1{H`l%*0ZcvW%YB7aZr!eE-?-7aaG4dgg_4_D128g=u9v;Dy ze8L!(6wes2zdXn-Jk%%9!y_yr+z0ya=@aNa2{uI2=}bR#C=A9eANEv0p8%h5hRzIT zy+>F`ghyyJ!_C{p-w*7+hjQ$vw@cV07+Wtvn7=r$xB=0g$t)&*fVLR7nOe;8Pz1#N zLqVH4|DHe|0__mHC>;hMOx1)cu!C_7^9YFa2xTyQ z!-4`K6bvtqz_92*H%727Q`ZF$$Bm4?HI;AEVK9WDJXxO^U(!FaF8Y00wCT;?#yNKjsZ$Ro(sxl0m=Rr z?c(q66Bf=GZ^De*Xj5ifK+VP9#oa>~@;LANpdRD?o@&Pni2KOrdCYj+1%JgL9}9@{ zy8+?|TSh`X_=My5&YXGwI}M0_WdOofoDgckv`h9I5_gQNYczwwWyKtiZ$0gjm ze;Z(=Kzp1|?u(e^)qv<9@cIYL3i87t|8^nMpZ-k);KG2Ne?jMPO z`*%Mk!q5IV`-d&V0&FA#?a4TCdNS>ibKeKpvoYRq3z`Ibna3T-<2b_oE+_)-L9P*= zp12?QczAeBo1)2RhkCT%1c>v2v_B7d+!u}lqWvr|jN=R8?T=GL1fIqijCNnDzknF$ zyMP!+Ie%t*K??i)n0~wZxcA>6oC28jH=#Y+4Gszqc5(A#c;XEaY`VjG2-0w8jD$Hb z0_qun=*L-Tj|j6gJZ!Qr%vwNL31fqqI_m(@{xU%H-wzPSgXrc^{D&b-fBVnTaAOGY z2=j&$hDU%49HgLMM9B;a2Z8}&zfUz7vJ#XdcwV2eAZW=b+(?{UOs9bwe40a zXI)4_x~{tNt0Nl(YiqfKt=n?^Qe96j&`#N6(5HK?Pm#+<$e8!*vSgLTo5vMs&)^Nx zy3=8mdHKS&RU_BDNouzAe>_+4kZy8P=&tciN%QyxpH{0){9gWDI>v(IdF;c4IYX>G zLz7C~ZJV#}U-xOHM9NAj`}oLi#cAVDOjrMQ&*+7&0#CQT!L44WjCjqgvY#8b_GO)y z7w(w;Zn=ek(7Nh;1ujR`S8IlIhu66K-~GsGmHFn4&c5m&1wXq!43#KTxGXwC#BpoJ zs@YDQS023OX<6cOx2$VE&r0Qo*`d{bXO@JmpZnwNp|P>f7BXYyZq{xTlGoOc8uIac z^?o7gTZ-)#{!0)1tWCbCn``9b7&>Qs7XL_t_C0x##n!X$DN9KUAKoLWdg*?<+v1X* z1ew@_cH6hl>XP@}oSEc0;ybUPjA+jU5k(D-jcxlMul6)j+tG02CgY9qxOPq*@vmRi ztjnf)lnk*A@&%66iX^V%-p;}^mmN47@B4;Fp+;3N)A>BNAm`Ni73cP+ zoQ=8hJo(7*k;b22?g;;|e@@S3pNm>YG`Ry_G&f)0ovVIz#$JVliOOp{T#xp~_;+tH zbv`z%_Qy~Chnk)XH@}gvH#Zz5BI0i=FZke^wNDY}kNev!4>%LoOzumZfN^L={fs0eXR+*{^Oyw7VjFNCI0@299d!9+v41I&Rq8H zR$OpaUB!JF&ZkaRZ{7skUw<<=tNFF!LaPU6jvq=}3ndh|FFP-NawPgkkj6eq-95)r zI!B1rtg*Y_H8v(l$X;5mRlbl{?&4yOtj9*5_XhX*bDRp6GiW#-q;}T-joY3s_r-Qi zT7?GYDmM>|Dk~Co4H>Jg!zVbsdeO0a^FHl;{yQD}J5#MYOulseQ>W2M)%uL`#m!$+ zK4m!wy)e9Jo3Q+((2?E+5_79%-shLjR5P`eSlMzs?227(9;e{@mwD023!jF3);150 zmR@sHYj%>=fiKSfvH$FM>E>90k(>{gZCTCGY?UaxbMWk~hXr+8=e8z24nJ*P#&c$r zjOmTx@S|HF zujN7BIhkYEC+=#PWhZVD`PAgTs`+L|!Lf$6bJ8X*sT^kZU~$1)rFBD;_Lya#IXp{d zu2W2kiRni7)YDfQN?SbQ+oMA5TMt{DsE&GFH)_h3`i+8LvX66e3ch)`;AZok=5x7% zZq|qPb@jS7IS=R2%#~eq;Om;7V>^e98O66sLA}HJPU$0$9N)>;E=<-_SFE`qGOOEp zeoA@HNJHNdSCZ6srs~{!aAA>n{pYRjm-an--))g9pwnogn>gozq{+P!;v zyE4XJGuwXnlb?2KQpo+rVwan;w~cp>>Q)itag|BV@7S~Uvi^}ift;vB&li&|BBl)8 z-P({iq)o%FzExR7#x!P3q{*pJQIo=D7rUnoo;fd9gGa$^-h77*(|1ftl`Rq}%`aV% zqUUv7p-|xEQR95~_x19X3W;;ObVdxemo}GPU3$x2_4Ck8=eBOJQ!<)#ujtLP2~Q+r z3vUGqyzmi_D6k4Mjvc<=)v5LH0;_U!7ooGob@Ez6)s#Y9bjOsW*h%hYImtpdRxx5@*Up=5n*AxMPdeEo&~4xLs1d_o%vVgBdqY<= z*GJ;yg5@tPV+NVoWt>;Iontdz(w9s74v(S@PjSJp6hm9##7D-0`bLihwO>ykH)g~% znOM7~vtLFxY)ja4L2Tah1^g*v+h&HkI%$jNMlF@Fn3lDGud?%1W~Plw(R_*CfY(P& z+XclLp4V=@-WJjrcf}@Q){S*d<@quubA0Em_NA;^4?moL3ymL!;i`txn z3bCt&B{~Cc?OOEGs@!gA*UzupTzU#cA8}tQdMTs*vG8=6&=ha3Me4Sd+{bQDP?`I^ z*Fp5dryP+i&J@pWWL<>ay8XC3?X7oSIr)51k&m2O(h&3IQNc=Y^pY;;)QCq_Pm~Z-5MC*7Q*m|ECnM3f(RXI_gb(A3 z-kx0YD1XTa5xLZSgVE!U)U0Uu*l32d?-j85UoP3a)UuW-gQRx!0QH^g;9Mu&WExPCH3yh)h?wH+Hvuu6zgon#e1v zK~)*aBjcthsvWA5d=>Hed*QS%{XY2#<_BiSay#zQ-gGE%L#XdnN0atDl1Epx zoou9XX`f~okaZdD%{{GIY;G^oJ{&CX*uhS27;#!hi|^O!F|)Y z1wM^?-t>#N-Jb2CjB4!bQ^XO(Uxm*3Jl}P(T$E20U^ql@a;)k5!^^^Cv3_Eu3 z-b}76?@YxIrAyYmdXjJE&%38Ex;(~Mx6NVkd$sr4sn2&wsi+woNsv6fXiwu}^|6li z6Q1#XoV{xMaQ9OS$6T*#9Pz~3>FthB)y_d?=Nu%9&n=tsqoccE*p9V7t?f&Lu6$Wx zJLlHrMyXNq)+O=ZdF(FrY45c$oLJvJd*c!z4*O-}U!8oub;xYJ`NJlJYs^U;&(l-V z%E}#V5UxGTg9;}gunLcM+K{+VKpL& zFUQz@?K|*fc(6@XT~p_?$b#ZQ?#E=VER^aHPX73WPf~AgXy=0{$N6^0=Ko0AT)Om; z%KYT8yS8QAPr;VOm<<6=X2OTSRRZsNxgV6B4^#SnA^B*ng5R#ARv~VNf<5b0HW=QWX16(!qdRoSx?Y{f5(TB) z%S){Krkoziry&f1K=+Qz7FL-*YAwd>WTda@L?wK+2NuL;R`^g zvHw^G&!hh-$NaAn;m-s9bl_v`xPL|XM;+mB0-`GL2SYtOeIWdgz{mc>vp+sB<2w$P z65-DPqq>xRcn)WvAFL$8j{!dRAM+RkyjV$ue*^eafRBC0KCqeyza4_^FaW;65C+43 z0Q}v+ABg>4;M)wqz9|ob;Wz;P5#Ylsx`aQCzc9R9av1d^LGIsUIG6x|LXwx_VDt0An`i~{DJr{2Aj@6)=wbt7Y-nPw}FrQH@R=IyMN(J z-f6&xWx&8Spv2+^MD`zZ;OkNLNf|2=r0q7~Ytj5C{rH^*;Wq$Z6ZmBBh3$l;MEIlN zhJpP@k{Dd<#!muX)S3@~?+yI<1K^(>ARk})55)fb0rGbO-(&#&e+vA$1K>}9gWo{- zp#$V!8X%t&zBCw!|0V9GZ*xqrL>z9#U=vk$xXFI9NxvIRb?JmMR%p9p+4 z;KMP7twi`wfsgwKxqq@MLijrHz&#uI7&mtMK=|<#pWL_EeSUfle08u-^a%d0AEez# z_>z{+{~eFi6aGBly$wN5DfbjvvVr z{of&J?+ARfkK>27NjaA0w4F^ zKixkwDLy&3vm3u!;Ol^Wj6eFs>N+I;Pan--EC4>MJQ4=N-vWGGe+#r|gsc=XZ8VJ>iRu8QA=@ z0=^FPALk$XPjunqFB56Ecg$bsA5!*9B2`J+wgDgK54;BIw@u1_r$O4u$};)5{;-VI zF(CXP;FJ3g&OcV?AmJYdz7zNl)c(1H{a_^#zK9(2{VA@W8LSYgHiTa;55F@G_DR19 z{!WVUwZ}3Tb_3w20N)z;xNh)bH4*zifsgMWFz(1_H~wY{42Bi((JtOU*nNL~iQ*G~ z*tO3$j=BDkhp{I*@bQ<4v@-<0G5C*MyjZ;l68;Y0zpd*cVr1K7Ww7u^WG1 z;N$q={2`jG_(0m`03V;<$h;-xztbS?8i20~{2`QmqQfd*0baPy1wQFFL00(zz{mZc zRUXkL{^tT8_ivKNdCW>8?b|3mu}{YFcN&B*Ie{5}!YAdd@-2Xm@kc(ZzN0p=vx4Fy z7w_S$Y7qV<;A8yBxRZXMjbA0g?*;x;ijNxX@+T`Z7;}J+Jk;d*l~Gz9v7Z2Z4T=x1 zQrWhj4}A2W_|0zo+JSEfeDnu3a12;U#D5dmJauUOXN8Mx2tNb(Ml?Pd$KUA?ehct1 z{v^+?|Dz`{{YO6bpWXPy0iWFekx#~fRsZXOkK>1SS>>WO>964AzwaNcY7o9L@O8jG z#+}vJ)9vr0_^ieaxtNIkC&1SO`^0a8%vS&Ylkk;Q{(gS>cgEjq2;T$vc>lq9gZ(Gv ze{cQ&&yjW+z{mX?z6Qg;r(!t~egp9F{R&l>pn z{P(B*KM8!?zi{6h_6PQ#0v|%q|Na5_?B2iTz{}Sqz{hy7+IMLBpE&OVz9sOnjGZ+| z;@=5;+`n+{pnX=?5aFxA;T6XZZU2dV{M$Nmejq-8)Nd29zZ>{u|3&+(CcDLz>@q#X5rl}Nkez$f<~Y|m;R2)_&X7(dLT|E#V-!dIN~ z*Yh7KLqC3(NLzOrANN3Z<5vlMJpU6t5=U0;i$U;U3roQEXq(;s8v-BWNBD@WB;xN% zijQ`&j9vRzfsgZ-@Yy{-eFi@KOF*Ad17pBSBK}W;U;cn0=)Zsb$@?Q$;1mB@wT=D} z`&q!p{gc&sPx?mq4}g#TCwW$NNc*8+9Qmxq{h#(103Y`ccKS~5e=5aib>9Eeehu*9 z-yi!w6b2ppk8xvl?$Z4?1wMWMB>w#lN&MGS_R%&wF(CZwz=vC4fBeZB`kig8C;Xql zHvm4lf3d=)^Yvl!WBmVg{FeiNF~!IJ6Tg1v2Wck=hgUqmV&Cx^@jD__Pxv-KhFeJg z`o}eZXFygG;jaTe?%&vdcIFV_FNDokANXif04`FF`Clc{E))1hz{l|ug^Sg7O!!*b z%=drD$N01R{$L~UasNa9D7c6&eEel1?L=Ym%m+Tn|B^(jB<+_1-;=U04)y2eR52zQwb!s~a- zzJJv{PlsNIpNaqTfIpD=n+ALk|4;nb_5UI8G5&nu6RUd{-G6@lzuU(;RuU)G$PD-f zl>dJ+fA#|(y3pVMKjF6lpNv1Q9pcyT`as%=f%EwMjrR^r?Czf)z{mb0k5w+(A@+{~ z8OLuB7P65DzZLj+{y;vKk$(J6ituF&|9bz0&o8X{LHI7f$NdNG;>9k1H)WsfAHVaP z)D!!HM$G#cmZNRF2eFa}e;e?vDgXau{GI~ego;1*pXmP12hwh$@n66HjQ+Fg1L1E3 zKDf{ye=K8n{2PEz)(_eyx~%#?3=Tgy|NeCROn|?X#%I@lEASUl{6E=0X3S%rKhgg` z;co}N`vCmcfXRdBCyYH=L%)kX){{5|0H6N+!tVHI178>HbAjeaxY%94nx=pK{wk}s z>Ha4JpX`6gC;h@Uze=QCDe(2df07sZ6^T|y+7E-9H`)Jj47h1+e)W;?mjEA@Q2+YF z_8&`2SqcN;X9M2}_+dZ@>5&MpblrwYx z{*$yj34C(@`;-2+178*FqaLeg2lR^AAGP?e|NaIk`**MZsv&I`10Um$<44N=YW44* zNZUQYC+m-l;lH!~sv-Pg4$QwFNA3u?*ge0;0N)e*XU8^rLF_*PK6(FwWry{xyGD-8->w#D7cR!x1(C z*B>eSUEk^aeZa^0%Z_b2{~7Sf{>O@4(uVjd2M?bZKeB(YIu8lo5BPe(CwX@HCn)=5 z?1>KX^WTuPYX?5=UzlgrHfj>Syz^h@H{3&5O@!|=K>mK< zR`*VHk?BqsKZJk_7?-6*k^U@P@nL30$-1cAKGTuegp7v z{vi)F$vD8rUnXpeX{;Ob@7IUIXXLVah9G=9;LoA#v-1vt@biEVU*RVZ`>e*0@Y{ip z`w#Nae|Guu?o2*%|0Mq2z*htN$Q6T&)j3G~&j9{pijNxX`d>`($+!_+kosjJ?Ye<) z0QNDD8t4NniSTE5{B{5Sllb9(CSC{Z3F4B+R`9SPX@%(H3;{HL(S>^iyUk~hK z`#*{Q3E<=WMLv!{tBLse3i$99MgsCAStUa|!dLTR-apWHEMqr*KETKG6HxKLqtEvF z`Qkt9vpav@10TH*@?+|Jk+g0DRm(kcY8jm!C%Q(Rbtz#}6zdGJaLS zC-Ij6-VheJ*o5$9eE!;hv5bpNz7z2A{)Ki&vB-T3{W{O1L3 z09@?O-$8!N{RjD&*tM?#e0}gA=N;a^SWTq=k-*3EJMz#rDaZV;5@~k^_@)#e?jvmb zKii-A{sC>1>sNM39kIU&_+@bQ<4^gkc?GblcuA6QL<-vxa9{s8lM@vtaB z_^QEw-T$*$r+QmlM8!ICK1Q@4>|G{L2A8+DAPcJ9gvO4SXHoP6JpcZw|FTg7<2wT%=MR~8 z?9QJu;5z}Ij2qsASxKB!BlTs>_YY{F_`nX|2l(Xu3-WLdv66`WY~bVmfq8PV!*2op zeBdMJPxepc=)dL5vKM8yj z;N$!ya{@m8Hj%alv44O5`7M!ZK=>)ZUrO00YlsyM!v6sL1q0yEjf4Nk?Ev^Sz$fef zPyAPnXP*B_e^}`|wju3Pfsf;lw*SO_1MmkDKh+gX|Nqo}0`PJF_)~rb@T~{HADzHF z|Ng0cSK!Ycfc<^IpALKmBpg##?*U}|TY))~vd_->8|_I^7ix`$3vJ87g|U#MP#zEy zB9@QE3?#&1aH+zDYx;p^o7^#3yAcsf)4K;(wY z11>E0f(sKO#sl`g{_%s?VEqXZ#}i&F^(Q(aA6{4VCpuz#c#QAo!Q*g$Ld5p)c+{T| z(GNH-^xItyh&4;~FTB;lo_3NlSBJ%60JR;UN zP2!-c#LaA9HvvHi#X)=Wg5ZYqz6^*t1RrmzXoT>h-h~*AnK|D;&^LP<zmBR2~sO&Y*B6RgQ@K*?_30LzUAJ?denHbj0?C zP>yjiq4@JDG^fgK0O23Q7JpEP_7*`Nbsea3b`b44QanV=I|Jf)c>v=5JAf(=0>p%f zAA>0jp~?}F7e(a}u|KhZs2fj}BjU#u6edu(5(^>G5sOw)^{c6RI->3xDCYy*28j03 zD9i+ee~ex51KaJ!%s&w0x1VZvfT~9v0p%9}k#~tIrz7&NQRV*)kyi-y*zOh}j!!Yw zo{m^l0zVMRUnwDCz6^i-2GLFh)$YF`j^6`H?;(Y?RC`3^KLW&c(L$Be5&eD&}oIpnEAPTuC91Mv5@c_a<#!#x94>OPu@gqN# z|8I!80#rRB<^`!dq9o)ePmQx|0SZH8D{>0*v_0PN5s4Zg_eL=WsN^5#Qxbs z9_=lm(3z^IBieI^a;);C&>Il-eX#I1h<1XZ9oh+_+9Tq6i=xV70P()Cp2}|mgnx`J z6mFx+w^R8vK=dn%8cw ze_yfJ@xV*&*SoH1NVTS7;A;(8G{ zUguc+iByOCHI*`ZjWiNM%w-~9I)6wzlN6YK**y7l?B1&>KUPlGyRjsx?aYoRfuS5z zkIsF(+-mof?KPzjV?8`tV8weZ#Dk-jzy=A2tk)5T|4lDN{9Piy)9wD0vx zYd^C z#(l~*-RIS2?%+7Lt!JD3%z0OyJQ2R{CGE}^)tckYQ#W@A*nvcz`Zo5(xg?|#lQu^s;0y!ZS1GFB8UE;?Givy!HZ z&-f&9#R=b+ESV!Q{ztN6bPe}f;Rml`yk)jtlQ4|yy7}nH#Y=LBQ}ibeTRprwqBf*L zw*0P7)E2&d-%PfVr=Z~Pg+T*cnUWK)y@m9*#DCI#-%t7 z8}$Q0Prtr+H|m|I_OhP&&cc4umwqZMc|3kv!@K4ESp$p1qd0~geR7kgi)VR~xK5WA zy?o%abWX&bWy-poceYtvvOfJ_&a@34-Y%O&GaJJX-kf?bY{l%{aBo>F)!Q7&MPakI z?)1?dG<(P3sF20V%y*Z}`8$+|0&Wyhr4FFl*|_KLLl=nI2;r59!F?rn3Jzcu4)v)R-- zkIH>n8aqa|=))o->lnX-C5fx!TrHR4lHIcTa(2zK_vd=dR8m^I`+f2i-{~H2ON|UJ z^E4EEmoqw2z+>lIxyi3}>#ZFp>l&3!XH{Q&b+UR@KA!2|9}oFm%>U>nR=!*lsJU(U zB5NauAJ^RQ*B!BLmj3uv>EkCY zUS-kuH9dRg3wO;$R)xU=x5_!R&edr*=ZqV3YB{Bw09yF&i6k!X-3AKE+rxb-I&vQJ zB}DTp9jW-#A$vqSZepFmeebW5IXb7WbjMh%d>rv=?ZsEm^xssid-vr`@s`P9s`u`X z`ItlL;<#ZfNaDJEse-@W>H6-sQ=(1_=N-CtzU6?H%Mr~R%dV%{Nao4L9&a0cx~!)x zH?6}gSWj3->%5Ab(2nP$-!HZovDx06#lh6&L``8L3dkj|6EG^uQChZbq5ZM>^<%73 zUYbUnICFRx$MWt6vvu7qo~#fs$yTW0i101Ra?KcAd8P3|_R0;Za@WH*jZB}Dy`x_@ zq2E^#x^BrJm1DzO#B&+9!eZsOW)IgnI%(tFIa+kSE_ivh&-)X+Bq1q(bebM{V z)t^#Fx|H$7Z}5Ju*-<4fXgy^Z`OX0S9ZuIh=68BT`iqTyDb_lwpHp8?J^AkYmODAK za*I!BPj5?mZLYGmTXt~q>rjt(=`kG~?XwxG!6xdQPu7@CR@OM6-K5p;FApODH1VA? zNnE3HnzzNhd%B1*E-fU*ywzrkOoIsLyg_IE-kFN>NAwL>)14EkmQ%)gJTFMKerM6D zA0v6EE}Wfr?lfe=(;;J|jY6u8HEUgNadSmx z^L@X4LC>w`Nr2qd(^A}5=S{FOop4k5nC7YJqon2PKlg2WUe>c>+JUXFw>$q7eav#ra?09ro)ODq3ZlZvac#h(%`e98L;etz(uI=mBOva{Nxw zGwP*wx+hiVe!Ee;yT$c|$&Xd{FQ?AiA2Vi)`RUgJT~$__jc(U&iBBn#^L%IVN?pUQ zu-9`+jeKEW)N`8dD7r4s6Nh)B)LtGq6#jxYw)kt|;hp0y&+B6GG4cxh6GkCi5YyIs$rk*RRc`q#^ zuo);Ax&nR=)9 z^!e_7UFLmAnur2&{V)=~wY1zp?e36E*KR&Y)wA*|D7FnLb1r}Wqeq_OVCWT{Gp)t` zJlY#mo=u%({4ld`y*Ee5FlDNz|MdNKX7v=bJ_Re_Jy|F|0 z$;9lhw?^-e*4Vv&wdUfcRGEopeyh$sGqP9bJe(hF{7~d!z_w(eucmG$tyv92>}a|& zL==!~L(PH@4mE=e>O^+B8m&EbN@?Prh2Kq;UyM|j-O-RR+95rvN@?5p_>fRLY1Mb( z6F$jnDHSN4ZAlrTXKH)dR#cs)JBF_78`kYrc51EBi_7_g=j_~mzDr1HnQG;aj~23r zLK+)_#%A_>4tHwmt2a|#;NO?CI+I&_vQ)~MvaKsFWoV8*EyTQEFykvr*Nq!;EavBS zShIHJdk)10n!j>%-Aw+wTDO<2i9K~QbI_gF_agE_cn->aeYf57q{yeew{qs{K8h`K z$`jFCV9?TL@;P+T?J6;~@khVfq|Q~Tw#`|I&jcXdzmDbUy0S;^?tHsp?1}S%vm?W8 zH}jNhJRH<5kUcYu^TG9q0{vm9x66%)E^deqo$)gL?OfkPWu6L0>sQIQqsusIpIz8BlP^<)~A;E9X+mNJWGzF z>pn{tE*90dOsRX9*8Xz{2j8T2q57K%qH+Gs>rZbH$Q=3L?8@e*w6ht<8E>EIa}@C% zzd6dMZ`xE_Ip=$KN@Qf2?qrRZRRrunMbxn0sFuCEG<1B~Av;q#aw zyM9iWw()}$_qBQn@)SMgy+_hO_RmdO7$xIMZQ!1;{KpW*A*O^el#m@ z`!+dyug_K=o*Jk}3r$=0dHT#*jZ$fQo>`Xn*bDnT3C(ue`{n#i`#M`m-ENW2&%!+W zPq|8(actE}rgRfPQ;DwYHCMo_`OAXtjny<=z!*OSj_4Si8e@-4f z+*)b)8Jp&U6h1w{g;$?#*s3&ksLW+u^HML<+T0+izk7%&c zwHZ46ouS@owIvT-M%>wRqH=uGEXnDsgADq1l}?SG zcsM_ssoQ_vQKswO?VOP>)xovxb98L*HI0Z;Ug4N+{HukvcMRImaNuR;b-8V~+Skr~ z;`G|s*v#aK_0kX0?m{|+N2ZO^tL-!jUdH^6oq67wNY||ue%QB1K=`BT!Tc+Edv0D^ zq${wji!b=Z*|d^G@oUd`zMO31xITIGDuH*r=db?|J#O(VXc))k{K^2%ucr0ET+Hv> znfJ{}blvr5PVO3~F`>}Oxj0rne@LH(%%UkbMn*Y2&7PUBa{0t-ap!T@loyWP6*Inj znY4wAka+opHN!I29Q|hYOv_34Xe$+8oWGOly5pPOHO0H{8dW$|Ka>e_;J&b}Y|zMK zYbk;VN4axBm$LSdJatiAN9IcRT7bA}ihC{TTnB zo*uPn=az0AywiK!!TJ5V%*{uYu6srPZKYznR)}0}Nk*hY;f|vBPENJ{&uzJc6mR(L zdwRw==%hgL%{*Vr_}X>+S7$qK`Ee@8@N0H&;-OQWD^6;J_UkgweQI>wc^)cHKni8Ixyp)=QO2_?T6m)RFXG}8s|R9EWGWQsl!+k#mx=H#gE6Wx~O}_AAI)imTq$9-{G1jxt?FHYloV1PyLQP$7PQBC|*=+s4HkrzF(@6@4ISR!r310 zyc|>g4UbztXd1>Z;T9E@x}EAq{jLyC0%%U5>lO@I@$hBoWsRF1r`8mjmKT&AIb-Q6mk5cVY$zq&VD;Sjl zQXjfjq;5YDHI#mOt>ccPO++WCD(c0G2i0$ zIEPB6*4GVL_l2fA>p!Y+KI^Vm@e`W3{kxf?T$nnC?~%g15qy!oxdLMC)8^l7$u82< z?mo)xd#a@Vi(A{mmj^{%-kr!-G;BJ4AaJFkwW~Yx{>JoIi>@2a^_KUA+0P20Q~sxx zYkO8Kw@K|gCsULd`}Lt}zF*ttwSKR%&tClb>aKHjt(IlBAD`P*ONE*9CU7?&G}+T! zV?py*o37hEH~sslnDPFZgRhwE)3Mr>aNw}G;`UM@m!hpAqFHl>?7Hl#IXY3`;<~xB z4xUfEykq}PC4np<_lo-?#g(>?{f56IMc$Xprt3~>+V|m7Vac7rOT-P1RD5^mxUq57 zvWt^kzfUw$ozYfew>$iHxm{uV{oVQ=->#j%o*7hdvR!_{A)hm%Nnfna-^SlXBf4|w zxHUTjZ?_o{q45mg2f& zRowhn<4XoP)?D!2;#YIzBu!U`uDf2SYV09FTYdf4)m5{~p82;|9Uk*xW#R1t@Ahan zz11os=J?iyiIu;fHP-N%!mExOj{<*KW;U#<^sP${jJSKJlcuXn*X24h&D_z(A?$7X zRfU!b=iTz;z8qJ&5p!I8#E2A=P3I!(R^<=+ruZ#S>}*QwpknpKE+N^%f!-^RnP}b^ zs#)^XpQfuv*ENWpKY6c5*8V%vqn>ngxERPwE*&D46MyxL``XYGEiK30R@yBv7w%PsF?l0SAdbKhakGkv=5wphQ%Q+-_PJdZc|3e42ng9Gmj%wZajKevT`L}#?ef)Tuu_yDK%G5QW z>%M)vdxYeY;VkCC@o9Tokq zs>r8!^#$hrnCY)EUH3>^zUe{^Gta?Kgullv+&XOdmYxX#>LIDZS^Qz2hb<0&*brgr zRp33vMR2r{ROL3!Lk*1A^)bs&n|AK?a(-~mkLK@Ox~^VdPqadW;h4Q^Hn$vnKUKUo zcFQ1b=Sxi-pK~VpZnu$=D@nMpX-`VIas9g$M<#iloOR?v--Z0u=e43rE(J+^q|dW? zblsRo3(cEq#NFdR@0=XzyZ&LDi@}>_aowbq3EJ1f8qVg;iD~RnHPqj;#Yk0gSNN?r zTosAw>I$oekM|3`+8SKKPxIG=uIm)cb5(G(MmuNwA->|{ll3Nwor&$*SQq6W^{{dA zg856Qd~!NhJ6}4mP)hXB6D8gH#TC~wwj5A#7-AuoC_3>3eV&=pb(<6SSiT;v=5#r+ zNhhPAOLbrLs-#c`*cYJ#5SskA^#$L(r^U|C0Qhgk_B<64`$jb7r zSu=U2vith6|9>F@5j zr~c)#a;t`g&C_gV%`5fLdEO%V*uF9yzr!Z`nHgR8o1OdSd!KYfs`gjsDi|O0J^kI5 zQ$^=VNf1w*)Alc>ipN)+Q`F<*Rs3jp;Mhhzhii6%ukDm&)kYuM_i_Ati`}zny5@A< zStX5|bLxB-Zjroq@BR~EM^9a|FIBB>I=QnBjLmzVzJ;+%c*FG%ks66rTg4x>%(%h( z?Z%QNZ$bkCZZxhbJ?$$*)3u=Mx>zM`^^w?lc6+hF=F>Z04H;Q;v-DGGvC|o^>4%?9 zeRwx)_KS!d=glj`9B+Md9Q|dp?X#JVbOyd*i8Y`g*gZ>$+XELW&=;xv8sy( z`31(d_&dBLzE*VIV^1xeY-=oCdnT^1wu;eO$S3}^Ok$6?;;Ve?U3a-2oLVxxeA=w} zN|9s3N@c?OcFa?^8F4+nWBQA}Lp2_1xM^}E+u+GFJ zC-+nl=HEat_sIoxT|;5c*(KjLynP>(In?~PMS zv&ui1KPsh2hta^Nwfd?V^LdjQ2Yb5ihP*v?)-#`m3z?0W@F>?{wO8at^Ky|zHskq* zv~DVq-X(iy(WuO-cd~cI_Gu1J4Jx^6t<1Im?5hd&dv;H_e!(68mVwN(#dO`h+qGV% zmj$^WkG&};x>)Qu!+5NU(AikA;`Vim`tAjrtdvgLvuC!Ww4!{Fq+YelD94Scy;5tzEw1NBJWcf1Lc#^5>$R)5QH=p2=M&@kXu# z|F(qqOMY(`<+)Ux2YK%rId9(7Z<~)^FWs2Gv(&=dcZ9CNQ|*Gn_I&{+$GyBw-@5r* znSXyFXyr6?TE3ClO8aH?)7Kr244C=zVHr)=iSDm|bKeIJXWbPiH}Y4%op8rq;_&gN zBSyMot*1YKvfb;61$Xg?wzC1Z15fkFZhro;*YC!Bo@L{LHYQGPz(zr*SWTtWud;)%L}8bWF%-%*;bD_wVR?W^+kZ@!tAHa&+smG4TI;_(F&zS8gWZgkxs$>xP?Vz2Lzd>S>_OuJKC zaTHgFUdptx`;!&z?B*42Tx}~lpFgImG~D!amE7}Val2|?mgvgcf4R6=$FtybIelHY z({<~aeO@ul&Elv#0IkBrN>(sv1k?$QM4aI%7CCgiC*_bZ8mnvi{SSMrP z5^_H~Gv@Xqdkq_>p1p;1T@SkM&Ggxmq7IZP9>4X)AbI|Sj`9zt3p>ZWu2?PJ9oKky zc98h$>687WH#aW0F4(j0q3^DlnN9MYJ39x7rdKsQ3Oe9Ri?1hLw`mUFw)TB(+w7iM za|StC>XfTnDdg%Gs;^vl^L6t1#~PVCVsbawpRK!N$Hza~H|EiE?lf?Bo_EGo^k-kd(&c=+SeK)omMn3(zxkBdIKF3RnJ(&qZni_xhuAJx6 zsCE2B5<|IFZQ}#=yO!UJ`?Nfp-;Fsui20s?xlei%Q9!QomtvYlT{*R;XsW3e*m>t_0kg&)ITs_9g5X9$$FaeKl4NN9 z`p|Wgl($N$Ej=FbO~&t*{Ev{s+OsNUZ`?O%zch4z#zwoHMVDSWj~n`I{=OH3)2cbr z=T7-}d2jZ##iIvr2wCaSxp-|7P1l#M+c)8D>tof@LAvotMu+Ekx3B#ysa>UeZs5TJ#P}GiwYY|w9N2Iyx??r?Tp})o#i%Pr+&U> zQC)gq#~l6p$_giTp50V^Ju|}K*44{Xw2an0rs)RIbtON}Ih(ZUgsPgbyYr+^yy`BS zor8F8iBH#(`tEd4_NZ>T=$7p&-T?;_BGxmq>$ZqJe|cTuz!{5{S}%QW53j;5nlAaf zX_V)>``mFvKJSJnt9A7`E4f#{I?(g3aQot-=FK%xkP^NO>OU@ zRkwq_nU%R(+$?giYiq0%_B}z<4Wj#N-mpY-cikYZD2bC3?WIb67GxV$PF^T9bt$iO z(4rUh>jkS;UWyq!c+i+>dw0DSTI&@1Wrls8sNy1{haE?@t?h%*^y zp4D?cQeGW)uqfA6LpFTV!V4Qe)HD1injhNIAwA)<`{Js`!*cT)73MBT{xoxv@il($ ztN9v}s&(;iQpvs^Lf7S8$2H~Tnu6OyCwsf(j-Pa>)Iay^;FdCz&B? zD^AJuw|w3#)gU}b#lpIHxU%Yt#xaw>E^@i1!hG+^TyLRtU4;x@wG4*1mBk#-365!1 z{-yJ|`P3>bcqZRfP+jx0VKZO1PVlF>g26_;%56EcmZ6nS=)x0~LSaWyQln|qzB{M5Rh2Yl;N%f}8{vAl3*Q6J@ytborV~vlB&MxD&Uyo}$rs$7I#uWn~MMM_h&6l*G+n}pus>6!RV_9#k?m5JZWtG3TH(t>zH{`iG=f;`kRRX71jiu=> zqwA(89{sNAAG4va@LJ+k$7|-##&<@|-_~3Iqb$y8uIzlHho6pGm@ctBz5C7E4??px zsTJJNZM~qR^J$53IOo-_D*8D!ny#B#yFOv-IsG(Yol#Q3dh5&vZS{$=y%T9KVmsVp z^Dr@;$=)V=9$0KH>y@tRNh*1C$?Lwxtn{DKo197`kq@nDMso6+-Df zJP%(wh?+Va-Pe`1ir1L?-Yf$N*PhUaiVr^8Y>2b4R*FCQ^TNsPN(&g*Swf(E zhvJGUvNa1m3iIu~?#4*b@AL6=-P25NPI=1zVP>`d|5ZA#=V*Or!Y_41Ns>kwa(XuVNl0KJzbg6q6*tGY& z=HvQMMbk~7>s~u?f&0XVUCFopKdSCBDy!#f7%*`I3P^`^N;iTaA>9Jf-BQw_ba#s& z-67rG-K9u_bayvAKh}Tou6g$-KV54(_nb3(_L*}KvJ9u8yX?0)3LiO?ZO8OS+l)@} zrJr?d$ozf9dQf6L%>Di?ja9FnBacg>lri7XKrRyt?hSZO!5efpbg=tl+_q{wV|dj+ z5@+SLLScQ39`lxFxo?23+hdf6?fRyVaQPNb8sV1l{?k$B!u;vcwtU_7FVi1k>8xWA zAYUKQ<=hCDEJ=&WzJ8M(FU)58L-yq`+xZKWM0|ql;*-hwD>~R!PDFflAsd(z67uEm zMsUoy>-gEo=xqlrWG;LIXMpPqx?&P?{3(?s>1_h27h%&TBU7j_nm5be^vP3a4tbV*^-0QxrpNDF6Tl)KsmhU6|sH5@(bz;E<*A?LUf$m(X`rp8uRJA1^|1I)m-i_0>TZspEzXkPr%l2loG8Xt8zE$-*Y%a;NpL7<4Ccc0b`)^qrsl=7;f1v` zZ=l(2@2h6~T-b@r7YPB}0MPA7R<9g4?fw~zPA*0kbAl`upQ{Z=OUjQ$qCv%w8lNZA zAtUcwyu8dOMFj^>9J9mA{>jcPo@t9-jO{c0M5zei27>PCp-TS79PWG7vo#O(l8Cv< zBJv<&k)e6~u@@Y(GK6kkzS<Ky6nZnks*3)1 z2=Q@u$+!^a_0RlP=2r`-by?*$ErpS9`e*iW*j4~H1a$FU`KjZ}tB!76A@dp(>VE#Q z$bp?;AhzNlXSC7q`2nrA<##XKaqe{B%1%z~^#Cls)L+^tR!qCC+62OKJpCKM4F%l~ zZH6%2ho6~aNjY9jsfoXYWj>e8WK(2D4sJoZ>|Ni-jd$u&JD)-q&#- z#~%BC%>8Hy8uU^_EmB_8$G%mJMg!uYb%%V(wFm^W>G9oBcUMN&xe=-7eISx}X zL(U%F{K`faK252dM-3k%a28p7lL*iN-p${5g3O^(9LX2Fjc3>tlGwP&wfSD{n(-$3Y}{F;@4}78cyG6Uk5%bw>PPJ z8%uVZ(c0*k&JU?9Q{o?Q&B8r;)9@ZywZXb13Uo_KEv|m(dkVn>@CfVTeWtGCnhY>n zr&X;*5FK{>1fc(+&Nxh+yp3QKS6D)Kxbyb~=QO z!d!X&Mh*EZDN-js?y$!xQ~qi-R_zWk~krK zS;eDTNB}{`o}Jr~-N9%JOA5X`~=;DikLyhOJS|#%K`bnEL2SMxKnbX z`)ni{%GLU_yc*gDp-QR5)Tx1jy>6GGGpD%pMQ4@0$#kQ-Mf9Om*9+i&C=PU+LtW+h zl+I1xPkA!^r)KUyG<=^?8Qu zCasES^-U8FFb?sc%WWupyj80*E_6XWu`8A4=@6SyzI*x4NA3k{eI1*iH?6O=L*O3= zt3AILQ7h+r8oon2uLTs_65j=&oZ4 z%{>ErA1)ni_zLX32gfV3UhW36wW4Qv<+1+qpa#$x z=!a>AEjvA)EHWV9B+zx({rdM{U8YZ%ef>V37+!a2rZ`DR{>R|sOD)+VyHa9_ru`QN ze~`Y;j^QDCoOmewLB>!qOgsBaAJ&=f4*wbKKO}=LORs>~x`;4W_{SCDBQE3uQyXz@ zK~dCs$YVa!B#|Wd;(Q0n@v%;juZX4l&FAsY?sB)VQR;PCIN$-291-li>3g7t2)QPxP;{-fw#`+^^LAjZ@E zDv#KVF|>5t92kdG(53o3WKzV`#2p%BOBFYtJ(ATB2d$ZL4^QAjX=CiiG4>sqJ50s- z&y^2%>=IIc6RH99s?NO%QJ8`V|+_}$vY1%6p2e}ZF#F}jg=+<%ke zS1IJn^0orF56A#r$%-VXnOD0XCqjd|j34+I*Cp9J*a(mahLdTEq}VX%i^~=^-vny% zcvO0z2X8~eW^YK~2<)epNQ&c?#yRa}0QqKu?z=;*kTzUoGhSZh(Ip#pWfBw1>sV^H zX$H7VnGiapr0bBrUjeO!8ygX)2fOo_Bz1q7+(M!Dam`fVlaWj?!2Mem=x&9`9~i`R zniG6Q2VWTWDInuZ4Z<*-+oeiMT*6ua-kAyTsZl30S$qIA*DRKZtGO6=Pf zvjfD#@jUQ6_%G0H5r^fkQqNMtW30axDUZxWos9Q;zfpjrfeTOjIJds@Ia;hxSF(9@ z!0ctAQ=(#lLU(@OT)fx*ggD(a5yR95kZ&I7LKbQe;u2Xp_~Zu-i%gt-<9zgPgm^jF z#uQX7L-FO3r+Zjs?L_JqC}A;ORK9EAWIIk++kDY)f3?huzZvBW_LcKNH{JI%y8nl7 zJ(|+3BJB%dj$1M!9aU!}7(?16=?!KawcP-20VRdu?offRgs4*ga z?`nHmErEOsK-XZj*4JoOvknS*#h!ohokWt*e|7nPjYSq^`FpPWpjU!!$=x&`jG;xx z=Qn@luJ&3)L_S#fAz?|D1pY1K^#sSE5OgvAl%*eJcah(#9oUA%2YyUY7{Y5*tGb!1 z+CjRF6OSQ6B>v|6z+QfLgHd!n+phXdDs?pr5P72=7ia@uYIckG(8SbG6 zUfhYs8h?N3BZr|FBd1>{JdOfQpWeu6i3%*cfT)(!DxaB(iIU#FSc+p@5Q=GYn09Ys zUKH5>Ee751nuPhzTwHW6$5akqB_OnF4Uc_Uiysl;jQR`RBkw1P)!&xUhpY7SYQ!w) zi0N^gOkmwr-=mhRNPTvffM?wS#0k;%%&E@0=V|c;?E;JE{ z2fv%Oyb4K2_+S(yEm0W_Z)7|GyGQU6TV;Xdb1_}XIQxxN@f#Kd_ZVIrXYZx9octa=y?+$xSiMP#lhQ;(y=N``@40 z1t)kHEIMS;m{JB@1n~b&J4!|5X(Kx;#IhD`TT-)h(-P zUl=S3j6)^p7OOL~^bf!MbBTqx=wcY_V&%4)EiGJPl?ib}QrU=yH=o_|z^P`1m6@Xg}y6O3Iep=tjT$Jkf z?t(C>`o!u|>aIxF*cxy@bTS(mwoWQtvXCAs!fNE~o$K^K$urQ8_@-P=jKSu-y$Qg@1~svN7&63bo#=Lb?h z8VuiTAso&NVZ^TUp)kS+u&_t9X@R*T-%-3 zk#nmI*$yh*!W;4}LD6xNS9ciq{Qefd3$5@*c(T~h`_{c^=kZN`{IXcaUoi4;Bnznr z@~sD5-q#c>F+{h@3Do^Ki1<9HdDZ_tQhLnE4t||Yb`y`wYMOBO(@5lU#-eEvqh>_k zotQlCn{`segoa;g{b~WdDd0AM?!WQh(f1-X0^1{MZ1m*3*wRr|g@axE1KskxWl~42-BFk>NSN|3>;K*t`QP={2)aqT6Mn!8inMjx-!^n4B<`k8wg`Y4xsER0Mb2!V!BJUe{`Pod32WkEy z?R?BiMw~c#J>5gRtb&GzP{>Efnr{S*Lo?_W_|X<8oo+(ls9|CAcZo$EOaC>5wY;Xa zwAEF8lVMGwx>`9xijw)bsp@=8WmEv=weiC-lazykj>Z4|6s6q|;I@D+G(E-5tO!aw zIZm@ivHAMDoNozJt0Fy?Ta8lp8lKU${!A{{0v;YH1f3gpuk>S2+mfc7%v;9eW3=1Y zRT_TQ0&Xkl>T^%m)HG^NH9UCXp*fvd#AWbdzhUt7bZ<~xt8E{fme(akdWnZ#>DGI3 z&qEeu&_iiJEUPi5CxHAb$EwAnz( z#QW1r9h+%e#~ORbOucWLL3hf65f3=OM@erCU7-#hdZaIjGl6{DLARJB60VCwq6-$4 z%tcp*waOZ;uPj}jh*$(Vy&+rLL%{2_-n9?*)&;*wV)}k-H9+PN1y1LTj=*2PgObQT zeH?H*KsWnPDgaBXUM3(pwyaNrS|sKV+4mK>-62#-RHqL`S(2_vc*t_PdjI05&x|%n zD3gC&36GSfR9j!Eyc~+AGb;z&PS7n?IrXTostJyu=;M&)=`e%d+Nx#V<*7nL{W&YR zTia__~#dV z-Jly()lb9Ozk>oBn(^Ve@9| z-u3QY=Y;y_s@_1r9itjdBr<6_b%U`+424Hx&wQx;iZ9a}GK5iuxFL3{UKZncG{Efx zT{z;2CYD&j!-6?95siLU>GXa~jqfQfoxL3NneexN-{eVNB_rT41VN`<jchv&f!A?A=;|2$bgiu*@;+bgSWvoQ^IeW0ahcXV4Ego`BqkX{bCGd= zhF`IJB(7bBW{aivo#u&hk7vwjWJB)W>Yw3wq7D)GGq+x46rAE$IK`>#=|lVpslEf{Y< z{n5YgH}2Y~{Q8{=aECybXmhFW-u5t+<~2QHg3cFb+G5oT+{kNM(~qk9k-leEa!r|e z*k?(>Ovs0oL=k&$jMDpPij%@;;n5#W7)@yeOq;XyD*9EYn?32;Y1*K{>K zQ1@Dwt<+cTP?f(;rRi%f`B$yiHFIUX2{rErH-^sK{bLq`+&5o0`mg`)GzeDB`q@?( zIx4NuvwCtOd=9vypbOW7@b`@*(4vc3)u+2<tS|7}ct4%4iz>Ce=)a_ar8VQgz)19beb z)q$Yx{gHi_AuzrZpsUP>N0E;w`gi#_EV$Dl%rdyOan;)ERT!*Wc}TuEF!3lb|bjgjKy*iao}NjR12*T4AuDt8bx@ z_abDb%XgQh{b*r6w;dYh%=Xv(2tG={Jz4J?FU-@?+0hdwWId#^2~B(;-zm^NH2LG= zB-5!s!^$DU^W_jbzENdsT1_KINg|ok=??`pln>S$2)EJ&9t&xq1aKm3via*7 zi$N5hxxVHFR7+;t*-%Bb?V2lf8_#_T1@fH%-KLrMrZQ|6Uo_gyD(>!%lJ!QyXpz)O zFFFcWU+a-_A;aKVMC*T>&LVIa^D&aqZDMS3MTJe8hp);S^UB#V&@Ce5qXLreet4==W69wp;XT3aiS35E`Y9hACf4i&Opk$ z0gKVc%$2zNrYe&FOfK8W;_SnZ19(OP6w2C7C%6t)XG(FL*|040WA7<5uLIDnCOcHe z`ZwI8PG>0I-C?nhK{f#LT>;%Axxp^U8pY)DI9tmCnd9A z%>w6LMZ0W9OdXU|a$=JFKc*S?7S=gatA4&j8K(Q8V2SVoa92TB@iRA5SE5N(TkSWJ zFSJp|`pbWktsPt-KQbnAewFty81_k(un{5s_LY1);v-`armbxd-B%Ty0N?3Fh$B1; zzMr)Qx^zDTM4{eMAU%Y$ylt4kR&H3nO88Rx$@=$!%WI1^to7mjnGZNuiLb1Yhz;te zxwT0ABWFF*DF%lpeicE~XfA<#*FpD-KfGX0BuSbvx8v(%=o;6T^MXv|OFHjl@B7nX z`71vQ!x%Mlb~NEf4KbAk@=L?X)qSJS9?1|knf-Yy=6}2bxEr8rH4lRoYe*4*gFH3c z*rji>+6 za5q60{jY#2a`sF&WC}KIni~?xYtD_-{oYR!>u&?cUhw#*{F&M?u_yu3>7iNDDNH+` zx;&fI<30g$<83bKnY6%Rz}*5}jIux$s?@2u-zR7At|_eK-KI&5?j$@|35T1hbTPo)1KsXc#*49Y7Q2Jg7oJcdIC_ie zN?*M%WZpFPk+|DN*V>Ar`Q3`WZRs|ipFM}25SeiZk&3)X`d4dC-I$h&oC)^j_CeP& zkTz#P3jX|RwuNGWd=Ef(Q6ixVc4>5FoGgSm^y@49x~ zP5)iG)RXGHOi&CzURK?)vpd%Olke-`%)s;-talDU7fZQ(Q->3^?<*VPW6-%6$@j+2 zyw0?szfwOH`?$w=#HjZQIqCLp`1+bivQQEIU%DW8eu{Zlg|x`PATQb&o@d5cgPp5_pU@qS9my| zr`o<~_MGy%bg|g{wl|m~7v8Qio7@v$S+oXlPe9l7-uezJGSw}E#ns}t_dFjZ>aVv= zJ3*U(ku^je=V$n1jC(V;%{%@%etT`|ZbAw8vd#2?$^Zl#98{#Qkg4Y=~|iD@k!(K-^R{RG=`4Cyn$VJ z%`j(6OD`z_@;w9H;Ka-;9*#k8SbgcwTuUuxlI6*Aw$gV#AulOltG8uxT#`w(=UqJc z&;t_YsXau$%3`t^sLD-2%#yBBF6U@J0`58Jeu90G)u4H7WE!9C__zwERJEHP+Nm;* zJ6{r^KzBD_cQQos(xomhbswTl4hyBbtf>KoO)^x_GAXTZGxU4rbh&mO!z zi0r*BZU<7tx|0mklWbdNrH`j~7wwF$6Yd=t_}QJJE7Vdwjx|DK$xM`!v8_jLR7o&n za2l@#!F|9b=w_&9e^5oNiu94;=~eeuvKh3Xzkl1I2l1o}ahnnlvu2utRraUB*Dd4y z=Fdc~{9^r(D@X<YF>LoG)k(dQ7kXvV8?x#Q^1c&m@zEmLfB@u#)OsNse9dC@Iv2 zY5BI`DC2i_(+i^N&+?PS-HX*cfO`wN45yFt1@uD<(A}3Y^$CgMxjnPuIz&|e#_o#^ zZKXwJnGNcuN8=@y;cZkUR~3m?T~<Z^R`}>DCjqtZ#L5e%6Hs?!Z{AXAXo@-lsd3(13+a@622hcTW&v$hUWGKZmU}99`;-qH$XGwTb?81VIxBe|) zO@QdF?dZ7)s(^+~Rp|Uaa(r>ft$cGPA8qCdT`j*Kb`{t+dIa6wAGe|WahqiH6GMbP zXRMYLEc=r0y!PrH0xeBKI-6H^0%|2ctgPI*xzv(Zy%l?y)~iTa3Zo(`D1z#cnBfKc zp8q{i|9=5lmCy8$c<|JBrviAme5){k$Ox};Yf z5P7+!&f7~lQ^P+SE5WPuXouN?&kLbJ_oQS31NNn+k6U%`#0O^5@o_C-cx`KFkpkRS z^#mFUuFXe>9#kaRm!YZzXzzFiRh5#Q9)bWu@2sUp&wvch_6gDw%gm@<44#qKmQO569ns#vCcA_$h-}VELk^J%{N~RYtI+k z=&U)V#57c2ng?+=zx7bo?yvD4Gh?f8_~D zo0>;QUo{!5$PuZ+LA8eP9nWx&4cjBEh~eTp%`4t|j{1M-a*+nc;b{-^91yK$xHqmo zjOhouUtZ_OVo9ugEwl0rm4_NWOzg=IO`&~-u86Hy?qS>X2El?CRns6@Gde_Y181`3 z!}3VR&7c$Dz69N<;txfWHIXg2b&gu;RJIQCGPoNB565@&Z`!z=QjzupLPn@?`}(!{ zb)fHj=ZhI&3FI1)HAq)bS_s*dcszdqE+Xh+5JKgyZLr|Q)hT91VaY9Ni4~}=v5jIg3So3Qd^NE?=ruH86p-1nkjN8bo#%ZuGL5P-4op~jpEUUnrpGEtjTHdsu7z; z?{1_i02di_H+hz|LqBogS*6RZ!lc5hbfwfQvvU|^b0>BnW5-v?&IKozwU5<6x3l|h zVz88da#tgU(#Ut4ObWU>#-3810Nhug%dQy})$dje(^|=L#xQMJh=Ix!pNntJz(t64 zpsHWMBs4 zlcNgy4z9AK*w@OGbn}^N7Ax)Lq<5r-_GMUli}#7Tl07d`54;J@>x>B=1G(9tX1^au-kmUG1Wstc}vd(+v*wvf( zAJBfLz2gV+#QdF-|&_=(m|=b*VEyl zY=$}#E}s zZNfnfpV1=2IY(VJ&S6TSghD5H&&^__W{1+ywOSR?d+*k!on*yDxRBf-ky9;~u)ikO zosRsd0=U?qYxzdM?|bOD46=&v-yt}GlyVwPy6-&_hr6Llap8>;`J+X`mW6qe?NSsa zzU(vd9>S_AiA*m%%20FiGuM^%SONE`C;l7|mk^IO7Ut|wrGa5M4Z%LzrRM$`dKu%t ztIFK;tw}YL>MlXnDG@{Glg?2@)vqTqvH1%A?x4zE&-2n?a4Xh>>l-fU&cTIR7*C^6 z7UcQl@pBf=cP=6PgOsuq7yahIo(-tas>)>y#^?4s&S{e2v>BE?Y{Z2Z{qwj2JJyb} zj2eXu-hW?%u0kyogrv?=svC-s;OAN&L~5$zVo&kh^&c?Z&-mFql+U|;U3xB46qBKZBej*=KA0czG3+a$va=>dd=4lHWv zmLLu_g~h)g%Hsz|@#QUQq!iKP1~!*oUEua-40&Tw7!*?09XIHK{gS7i_;Wx45+A5# z1*etOKt51x?MK ze~h#|l1Bp1_Yr_@dQK`YgL%$B|Cq)eRb{1d;<>2n+!wQNdbx%?eYHlsHU&Fyil9Ag zZq?J`8`9QvQBB-KrR}rxd$xl)c87w%dj07P>~lae7jRM>nmrJVyaI{&4!#r4aHyg3 zC$7$JcV#&fO&k?B7LEx{R&^~9neDlrjjGr|k1}j)9v-o=sXsLRZDSn&&w4&TNd&qK zZ1#MgAZTYEgOTi)HgC}v*tA<|p$G#sBG=Xfhzt)o#`k|DrJLTvk@;A^tZPLe#iXlh9fgWOnk^t ztio;K3YI`WHS1?Ru8{!pB?Da^1nWCZS913Bq^qi)Q(+T@T@lz%?t5I;=3j8_f3m_H zGv3x(GQ+8$6%~_)(FcFp%;oDZ^^(QM%x3w~MVl`Ixa6Q)Kg|FgnI`Lccp$`MR-{=7 z7j7+p5JW@=IppJuj*Rx(c)dkrRo+SSp$g&iRsFmEJEe1Rxi1%xy>N+Ps!*#;zw*e&9oV{0zN1Vn=u-}UCRF_WWym6w^}jETgfX5P$$wL-{)GK+8uM2o#qB^6MlSMZ zRjB*O6)n}#;{%3MLgI9lGFV4ZgRa0@smqncPnsn|i0wAP?a(h7+7GG_|I4KD z)R4X5<4WGvB(l5CB`47jQCe6GP5*sC-tid_1kwri z&z{aiKL?~?BBJ&B?T`Hf1!v;BnNm;p^5^lT1KoY4^M&iI%s=_~bV8bcLSJ81 z{K@5J6!pcjx9Bu`h5Q96xFjB(Sc{R)IBN^}v@QE}l5>BoNq3=<1*y$Fg!vCG7vA$J z-1xu-ez91x>+bp74;*}N$O%b8z$8{fAdS6A?;tHxl2Es0<86fdwU(8hCW&WOkj zO!wi*a#S2zNw{xIJF7z2|7|4x71IUAff00HZh0JpIp-e?Qmyo6gp;@sZ4Zi5&IUq-36Dah}L5rK{46M!!!nFHD4Xzr04ReS$HzeO2v+z~U-O3n8 z4dtGX;rH^Jv*w*Lmgq}nc4vS8G&;ub_x7n~c%Ba|plf(h*j)cm(sW5lo^!@TsWdh2 zPFwS!PrIg6xh9P#0V~EwD_;^Lu{MHAqnk@*%RS2;aVfmXNBvHrdF~_fTQ9(Uy2n2U zq&#zvq&ijKcLmi-8fE3TXynRm#w=gR4S`}z%)))<{F)@MRO-g>bF5=&&w(E)43n>d zWua}nRq zrp5%Td@{=l7P`e7?L`L}uQr!QZOm6TU}B#ZNuO>5;sW8;B*--52F ziUOIA1c5ffk8i&+XO~;~FweIe?8(}h1RwR_t>}Ka`Qst_Q+K=$M4irgJtlmdGT-(V zFZ`$0pC5#hBNPp!+H=?5bCklddpvJi z^wFJsP^XjJ4vuo=$X9wx>C?N@nDzI>2-rRMo@%FOmm74oOI~&AbW4xX3MjZY7_7Wu zqA4=n*iSxEXu?lukE(O1M5Wh1Z$Nxil&n8CZ^Toe2bt>h?$&`XP=Cj$d3*j;Lq5At zy|m|mP>!*G?%qZG$Ejp+V93YrhTQ3f)UR&k9Xd~63UvncXR7|EX^qA z16)MjNMF@2^)BtsJy=T`n{yFZJ4d&F;dP#mcUL9kq$LS1S`2BO?4W?#jHn@+lODHyxAkoVVxw> z-3v!LL6agMD1QHa+5AGV8^iD0L>9M|^N z5ltnD_}yd`^*GhM!Qa!K7e8>Fe1B0$dva2SLEz^CxPqYT99$)+XQ@!8@>##?o9BBj zJ(j6l_sbtE+!~w+HLL1Wz0SXL*7xz$3mP_r1H47TUD{uu2)L6`jr*QRolgrH0q#@J z>p36?JH;Q3=->MM+=XAl6^IJr$vary5?yqO(UU6wt8w#TZ?2Rw?*JKo$S%2>);GiR z##FV6OO$F|sfkZ=ysdGS?#57iTGO7#_o;S&4v2ZaHXYo(Sz>er7=+88UayQA#<=LQG1HNS>+BB)jETunM*6 z>+c8Lr*}u512Wml(;Ihs*1b~+#fgrwH6}I!EqjF$jm0D9;1y7$|2{{>M~AiFmsI%LLqbG3NJOjy29ssGL@c zNapgE=sv)G+H*YzL}F2EMMl*)xZA(_$}e$d(Bq_Ysu3+rE8C`A=t1%mqgxv*cjh%3 zokkRfbecny59@8v8Q!XV(z5=FdvA=!0pLE}+nxiWjis|?X7w#(;r@G+#~a6z^*`>7 zi*GhRt4_Wj+LpUDs9HHv3;NFJTFB_84)fvTEZbM^n!bGVFS!bA=gT)F4S*{Jy4YMk z+4GhiRO*CcnzmJaw((t}3NUH&1rJf(-?`m4k64HJOiXbZ-_@Y(4y>?WAxUuZl+O-X zGm~W;!5ZuqJgq&?zuVK={2UO+p#ndislQC`W4~&tr03HwTe4zdJNUlZJzCu0;T#E# zsmS>6Z7{eVdI_Y10lng8+KCZ{Z&sIVS7qv3$}e}o{l(KB{5c>{1sVpQHc$RxC|3p| zF(+-Vg!r5}wKT$>TpSkHMNuX3xTTLrbHkQ0Wra%prDCc2!8z=7ax{wH6iR2hs*wub zf1jQuKL=!mP~d8w#-HXz!rwnJ=UsX43vi@A`WQ_K%j$Y+{xrAbuKHb=PC>h5U8k+? zl5bZ1t32v)7Isw~%Al*LOeYN7x5$ESJlb^JkVh89)V;jsylm~!0`wtzi^TN@G+08V z%haC2qQ{>GQlZ!fx-@z5wwy*y^nrF4uPjV8>kdgq_6;kTn|9}caj&!a{v zk8V@`8l@o(?t;*GK_yS?Qx<76Sg(HqUB}>MVj^lPUy@WYi!HNUKXqy-qc6E-0hs^;&a8H}ah z-Z-TGvk3?aMW1iK=pQHEP@kOdP(WVuj_SHlzz!@Bq08ag3`zfq`~z^6K{u9Inb-_9 z@ST3qFyE{KXEIa~!vR`-xx*tJN+8Fr{oae5N=JOw;UQ|iiI-+wuUqWg+?o|U6k1A| z;~*KZ-8q2!)MI`QNUZJ8o)`TeW>{93a02%!f1}>o;{Ms82*V7frX%pA3ma|xos5P0 zF?se=^Oi(FHGW5_;O`ilTPboZCv=_zoDjf$IxF=Ykn@z6HeKD_%ly_BjtnsiDcN_$ zAMi0!hg9)ib%Z5z8mP2g+Gn^81qv9xq49(gl)K8B{w!&5szY{Mp^g>sH4Jc{uIcB1 zOyP*9C-#il>LQ*!hEh2F<>`BHu!|GogltG*2wohexF(!XY<7cjtycY- zb^CDH^}t8rh{2fX;7UaEs&*9%30Y=FOc%*yz8@)ifU5zzB86lE;hz@#_|qm|jvAp& zMU3udAmtQ`3P^B{ar0(aTTbU8Sw#&prD@=$o*e7{sX$vxwj_vl3Fu7Q@1y6g1zb(g z)xM`zKlon0w}Lg;0+Xg0@`fNW!F-$9^Vh-AzW?Z5lz2cj>?;YIFS~8;=#v_L&8YMI zQ+({y|5Su*^_!;k5EF2o)fOdbZFstpA}n(>MiM zTkmA$tZgu`dwgj<7jU0?C(i*%%JHFF{8z*=-+6FG8oNnQ`R)rc8ZQ!F)AzVdP9Do8 z^K7A`ZM2^6{z|{C-a%>ExrPXv#Mdx3CEtyU6~6fUbnQORv!}W79FXAk6$4WYQAb#( z?R`uI>K=}YCh;62!<+fhWc;0ydW-|o%pa4X)Zd+sT^HFc(n!)dRVKRn zh0Xx?>CE|aK%m`gBGO(TBICnDk#}d8Mtj$>KSstNP%R*Faa*&=jSa10)2jXQ_iId* zK~BK+G;1LxvU#UNm)^C_nGsg3~G5On?iRG!3J>s5By z;t>;Q?BRcQM#Q9`VZl*s9ifa9#;9z6OCzs~mbYMRRb+0WK9X*X#*TKZ@l7Sxm%{6< zy9GPoKGp8e0lD<9Pf1#+ssreOdG0Ic1mu=a(s4})VN~-%lwh{ zJUh0K;c0Duo@XYYn`5sF#Wz5>Y2f)AO*>87sg#pQQA6uNomA)32P62cH8_s{{sNj0 zarI5t#lNp7$MjA{%xGuAuSTir3tl@FV}R@CQ?2$K5M%ro=`G_NIt**XEv3Z9NRNx1 zqoZ6F;oZ!gCZxeGRE{&$NbXwbn8#_Agygcqul4waH zTCGfk@k;WQ5^Uum&0$|o#1C3uF$_GBXdIM_Ol*;>3vIUUhxVt7mmT0DMxRLb3uMtC zLzK@cSb*r*gY(QBbSKwS#>WO!&e=5Fw+A`i0~3G=W-N+OugmN_g<_c zeZ1J0C64pCaY7o&qb_l1n@|*1^qY*mZWZCd}a_~z#49RyRvB#$0 zDlY7U7g~9p{%P=EIZRZ@N0LRP&K{Uq@reVu>bNET7Lp@2V4fn$~H(Pq?@N;G4&=DYg2@O^2Tjn+7j@6+6P z4hXF(mh=UCc{DUBROL=edG3-K3}^i63qOY7;Js0L>*?yP-|s!@Cvx6+%Htc+r%y-v zr_BG+!3-t!@2SXL<$e0Cp2y+o9{(H=CIMAC4(`&qHqG+nMu+Rh1FdHI<#mhyK8|>X zbZGdCLvU44+X>=7ZW-A{9P(=c9D?=62Zf&*T)AU|+)lbZ?IbzGaZwLIvX! zMM`m6DbUNqA^)Nax#}p_6hncndVw*K6LAB_J%=y8H>zM`iYpoHrOd2Jng$u!2Rbc_PztYiDUU+ zHoe;P4yKqceznpy0-ObJH?CkFBY`MGO;MCzQrX)UTc>LjaB@#}SnZI)3 z(#~UN2dHyzTrHDJx{H6Awd&!A7jG>3#kP^(j~lt}*~0vPC%p5EE`Ooh)kPJzuC8;f zrMAn%(pifv(4QNP~?6q&-ZT5B8*M1diG`T60OJf-EFLSTmdB)cp*1PV< zw&qWU8hg)AnX>m~c(*$@I_?@$eM`YVkIY|vZI)lfMu*GBtjqJqlb{Ykf4#WbtM5tG z=0D;(|6L<+woGn{TyDqe5mALZR-RVm@^53!tNv6M{_Ax0nL|5&*U>g&(!JJ4ALSY~ zx8|wqKU-s_HT~@FvG@w-Mug|iw&=pFk-?QN^x60~DucZ~P)sHMW&Zs5-3rBbt_&!; zxc1@2)BWnNJ7(%~mGND?CN*^V&zK@S0)Bk zc-AMUrO8_PdN<9{iGP{v=WE<=>EnWJ$3Fh^Xi)R`;2N5nzn{$d=_gGJwrkwzR`WWS z=XTCBF)m;7{bC&_kDZ@6JX4`5<7c0{ylU<14I9;Kf0WPD(q0JhFLV97+d|uyEsG8^ zG1(B6b?DfZ<#T6Rn|rxm=j4~8C*H5{%Y>1M*G_I49D3u^i0ZqW<$2?Os#NjoSMR@> zaijOW#it+3>@Z9&cgMKR?s%-RRxR0!q|vW7vIkU-u&4wy?(j zT=(iAV`#}`f1W-*yyl=RG0mEMeeJrxX<&&9K8xh@XT#-kFD0rbCWdBzxq5wtJT;TI z^l3WoXpsw#C)R27Q~f22FU>g=9Q&?%$cwq>rwti8KXpdI?2j(4uATDtf>q0ZJU66J z;W{){5!>+yx!hYrecKtc#7*n%``vx>t(`5-^vu2U=T!k+Uj*&D{^g%N<9hw^;~GQA zp5A9Gm!8^vY|hDv*1bcEv|dpy->oA*J+s9`%H)oe%Qam2VMxA8-zGoq5z}dV`>8{I z`C;Mss+k)Geg5r{^4&kJzq#7OrvWc3becY5#HqKY_?&-Tn{{vYhWp1pnv-|Rn9Y^u zRFcU}lgsVAd~&5)pSS27G&MMA&y3sCr?kCsD^KH3+Ke#FefHC%+)4i|oBeH-)jd8L z-`Kn@Jl`izUYU+&`trNxkL7avS;lUvI(qVnolOf3(3Tkcz^~Qp zCnb98mo&*UdEnx4kJ`2B*n834BDIfK*i`DP%s#cNpV>O#c<~K44$PYH>D4KLCyUAC zj*`oL)AiLqE827_a$?GtE0POdi+OU|XW32Nj=Y)j^?7W&KOx7AD>L$p+EHihFP|)G zTl3<$^`|>6i=H=R%Bme5Z!Q_P&|ltfj+V=9vEat+oh?@{O5T+;z2NdepI<6AyVKWw zW1|dz8+#4CQ`|gr!9QhIe0OX6Up*uKm^boHpTMX&Ig%T17;~WgiGuAkU!9ccJ4P;d zLKe#p_Z#SX-23cqy9rZAFKKkJML_I^i=`?}S~=5}qj2$SZ4Zvmb+&_U%fez64DVX@ z34d0hNA(AT_m7^ix6!48+7~jpW94#7E-AZa>)AeQM+WD-U1$9ge7*2M@70}#*i@%7 zZF@d==DGaiwqEYD+21gCW9wsw2L1l(<1Wp1RmuNq?||`B``4Glaw=5Y7oWwTZvz3s)5ya&1! zX*M}HVBgCV<|l)U0WTX?o>gz(!K-Jl{8`Re?)wdMcU~{5qdrY+Z{y{1OVr+ZeZuel z)0%gFsI4{ZL4yCD+;7MHenL0qe3x>~c7IZSz>5XNn)ED^HLrEWhAXWHpQxYo&EM^M z?#~|e%@RY?zY5YEpD1^NT<*PG4IlkwKA)rioP`~3+^W9$$>KTp^WY7X(+k=bt{C(6 z$$`CA{#|g@v`vPA`x~6>kh|~T17(+$>S(XmNIOkI%-{I6fiUql=p=T&x&TLEEgyoW*&6-ST(tk2HsUw!G7Ix)wh!cai$* zVryP6f3D%umIGySC&}gZOZaE|pz(c^emdW-q-CH_>zBTt-HPd7v{S>*^M>#3VGQ&y zKcnQ712v!J8>Q9b~TW)ylg6g)Ww`6js$mPbq-1=mB#K2y+`t95HC~uCr^#yS0?vUx!llmN4m|K@tszCRIM8H zTb>4W9=5MsH`kN4Ir`rm)cnU+*9$#7{M(~@)4xf37va}-e?33LrZrh@A7|Mx4pZfFbF3;b;;+!xZ!Q&Xac)Doq?m`TOV1qEe$?6-zAbuf{yipN)Q-Xn`uun# zb>7g(CO>!EIH&vLcHe(>-SmBhQL*xPR-rZQv|7{_-uiN+x%v zTyB=OAODp3TK<3{;|8AH`rEm+jlTG8$*STj1B>@wx#zQPXB%%__M+wa!=q;%H8fiv ztF@NQ612V3ye--9`&vvgY)dA7Iv*dDXue>y^0?Vkt#(iE}J^C^Omamis1|LWtPdMm{t7C+#@C5 zu|n;;_UhO6vumnnx99aZR_@c1=FQhD<{0y8UBtNOUlg8xbAMBR-&yafOux1N=XoU- z)!6Vd>{@(gbNNc&bbDD!CU=fp?urJ%<-bYIx+Qzhy3g~DZ&dVY(a9?w9i9`o^Zto0{xeiYa((Ac2l;WqPjj{H9Q(T14lUSEFQ@pJz%Q)h2_+hNxCGP&e4#lOt;Cui%| z;izuMqjn_=jtrhLd1{>ve}~)-&pYp@>dm&cuRbzo>0Q0@Kk_#eEOmTsor#U|*R1xo zXKbeiabJfm)`yRqB99?Ong8mqF9g)bKe<(^G_64&6mR+0B$B)&y;Vn2KF*|4<$_!~ z{?I>?XEqrOwnUX`U1pWa?_ZSnp?Y}v+*^Rk$fz-z^wBESkvu9@UX&4C(^;ZydPB4- zFE0G6^}v1VUdn&N0%(ftPyD45)>iciW=)Jrb+)idAiR77#5!^(xVlNLnvl#S7t4funoJs{3m?p~b z{(hJR$fjoQOQQ6~e>pDsFfF`Xq6Mft;w|b_O@cvnSS|GNBJKbBFXc_6HJOe0T^g)X zIpJ$hTtc^8b{N{r|0uy!rj_TY%;?ynkK`crDrEB=+ovItZ zM&HY&Yxu^Mss+y*ee0I4b$=o^XjN8dT6L%eHVwV5v9PxwBiN>v2M8i4Xc-xsC(@EI;u6hMFU zZBV*a44`kBlTP$qPr6ndpzo>DHToteT`K|9pacBT_cZCSB(N2r^yyoebgdMS2+$u@ zO0rpLAQ;CagDNQHw+w*KF|fb+xQ72#0RVmKkYs#`3uMZ&06yWwt}Vnh{I4npBmwld zh~HNp$H@Tke$B5{z;QT^DgAHoi~m)DKuvya3BOhm*Tw>*(^7t|5{^d$l-4qStul^N z0ZNPNCjM7d0czub(xSRa*AjUvEK17ZFK2yQSZG5uHuuer@lk%sHe@rZFVrrmj!?a) zdQOd$>IcQ3-oR3mq1zQPG!3opz@^hqw=Eiq4FU6lP{oezpe(p z1=axH0rdUPwZJ-HJ@5mt0U$rI384Bm51_h8?U~vywO4AN69D?QGPO%;ht%!{00RN$ zQ}F8p_yU;#`ZnrY==u(r089iX0aJjfz%*bwFawwcdHu|tdO&@k0niX=1VjRjfhItVFY*So0onrXfTln*AOzSC zTSfwnfhNEe;2J>v@)_VDFc`1`NdWa7^eycUKu4ex&>3hBv;bNHxq-aEb)-KM_zQRr zYydU_gMfJ89Ple}7&r)Q0e%D$fx$ow5CIP`nceyarEcoKxJ;6`)w5J3z5O zc7Xc-V?Zjf70?6a0S$NtfZi8q1=Is>;QCGA7LW*Z0jdI9ajy|D0CfE>5DaX?xdpHS zHXs=Y$Mu>(1TYro!+_zy7~o@IG>{4m0czu(S^&`qbYC5uw_1dM@b~vh;n!2YHV3y& z1jYhm0MeW43e}lRkb|tTI+PFR{s5JIE`Zu;HsCSnlt(IG4M1&aAV6)2>Mzyf>_9dE zx7%fA#c^hSPQO|Bc{%)2ndAm?0XYC3?z;TR33@4hZ%O=?0Ez>}fTBPVpfFGfC%MH4q6b1Qr1EfG>c#z-Pc5U<^QYIT6qSCcp?J05L!` zpar4;qLY546Qvak=z+FCJYWC@1H*tJfEl1RmkLmOBi})MHoywd^%Rbw_)P;w03(6X zz{kKSfb1dKf$~kZ7!Oe1N#0ms954}>089ct1*QYj0MeU|KL;q^vw)evY~V{^KF1>b zeg!N8RshR^rN9#48-T9UIsH;Od=GpFtOeEq>j9G09oPtL0?1xJ0y#MLn za1b~EhI~l(|_{{{o!SQQ=>MXS-UtA;F zUpRgX{0+PV{sC0Dz6d{=@hi$FS*rj_liDQ3WeNDD7){hwgY(A#=}Py}J)-_3CmN9F ziTaE@0L2e}06FtaxQDLOZzKFt9MAw*g!9q>#f%h_P(Mm}s)FCj0Ocb9sEFf*_zlEw z1%TpAiZ?0lq&PG`P!K2pP&`U;Daoa@iAKle@mm(4wCJ2-Q;Jb3R;3s<04N7k0*D@j zU$P8Xgv;D4;Juab9x4dl1{esCEd~Jn0UB3`_vmn}2Z$aA!~!wE zAVADF#a#w~cuf4)6^{k9Na#lQB?H7i9KS<>AwVj>Ms(6&yiWHGVZ-xs1`9b2M#e@NT<v-y4eZ#D-d7}lu+AI86Bf2n_Pmvz;)OaUbf8lWDCUs_-BYKYv- z5)lN;2|g?*q%90gt6puaE((;IFkCpiq~1!VR#ncd_ivfwO$wu+9N-(Fy*kEdX)xo{ zW^Wt+^wyWsfjq%$p`NA<+qZw$pv+gZf)avsLc?9ukVD8}5bjN1LqrPA89i-%{CiV}h&5FT2&taa>qeNII-B<^0AyXDMl1|%NuyFoON;ycIH1+NLP3805ktpXtDG$o4{&Po!&p-5!M0o=WX>hY~VD{%t zo9&e-MY9SXsaB1M4N3*@%=oxuuMtVlD@&BVppdj~mv?+M?%Bu1CCU&` z$h$Pk);Y#J{$R93nF&fMP)ZHy=yPM(nKX&=Jt$;Rzu!-WRR8<%-xB2r=NWIFSLwI$ zt@B6}qsC~W?+Fg*Sf)a`-DfAE#*;^?h4~5;HTfOOgjVl-sWED3xg^bQk$SxqNxYm#adz*U3zMV+d7|C{EFDslPltYr;*5V&#-upIe`N z)#$}miSh}j?7A_1d4VD=UrLlYoD$LQ$i}Z`{4hkKtOSMHUT~8y25idehZ-Vku$@!B zUNIv6LH58?66FM^jL*C}Za}`eDH7#6r)1C9u-ayySw|$w3s9&pIgqW>>=w5Zc1x6; zegdWFn>Qg{4n^oBN@-5nt$NV1;-9{e5+#&VE{=|A5%T$kT@s}Qr&P^fIm~C$^{*sK zZ%&CS{C5t&G6i2q6eFk1taq<`{FE=oOO#QZa^OW;nPJ~_pD9s32c;15v!F!qkH7q> z?JZGOfkIJDmxd>*l`NHSnMB#eDS3)C`*XpXr2P`*9H*>mq3>sIRB66Mxz8zvfnWb~ zcKVja5+##An`28m`IUdEy_Ns$C{e_(p~m!>@}PLH4$Y~)QB@396)z&_wleqGcmFg! z6VB@>YGQ)ks8571wPc+(Tsx<33MhyVsCV7~9_q7p77xt2b-=)@puq1@z5a<)%J}}? zzw?6!=w1+cJ zjG7i%=*pbBJF*W4h3l3ar`N{8J0D5-^yT7?Pg-yaa;mrJQgom!uioQA*Zg$T%Smid?OSC%vw z2nw1|T93}B+xL5N@ES=IY;X@0(qO^L8Fvd8IyDxQ+MuB1UV}omUY`2S6t<`Y>JG)0 zWbCnUd(>yWHTZm=SgzRx@YEDadpRh?^XkpexZOQxE%Ei4jw>j%w9WV>|5mEpwemZ2 zl-mLxDg{{Q94Mq)bgw{?2AhYbLEMC}fM(rjQ>D53~zFL9j#VH-O zzF~g)8*%bzv`C8gMwI0 z(0Z^ZeSPgiBe%c(=B((A=k_I%#|Ns@|LukksaTbHO${AuTwl4#ngyY6!18(VVCI`D@kk zmuWkM@i2?J@ygJ^2p(!b3qIM}botx7OTk0ZKuP748h+WM%1mE>he=~?VGJnbk><^< z@KgJl%btN!OQ?y{IK}w7&a3wET}pt0kuyn~4+{C6f|D-%-u=iv_$p>MLA5c*%qgLU^-m8SkBbF`+wB!76j$9^lRCY}?}J~0LL+`?kPCq_`MFQO zTG##U@Z;S<;WeZTDCAw%6)V$rSAp``csgiv5ui|Xdu{wh>)H;7vNIl5<2!-^H=ov^ zLt<*FvAgSo!hC#4cswW+D_gd8U$w^9?=jV~xKR{Y~D)SsdrQu|p7N+5VX zD&Fd3naArO1tLxqh>r5adS z;MregKw9#(7(Zx0tr7Jg29q3CU9{@tqARD@Y%H^qQ9@~+0)Yl|eeZ6Ud-l>=Xf7x; zS%cDco~Pi_kdTWgjUq1an2cKZFsy8R-(>Eb6irU>;5yk_Z;Zi?#5ilACDnJ|{rv<* zPgHWyO>d0Tne|pnzAx?+DSG8JY9i%@{#@Fc&2i^ppC!-xUx21^w8x+R-6iHWILx0-+cSfyb}e_^yMD4=pr`L3#o;Tn zslcqm`o>wHkVWskiu!Fpf$ZU+aQ{}WhR~bc%^grI*Qh}1x2d>cgOi-HD}TM`1KQ0v z3<~-S>M}H1lbJ$?^Dn1H|G4N6@?y2oXMv|RKz-w!S&@5BZ|+$X6tp;M!Y+Lki#D94 z`TI*EiPkw%U#di(+jHfXM&0FGX zAV5;bG&)_P&4~joK_R;#twftKRcngYRcRPCp;q23RC~$sfU*oNpYo&GU3Oo~ImMnc z4OpxH9u(@)2Q`>Ae(*1s_JhKs8ut`8aR?;+4sSuya(;R3!kBE=!?*^}co7-|QPv+E zIipGJ>OfH75-C5?I$fe#Z&95ue>8ARt9y~4pcas?S_vM~dS~8SD_X9Prt%>kTwTwl z)&5*PtL&cq)R&NTkW=^3;CAr%Lt4s~=e4rbZB6|)*$wmL?sZF_&Iq24dmf#|UCbAW zUY%l>k2)Xjpz;5KY)w5nv~J5OEr%8ODylz=4|u&!RAUc0W{}U7ub*vf>Nu)96s>~? z6n%o;s(Rk9)8x07Lsdbc8jo5P2@gZ*)L7PV=gqNEGzuk)g2!chR9s-4Hoj#5~Q017(j zw8QJmv}qLIdbC8Lg;#XLX%zzs*D5ot`)?v8L{%A-{Gfc&x?$VJ&&IzMDCEoQfrMkzZ`892E(XYY% z+7jh8C^Wy5dq(qa`NsT;wk_t=uYo{m@N@RcU9<1sAW;HAp~$Y(^fpHAqM6AO#ia(U z?(72(MNxtKmUgXFA|4}TiipDzc3uSq;bq#*PD3)a?>?7i>KUb$%D16loyG-M>5G5& z(NIvh-*K4^%C45mC536=(gv(nx#S6@)u~~Tg6A8)t!rAnUE}N}S4-tw53th3W^vTP z$G}qv`BBCEwDMSLK*H+o(x-eS)_!j0zsj9@?Jx}+5WuHDKmc(r3I@roKpN%!u=I(%S{w1p{{Ms?3M@~s@HdKfAK}v z8hhG-hnJkon1Yo;tj=gjHELA@i+8Lw|D#+-eSJnj3blcFi^&LAs;X;_>ffN~D%3Yf zV~eg9T|yGAV-#wA&#nNy~ls~CyGv|zUu zRVq36IdwCKkD55WsZif`46bzX-pDpIE5&P~ix~_|d617!zX~V%Uiay^Z`&@sKacrb zcz=q7ptXy!CX7bCvx|O#$6_vKvJelGwDdDsR0aqF5OwM-TKwMa(x&0vKf2sy^$k4+ zcA&ZRu+)C8G#7m0yh5Aq6d${75O{*2HFSFcN-@;p)W;isz1V2m2u=yDsp{WC;2GFj zo2%S}?lf;nkt%evfkNK$bw1soci~5A1V-cfkZ@HJHt>*lx%Tepn#$pM<}eD2YTTt0 z?pB&oeRJ;*R<;txwEfRN3hJ<^_ylOc>(0-hkk+OVGn=1ZRuwH+q`0pK?!AjU59_WJ z!r}d0OCyTwl2hh+*;?>oKbI`fxiGw3u+jaud2i>2a`K0P)fJemFd+2X^>K7lkIaXseggw4xB2Zjk_O;!`p5;O))wC-=ip11A$qzqshu&D(%tsePtwt>ITc*v)?`u$r; z_y_gDZhS9nFt-ES&z&~?Vr!puCkKx6^+9Nf6$b2f1%>)k-%Fnin=>H{Gp8cu1SkQZ z7)w9hapuhP z4-xtW7d51ou%pBM$jHSA8GeuIfw`klM~@Y1)%crd@wZtGVIKBFtm9^U3P z3A>5AT4>gt2B^U*7xQAQj-r(qG?qAc<@;aeC|E@|hRnPwJf z{DU%$GHbLt3-(hN{59*3dv2BC`9V5I!9#7Y`@nnuyqTs!9ffWz4r$g!kk;Vo&b5d9 zYmyCUoCO<91SKzcGWQJab~NkCeW0L|Bg!RENLtkzt^R)1ryzMG7WdMsqRX`c@Eq(a z@T|GC^xz426>fPt`L;Rcj zGIcqJkD7oT`2SW9`z5SHeXzKrP#T|N-dfh=iM&4z`A8U>ZJ+$C zMZt%um>aALDfIUg6dLWWZ&td}@>3%brO}iSlve2z&{FZctY;I|gFj|wDF`n{E;b_F zZaSi1izen=oOP2Z>Gx<3>><=9%v+Kos@(g^o$EZib2;7`Ls8m>Bu3dWDti5@FWUA1 zg$J?mdaIsD6Xu`ok@=(Cv^oa0$yvE+r|=YRcE*Kp?m$`*P{>;j%i3>VgUL$}If#@%P6;+0 zpF6$CaGHw_AtxWK3geVstIFTWGd5`(D3lH~Xbg%!q?HWIUpw$bg)c$j^P`%N+FuC|v7kP^gaXU6b4-zfUuoDPht=RH*T6Fw?cw`6ro2)TEIF*ZL&a;Onrn z9TqNmT?-T_Mmc2*yQn+iZ*p(%@!8t`piqwiAL62XxHRXwL-m?AZq!j(EovjCh*e{H zM#SVhaJj$ON)QRT(wg-@&eGuDYNOF%{Bymx5Zx}Bu&8|14qrEfZoDsf2@2Ja#<@1A zRv+0tndb-PNdOB!H&YDzZZDTqdsa!hD*^#qf~Z2ehZAts+U_fYY{37c~< z9u{9G(&7*P!rI<^v2k>jY>bDslK%Y#o({X$cRRZ+Y95z{y5llG2&_U>8e?jL#;T2b zWqUoQ``sCs%^N{uO_X-}$N?0lTl%&zf=4KQ1_;(^=J)+F>y#6i6B@zWX?pK6g4faX zt%Rk+%10B8cr3A8nc2lkmFqHz=|-Wl!p_p8on1sV&;d_RLAQJ;h3Lr}Khj@X@PJzf z($Z@nwgs2cSX||1!~(mW9VlpUHg6qc{z7eABOP87U95#7I)J%@uYiYi8*;IX{}HV^ z6+GmxBd~%ygvuH_%DS8$`?#mADbpH}70Og^rrqeOkq_>s)^Ago<_5V%9}N`R!ky0A zp`9jG7G@UMYTqV};H#FrNQv&6_vbt;9agV*gF>UkE)&kKDc!S8PD$Ev&XeV3^dEPw zPY9NHtZ_OcRmLYzSO2+uz^*C2K1HL19@c$2?stW`*n!7uqWckxiye5d8@Y-P*@2f{ zw^^9(DGsZ+7^9=)s5kqNeQ7JO?oItd;dkYl@A&SQPhnBS*R>D^YyyR5TbHaXRVCoX z+P|5tS?&E96!PRVzj(7WD89NC6eth@_wpMk6xHlaewAxwp3o{%gz_gS)NA(WGGF!X z;Tu{Np%FjYLX<5ghC-Bmt(#4*JY*N`xS@UleLdntlMO5Lfv1-&oOM_mBWZwTcQy73 z=~9o(zR`Er{P~Q+R;`{O9e<<~v2_2~=3h2j3JP?iO6vMa0P5#_V}$yqEq>tG*84vt zFdjC|=KMqmDA;*STI*60O{_6|Rj<@f@0z})9wVH2K0in!-#cJ#n^w2awD?ZwWzaD( z9*jR!Empqid242!4n$#_169SqLt0myKRThxraKEH%24o;-Na{K7=_IRQ~?j!y7J0p z&!4YbYaj|tKv8tMCuxul<4OPQ3-N@6QS{{a^bJdgMT5>18V9q-SQMV1aBpk(PeY_n zhn~71hv2%tQHIj9r5`r^gnzDUL1JxgQu1G?&;)y?P$e@`Ge5#A)rtTzLRhI)2q2kV04HW ziOrKw0EKGR{!Gy;%WUgW5)>LCqs`3#B_}8W-QT?Z`f34j_hx8q)qG9~?7YHqD*u>U z;6dRaqpCQAC5Tq?NBPVfoagNJr!@Lt)5@v@4K@Ws^Y#%pj&yzYfJOx@tF=@KI!l}Z zE!b~yhZ!{%?HBg^uwG^<(jkxZ(EQ!B(C~LOqe=!U1W(C%XmQCIdosz1D1CQxYJ z1sX64bZ9iDQuY@IE@u_ep;qs{ZU4a2$=0w*yWCZ+v?`AXiKOiYg<9704Y@!65up`jVPi+jK0-XFMc3#g*3hDcB2vA7pk-T8xB zt~8)0(U6}geKgy+@$mC!CkL3?)4Vc|$=?nV(h1mc?o#2aT_`3;d_vaoGYGZ!X~R)7 z3q*fUV?a(R$0@x-EA%^G^$*0B6l}l*E_ADjd#To@*IK0XPY}}SQ)2(dl$!7EARVe9 z)OZltQmyjol~U>UcQ>e);kyuvfKnKg=GD*t*>F-{e_x-xxI*cq@6Dh!O|7eVdZ1-;bl!F6*MVn)xzpKch1@5J`a1_7!@w?fQNcBO}CFipV=0#kSI?kqN$l4M~mG-tCD zFSgHIdz*VCM3Cuiy%YD6->IA;{AOCYKPq%gTs(OAsM?^1+r!^4)>gi;!>&_r#>eOb z!9#WE*`%1vhX({>Hev)(YGU5fRXwOhvp6p68>6_i0i(Dq1xC?BFV{81efgxffmq*M z)&mb3xKGEu4L&5N?$i1AN_&mD0DqKe3IDFI#;jY6RRrp{;jUFV5TcMj(2UvBcA0rV zVTn=_6dJ+anpmQ*&wz@BBuWG*B|&M~=bCEl;ZJ5slrEsqSaU&M!^!b&w$6|!dQfP6 zVMzCwY|{ti!(5uE!6;6txi)96uyV!-Vec{NHV>4F;PH8G&Nl8<)3ORn%RcTcyA6!%)Y*T8)`|0$kz!-ci#;u{WT9eSYi+l<)l->Y@n2%%>hI{f1C z*n<04W<-O3Z^^l@@&Bn(_)n$dKBw;6w)+n!4 z39JZUUp6^K|HnRP_xODx{5rl5Ti7`f)I0^RJTPhuUFp%Z*oFZi(hFW{JG|h<%65KX z9sRF@OU$#T6^zmwYtS{n%ZuwjC^h&;E7nuY*mKzLmw=DE#I$|&DMBq8&yJ~G^N3GM z-gj1w-jIwZ?OOIZRq;W!wUtgZ7W(wr@4}iGzHgg<1~jErB=OxT&UEMXw3LCu{TI6r z{iesNfMTO@PU(GIq)M!ZyY+_AUKj+v5&=9MSpnjBi@G-;_h`gsz{CAYKzj< zu<8?ZH0L0mYYm#jNV6tdpQ5(uYcLO^wixu$I&&mHNu-jf!6E^tOIV?`@JozbBigLf zJ6wp-N9oLhoM=;mXmd5&I3b>4P^$e5TAZwWG)W4U!*v(->5lGSW_ zAw0+$JA}rO2pt244GW;59wt%L8be~7Mz}yzSe(Wt4n3*^6Wi0qu^J;@8o?qVi#ARd zZ8PZ129wF6Q|pXLSX}TV&n`=nqrf7U3{Lqea!ku7lwk^#g*?%fU_5MOH4VZpWCg+Y zdmz<*tY+*aQi0Q+YjE0+)tEn_ZLi9#;`@BSDITiX3w?->92C_^%+M*MPIrKve$?zu zFU$bK955Ad!v^$PmY`tXN@&5BJ(_1k8%0B+_tL0!2~oP}XkD~IGBS3gMpD$m6BU@X zg|0SZv|g(hT8e@c`E3v*KZWvG45{hCVB!mDz$_lB+538kFB;9K23bvb-H(DE!VM52 z9H5w)ksyQT6Yq$^quY`EK7JRrJfH(mYs?7|;Z7vH0LzT`t+=FtCoEK;s1qznS|?U` z4_gW+#~N)4)C8Nw;6#?CtJZ0v;7i$?j>LS~Wvd~X=y5S_?;zYMcz zZBj%yCF3%IL{qZPoT!ZmH|X5nV+pGhoZ^DY&7P9Z=z?On?p`kg#ARMY zKB@W$W)`o@YSV{^hPtjKqPh$ggaG5 z=OmoS|3X5tHsPFzjPyYXI5kO0yc6MrgiB6CatTrjuBiWFGN{^u<8hUWo%lhCIQvH_ z1!u|!iMJbrd=OlTB;J|wFN=5K7Fb6_?(Ktw3spssL4IA*-I?-1;$`-Y2$y6#T>c=z z@?KbyE5DjSvBD5S=;ENb}`p_8>~e*B6ZDCeh;W@^z$B*W$bkysctKV# z6snU``dll!FtHbv>R85Q@qF85@$>i8%fYgc<#7I^^VDTGq8AHSyzdzT1B?8omZLokD&hyD12WC%4ykn#TY#2yqNFZN@Z9u$9wGxQ2x zUYc=*9O(p;OEfozD1^-s=`0B}PZWe{Rs~tYE3qI)I8f8fsSx5}Ly{&|hp5hERL7Vx z1xivCB+(A0^bC;fn!w^VPca{DMTZ3XQ48qyD^E|5~qvO7-Q91Q$hlK7n`nRZ%qwi^Mlg4LNe@rB*1<# z$%rV!gJSIMtKeY2jKfn_ob)7PIBG6Q5eX3l1s+u7i}nO{;aHHVbJ z&NRSqnzuGg!(*L7ove?x#$j2kuKYX_Ps^ZL$}g!gx~20(HIrJEo{ zIzj)(OWK15qOG|O;wjCjU?u=XsY@`$>#@oSCxi#WVr&MiiKA@bX|W=dXu?XULJDp; zkeC}vhWwRGB}kH;v1;VW+sR5tG?`FV$TN9M{HHR+HJPOR=i0nka*g#j)r+@GTa7g3XNo@nmfr*U_TI zgn_{njVnQHCkWgH3r+NJtW^>7gIj z8cf(F!`UhFv>El*RNB^o$RRN@&W2DlIS!M<(b%~HZxW-A#j>wilbW7~3t=yRbYe^} z(GCl>J|U6JXJ%s%vxV5D=r65tCYzOwP?Wb|WQZT-nxXro31@{`shl4q<&?vW z2~B5qxe29u$t()bE^ZWIyJ6Tq82dID;pz5Zg&c6v@){zgAis)MN}Y(Zw|26JykbDA z{8Wgjgbf!?T&Adaoz|+R?I#Hu1=W?fykT>Zj!ET%bR`VSDu$QZVjs3EoKf*(?C0HoO78uF%&?J2W=S~44 z_z}{~NVM$Q=|GILAA<2R(8;;*Ymnv2-9bOkBS&Xf3R%vVqB#8s^E=qLgPh8f&F_1>T!f#$D-Cm;k79?t5O8#d@C~Gd?`b&O_n;@ zK+=VAdy2}$_pO6fJY?s^`7N(jo*5EJPR}SO(O_0Zrs9QqAP>x{4x9@{ZJYN=2$r8_s2_7k69OF0S;G;c64Y)C5)`L(@QzL49*D6Yvy$;-RpD)T zWEb{%1&o6|??hBd!rDM&;XS&C}fJ!?Se56!iV5W zEb-LC-~$?nS8zM)^;iQHB5bwQtifcEMHqSt1g9~Wf^arob;*P@-4mJf@KkGDDG8~r zF0)a-r#8yek;c}dg3=XMmpyq@;j0y377ow|$*(AT74Zuc;1UmE0ngp7)9@ecPFK)? zJ;xZ1GYk;ocmcVlhrg9`AfK^-1o!JgM))kLLaMSE9q`J|Xhe&`P&R{XY6#r2Gd7m+ zWJHu3u~53g5$ge1(cuE-pNOiYyZt6X1m|Fl(Nh(crnkT=osd8E*r`gBWZ;!fz*|SK z7^VUZHcYx3EXgKww3^~==CLsapdG}TExupEo_WzB@^`=R;Cw5RbH2oSb5D^!eJusN z^phdaA}LG8p}vV}&UiglMJey#l}=c6=c!Qa)&i^jm~nav?D*GZz{iiEtLN$~hJ#pA zV_}svHL6f3_E}T#*pD;hxWte2k(T^>eau;TGAaMm4A}S)D|AmTj(>U(T>J>0gwGQQ z-q&oEa^RMoF)!hXTl_Q*CCtB)BjrS)ocM=x1UCAF zjuhIZ!ulpP8-FMWklh6#vNKkG7L5>$#-{eUL@w*P-77sI2%)AqnKcXo-hRJL|3k;4=VzNgxA({8K z&QAuisb5xQ*^!IsU?I#@E6oSnpAm%)_G6R;?8FHc>Y ztLIh0?qD10o|#9CjM7Bu446;GiimK???Vh=v|w{j0)KWDfx6nFGsI-zF1Ep)YtCd2 z7(nuchh6zIu)-p}WM_qX<-muGIGj^^pjBw)s-0dLDig}Npc>UpdK(p_@cdEFV-fR8 zTOQ1gGOW6UL`?hWoUZav%ke5cbfd#7Jrx^|8xBcLyAbG#R|$H`uuzsP7m&ezDUaVNQa?vWM?! z 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 i!$dPpiwQ$u%rmP!% { + const newTracks: ClapTracks = tracks.map((track: any) => { contentHeight += computeCellHeight({ trackNumber: track.id, tracks, diff --git a/packages/timeline/src/hooks/useHorizontalGridLines.ts b/packages/timeline/src/hooks/useHorizontalGridLines.ts index 3c41d311..4e1e82ef 100644 --- a/packages/timeline/src/hooks/useHorizontalGridLines.ts +++ b/packages/timeline/src/hooks/useHorizontalGridLines.ts @@ -29,7 +29,7 @@ export const useHorizontalGridLines = () => { setGridLines(thisLines); }, [ contentWidth, - JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)), + JSON.stringify(tracks.map((t: any) => `${t.visible}_${t.height}`)), ]); return gridlines; diff --git a/packages/timeline/src/hooks/useHorizontalTrackLines.ts b/packages/timeline/src/hooks/useHorizontalTrackLines.ts index 32a6d9c4..a78c258e 100644 --- a/packages/timeline/src/hooks/useHorizontalTrackLines.ts +++ b/packages/timeline/src/hooks/useHorizontalTrackLines.ts @@ -28,7 +28,7 @@ export const useHorizontaTrackLines = () => { setLines(thisLines); }, [, leftBarTrackScaleWidth, - JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) + JSON.stringify(tracks.map((t: any) => `${t.visible}_${t.height}`)) ]); return lines; diff --git a/packages/timeline/src/hooks/useTimeline.ts b/packages/timeline/src/hooks/useTimeline.ts index 53e7a10f..fe3f1900 100644 --- a/packages/timeline/src/hooks/useTimeline.ts +++ b/packages/timeline/src/hooks/useTimeline.ts @@ -582,7 +582,7 @@ export const useTimeline = create((set, get) => ({ set({ ...computeContentSizeMetrics({ meta, - tracks: tracks.map(t => ( + tracks: tracks.map((t: any) => ( t.id === trackId ? { ...t, visible: !t.visible } : t diff --git a/packages/timeline/src/hooks/useVerticalGridLines.ts b/packages/timeline/src/hooks/useVerticalGridLines.ts index 5208f1ba..2d85198b 100644 --- a/packages/timeline/src/hooks/useVerticalGridLines.ts +++ b/packages/timeline/src/hooks/useVerticalGridLines.ts @@ -31,7 +31,7 @@ export const useVerticalGridLines = () => { contentHeight, cellWidth, nbMaxShots, - JSON.stringify(tracks.map(t => `${t.visible}_${t.height}`)) + JSON.stringify(tracks.map((t: any) => `${t.visible}_${t.height}`)) ]); return gridlines; diff --git a/packages/timeline/src/utils/getFinalVideo.ts b/packages/timeline/src/utils/getFinalVideo.ts index da182294..6689ac2d 100644 --- a/packages/timeline/src/utils/getFinalVideo.ts +++ b/packages/timeline/src/utils/getFinalVideo.ts @@ -3,8 +3,8 @@ import { ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentStatus } from import { TimelineSegment } from "@/types" import { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" -export async function getFinalVideo(clap: ClapProject): Promise { - const alreadyAnEmbeddedFinalVideo: ClapSegment | undefined = clap.segments.filter(s => +export async function getFinalVideo(clap: ClapProject): Promise { + const alreadyAnEmbeddedFinalVideo: ClapSegment | undefined = clap.segments.filter((s: ClapSegment) => s.category.toUpperCase() === ClapSegmentCategory.VIDEO && s.status.toUpperCase() === ClapSegmentStatus.COMPLETED && s.startTimeInMs === 0 && diff --git a/packages/timeline/tsconfig.json b/packages/timeline/tsconfig.json index fe8d3130..afae3b3b 100644 --- a/packages/timeline/tsconfig.json +++ b/packages/timeline/tsconfig.json @@ -3,7 +3,7 @@ "outDir": "./dist", "rootDir": "./src", "baseUrl": "./", - "paths": { + "paths": { "@/*": ["src/*"] }, "lib": ["dom", "dom.iterable", "esnext"], @@ -12,6 +12,7 @@ "moduleResolution": "bundler", "moduleDetection": "force", "allowImportingTsExtensions": true, + "noImplicitAny": false, "noEmit": true, "composite": true, "strict": true, diff --git a/packages/timeline/vite.config.js b/packages/timeline/vite.config.js index 2dea53a3..bcdb65c7 100644 --- a/packages/timeline/vite.config.js +++ b/packages/timeline/vite.config.js @@ -1,7 +1,24 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import path from 'path' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + // resolve monorepo packages + resolve: { + alias: { + "@aitube/clap": path.resolve(__dirname, "../clap/dist"), + '@': path.resolve(__dirname, 'src'), + }, + }, + server: { + fs: { + // Allow serving files from one level up to the project root + allow: ['..'], + }, + }, + optimizeDeps: { + exclude: ['@aitube/clap'], // Exclude the clap package from pre-bundling + }, }) \ No newline at end of file

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%0Aw@)u@^sGUfa6^BZ2zSMu2M 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 b5_&6+{5XLO(X(dqjxYW{?^XV9ncW!xt?;t3 diff --git a/packages/broadway/src/analysis/analyzeScreenplay.ts b/packages/broadway/src/analysis/analyzeScreenplay.ts index 3e8b684e..f627c080 100644 --- a/packages/broadway/src/analysis/analyzeScreenplay.ts +++ b/packages/broadway/src/analysis/analyzeScreenplay.ts @@ -333,10 +333,10 @@ export async function analyzeScreenplay( endTimeInLines: event.endAtLine, sceneId: scene.id, prompt: [ - ...sequenceGenre.prompts.style, + ...sequenceGenre.prompts.STYLE, "cinematic photo", "movie screencap", - ...movieEra.prompts.style + ...movieEra.prompts.STYLE ], categoryName: ClapSegmentCategory.STYLE, })) @@ -419,8 +419,8 @@ export async function analyzeScreenplay( prompt: [ currentTime, currentLighting, - ...sequenceGenre.prompts.lighting, - ...movieEra.prompts.lighting, + ...sequenceGenre.prompts.LIGHTING, + ...movieEra.prompts.LIGHTING, ], categoryName: ClapSegmentCategory.LIGHTING, })) @@ -436,7 +436,7 @@ export async function analyzeScreenplay( sceneId: scene.id, prompt: [ currentWeather, - ...sequenceGenre.prompts.weather, + ...sequenceGenre.prompts.WEATHER, ], categoryName: ClapSegmentCategory.WEATHER, })) @@ -489,8 +489,8 @@ export async function analyzeScreenplay( sceneId: scene.id, prompt: [ currentShotType, - ...sequenceGenre.prompts.camera, - ...movieEra.prompts.camera + ...sequenceGenre.prompts.CAMERA, + ...movieEra.prompts.CAMERA ], categoryName: ClapSegmentCategory.CAMERA, })) @@ -510,7 +510,7 @@ export async function analyzeScreenplay( assetsByLabel[characterName] = { id: UUID(), // unique identifier of the assets (UUID) type: "Description", - category: ClapSegmentCategory.CHARACTER, + category: "character", label: characterName, // the asset name (eg. in the script) content: characterName, // url to the resource, or content string occurrences: 1 + existingOccurrences, @@ -588,7 +588,7 @@ export async function analyzeScreenplay( const dialogueLine = parseDialogueLine(event.description) - if (event.type === ClapSegmentCategory.DIALOGUE && dialogueLine) { + if (event.type === "dialogue" && dialogueLine) { // console.log("found a dialogue! currentSliceEntities:", currentSliceEntities) segmentCandidates.push(createSegment({ startTimeInSteps, @@ -639,13 +639,13 @@ export async function analyzeScreenplay( //...sequenceGenre.prompts.era, // note: here we use the *ERA* parser, and on the FULL MOVIE - ...movieEra.prompts.era, + ...movieEra.prompts.ERA, ], categoryName: ClapSegmentCategory.ERA, })) const defaultSoundPrompt = - event.type === ClapSegmentCategory.DIALOGUE + event.type === "dialogue" // a generic "people talking" sound isn't very interesting ? [] @@ -671,16 +671,16 @@ export async function analyzeScreenplay( prompt: [ currentSound, // note: here we use the *GENRE* parser, and on the FULL MOVIE - ...sequenceGenre.prompts.sound, + ...sequenceGenre.prompts.SOUND, - ...movieEra.prompts.sound, + ...movieEra.prompts.SOUND, ], entityId: currentSliceEntities[0]?.id || undefined, categoryName: ClapSegmentCategory.SOUND, })) } - currentMusic = pick(mockCategoryPrompts.music) || currentMusic + currentMusic = pick(mockCategoryPrompts.MUSIC) || currentMusic if (currentMusic) { segmentCandidates.push(createSegment({ @@ -691,9 +691,9 @@ export async function analyzeScreenplay( prompt: [ currentMusic, // note: here we use the *GENRE* parser, and on the FULL MOVIE - ...sequenceGenre.prompts.music, + ...sequenceGenre.prompts.MUSIC, - ...movieEra.prompts.music + ...movieEra.prompts.MUSIC ], categoryName: ClapSegmentCategory.MUSIC, })) diff --git a/packages/broadway/src/constants/mocks.ts b/packages/broadway/src/constants/mocks.ts index 189e518a..5cbc6892 100644 --- a/packages/broadway/src/constants/mocks.ts +++ b/packages/broadway/src/constants/mocks.ts @@ -3,7 +3,7 @@ import { ClapSegmentCategory } from "@aitube/clap" // those are very random categories, so we don't use this as an example // as this will looks unrealistic to potential customers export const mockCategoryPrompts_misc: Record = { - action: [ + ACTION: [ "eating a dinner", "looking at cellphones", "enjoying the view", @@ -12,22 +12,22 @@ export const mockCategoryPrompts_misc: Record = { "tense", "mysterious", ], - character: [ + CHARACTER: [ "James", "Anna", "Alice", "Bob" ], - location: [ + LOCATION: [ "train station in NYC", "inside a building", "below the Eiffel Tower", "in a fancy restaurant" ], - transition: [ + TRANSITION: [ "CUT TO" ], - camera: [ + CAMERA: [ "long wide establishing shot", "full shot", "medium-long shot", @@ -40,25 +40,25 @@ export const mockCategoryPrompts_misc: Record = { "Italian shot", "trolley shot" ], - lighting: [ + LIGHTING: [ "strong light", "soft light", "candlelit", ], - time: [ + TIME: [ "in the morning, golden hour", "at noon", "during the day, sunlit", "in the evening, golden hour", "at night, moonlit" ], - era: [ + ERA: [ "in the 60s", "in the 70s", "in the 80s", "modern era" ], - weather: [ + WEATHER: [ "cloudy, soft mist", "cloudy, in the fog", "sunny", @@ -69,7 +69,7 @@ export const mockCategoryPrompts_misc: Record = { "clouds with strong wind", // "storm" ], - sound: [ + SOUND: [ "street noise", "wind sound", "cafe noise", @@ -82,7 +82,7 @@ export const mockCategoryPrompts_misc: Record = { "steps sounds", "bag opening" ], - music: [ + MUSIC: [ "soft electronic ambient", "energic electronic beat", "instrumental orchestra", @@ -93,14 +93,14 @@ export const mockCategoryPrompts_misc: Record = { "lofi instrumental hiphop" ], - dialogue: [ + DIALOGUE: [ "saying hello", "asking for directions", "disagreeing", "threatening" ], - style: [ + STYLE: [ "Mickael Bay", "Wes Anderson", "Studio Ghibli", @@ -119,23 +119,24 @@ export const mockCategoryPrompts_misc: Record = { ], */ - splat: [], - mesh: [], - depth: [], - event: [], - interface: [], - phenomenon: [], - video: [], - storyboard: [], + SPLAT: [], + MESH: [], + DEPTH: [], + EVENT: [], + EFFECT: [], + INTERFACE: [], + PHENOMENON: [], + VIDEO: [], + STORYBOARD: [], - generic: [ + GENERIC: [ "Custom" ] } export const mockCategoryPrompts: Record = { - action: [ + ACTION: [ "peaceful", "tense", "mysterious", @@ -146,7 +147,7 @@ export const mockCategoryPrompts: Record = { "tense", "mysterious", ], - character: [ + CHARACTER: [ "Henry", "Margaret", "Eleanor", @@ -158,13 +159,13 @@ export const mockCategoryPrompts: Record = { "Gideon", "Isaac" ], - location: [ + LOCATION: [ "on the beach in the caribbean", "on the deck of a pirate ship", "in the captain's quarters of a pirate ship", "in a tropical forest", ], - camera: [ + CAMERA: [ "long wide establishing shot", "full shot", "medium-long shot", @@ -177,23 +178,23 @@ export const mockCategoryPrompts: Record = { "Italian shot", "trolley shot" ], - lighting: [ + LIGHTING: [ "strong light", "soft light", "candlelit", ], - time: [ + TIME: [ "in the morning, golden hour", "at noon", "during the day, sunlit", "in the evening, golden hour", "at night, moonlit" ], - era: [ + ERA: [ // "in 1700", // "during piracy times" ], - weather: [ + WEATHER: [ "cloudy, soft mist", "cloudy, in the fog", "sunny", @@ -204,13 +205,13 @@ export const mockCategoryPrompts: Record = { "clouds with strong wind", // "storm" ], - sound: [ + SOUND: [ "animal noise", "wind sound", "tropical sounds", "sea noises", ], - music: [ + MUSIC: [ "cinematic music", "adventurous instrumental orchestra", "epic orchestral with strings", @@ -220,17 +221,17 @@ export const mockCategoryPrompts: Record = { // "epic orchestral with strings, 1800", // "suspensful instrumental orchestra, 1700", ], - transition: [ + TRANSITION: [ "cut to" ], - dialogue: [ + DIALOGUE: [ "saying hello", "asking for directions", "disagreeing", "threatening" ], - style: [ + STYLE: [ "movie screencap, film grain" ], @@ -241,16 +242,17 @@ export const mockCategoryPrompts: Record = { "" ], */ - splat: [], - mesh: [], - depth: [], - event: [], - interface: [], - phenomenon: [], - video: [], - storyboard: [], + SPLAT: [], + MESH: [], + DEPTH: [], + EVENT: [], + EFFECT: [], + INTERFACE: [], + PHENOMENON: [], + VIDEO: [], + STORYBOARD: [], - generic: [ + GENERIC: [ "Lorem ipsum" ] } diff --git a/packages/broadway/src/factories/createSegment.ts b/packages/broadway/src/factories/createSegment.ts index f6502283..82422d23 100644 --- a/packages/broadway/src/factories/createSegment.ts +++ b/packages/broadway/src/factories/createSegment.ts @@ -2,7 +2,6 @@ import { getSegment, segmentCategories, ClapSegmentCategorySettings } from "@aitube/colors" import { DEFAULT_DURATION_IN_MS_PER_STEP } from "@/constants/general" -import { RenderedScene } from "@/types" import { pick } from "@/utils" import { generateSeed, parseOutputType, ClapOutputType, ClapSegmentCategory, ClapSegment, UUID, newSegment } from "@aitube/clap" diff --git a/packages/broadway/src/factories/generateClap.ts b/packages/broadway/src/factories/generateClap.ts index f0c2ddcf..bdd9a14a 100644 --- a/packages/broadway/src/factories/generateClap.ts +++ b/packages/broadway/src/factories/generateClap.ts @@ -1,6 +1,6 @@ import YAML from "yaml" -import { ClapFormat, ClapHeader, ClapMeta, ClapEntity, ClapScene, ClapSegment, ClapMediaOrientation, getValidNumber, UUID } from "@aitube/clap" +import { ClapFormat, ClapHeader, ClapMeta, ClapEntity, ClapScene, ClapSegment, ClapMediaOrientation, getValidNumber, UUID, ClapWorkflow, sanitizeEntities, sanitizeSegment, sanitizeWorkflows } from "@aitube/clap" import { MovieScript, Screenplay } from "@/types" /** @@ -17,6 +17,7 @@ export async function generateClap({ script, screenplay, projectInfo = "", + workflows = [], segments = [], entities = [], embedded = false, @@ -24,6 +25,7 @@ export async function generateClap({ script: MovieScript screenplay: Screenplay projectInfo: string + workflows: ClapWorkflow[] segments: ClapSegment[] entities: ClapEntity[] @@ -35,49 +37,9 @@ export async function generateClap({ const clapScenes: ClapScene[] = screenplay.sequences.flatMap(sequence => sequence.scenes) - const clapEntities: ClapEntity[] = entities.map(({ - id, - category, - triggerName, - label, - description, - author, - thumbnailUrl, - seed, - imagePrompt, - imageSourceType, - imageEngine, - imageId, - audioPrompt, - audioSourceType, - audioEngine, - audioId, - age, - gender, - region, - appearance, - }) => ({ - id, - category, - triggerName, - label, - description, - author, - thumbnailUrl, - seed, - imagePrompt, - imageSourceType, - imageEngine, - imageId, - audioPrompt, - audioSourceType, - audioEngine, - audioId, - age, - gender, - region, - appearance, - })) + const clapWorkflows = sanitizeWorkflows(workflows) + + const clapEntities = sanitizeEntities(entities) const useCompactMode = !embedded @@ -86,17 +48,17 @@ export async function generateClap({ let highestEndTimeInMs = 0 - const clapSegments: ClapSegment[] = segments.map(segmentData => { - - if (segmentData.endTimeInMs > highestEndTimeInMs) { - highestEndTimeInMs = segmentData.endTimeInMs + const clapSegments: ClapSegment[] = segments.map(maybeSegment => { + const segment = sanitizeSegment(maybeSegment) + if (segment.endTimeInMs > highestEndTimeInMs) { + highestEndTimeInMs = segment.endTimeInMs } - - return segmentData + return segment }) const clapHeader: ClapHeader = { format: ClapFormat.CLAP_0, + numberOfWorkflows: clapWorkflows.length, numberOfEntities: clapEntities.length, numberOfScenes: clapScenes.length, numberOfSegments: clapSegments.length, @@ -108,6 +70,8 @@ export async function generateClap({ description: "", synopsis: "", licence: "", + tags: [], + thumbnailUrl: "", orientation: ClapMediaOrientation.LANDSCAPE, durationInMs: highestEndTimeInMs, isLoop: false, @@ -123,6 +87,7 @@ export async function generateClap({ const entries = [ clapHeader, clapMeta, + ...clapWorkflows, ...clapEntities, ...clapScenes, ...clapSegments diff --git a/packages/broadway/src/index.ts b/packages/broadway/src/index.ts index cc3571c1..61ec1b52 100644 --- a/packages/broadway/src/index.ts +++ b/packages/broadway/src/index.ts @@ -55,9 +55,6 @@ export { type MergedLine, type ScreenplaySequence, type Screenplay, - type RenderedSceneStatus, - type ImageSegment, - type RenderedScene, type AssetType, type AssetCategory, type TemporaryAssetData, diff --git a/packages/broadway/src/parsers/costumes/database.ts b/packages/broadway/src/parsers/costumes/database.ts index c7145f3c..635aac17 100644 --- a/packages/broadway/src/parsers/costumes/database.ts +++ b/packages/broadway/src/parsers/costumes/database.ts @@ -8,19 +8,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } } ] \ No newline at end of file diff --git a/packages/broadway/src/parsers/eras/database.ts b/packages/broadway/src/parsers/eras/database.ts index 0e05dd4c..a0b09b10 100644 --- a/packages/broadway/src/parsers/eras/database.ts +++ b/packages/broadway/src/parsers/eras/database.ts @@ -113,19 +113,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["futuristic"], - lighting: ["dimly lit"], - weather: [], - action: [], - music: ["electronic"], - sound: [], - dialogue: [], - style: ["futuristic"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["futuristic"], + LIGHTING: ["dimly lit"], + WEATHER: [], + ACTION: [], + MUSIC: ["electronic"], + SOUND: [], + DIALOGUE: [], + STYLE: ["futuristic"], + CAMERA: [], } }, { @@ -279,19 +279,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["antiquity", "roman, greek and spartan empire"], - lighting: [], - weather: [], - action: [], - music: ["old harp music"], - sound: [], - dialogue: [], - style: ["antiquity", "roman, greek and spartan empire"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["antiquity", "roman, greek and spartan empire"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["old harp music"], + SOUND: [], + DIALOGUE: [], + STYLE: ["antiquity", "roman, greek and spartan empire"], + CAMERA: [], } }, { @@ -402,19 +402,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["1800s", "1880", "farewest"], - lighting: [], - weather: [], - action: [], - music: ["western music"], - sound: [], - dialogue: [], - style: ["american", "western", "dusty"], - camera: ["color footage"], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["1800s", "1880", "farewest"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["western music"], + SOUND: [], + DIALOGUE: [], + STYLE: ["american", "western", "dusty"], + CAMERA: ["color footage"], } }, { @@ -438,19 +438,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during WW1"], // ["1914", "1915", "1916", "1917", "1918"], - lighting: [], - weather: [], - action: [], - music: ["1910 jazz"], - sound: [], - dialogue: [], - style: ["color footage", "in color"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during WW1"], // ["1914", "1915", "1916", "1917", "1918"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["1910 jazz"], + SOUND: [], + DIALOGUE: [], + STYLE: ["color footage", "in color"], + CAMERA: [], } }, { @@ -474,19 +474,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during WW2"], // ["1939", "1940", "1944", "1945"], - lighting: [], - weather: [], - action: [], - music: ["1940 jazz, 40s"], - sound: [], - dialogue: [], - style: ["40s"], - camera: ["color footage", "in color"], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during WW2"], // ["1939", "1940", "1944", "1945"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["1940 jazz, 40s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["40s"], + CAMERA: ["color footage", "in color"], } }, { @@ -509,19 +509,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during the 50s"], // ["1950", "1952", "1954", "1955", "1957", "1958", "1959"], - lighting: [], - weather: [], - action: [], - music: ["50s"], - sound: [], - dialogue: [], - style: ["50s", "fifties"], - camera: ["color footage", "in color"], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during the 50s"], // ["1950", "1952", "1954", "1955", "1957", "1958", "1959"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["50s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["50s", "fifties"], + CAMERA: ["color footage", "in color"], } }, { @@ -545,19 +545,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during the 60s"], // ["1960", "1962", "1964", "1965", "1967", "1968", "1969"], - lighting: [], - weather: [], - action: [], - music: ["60s"], - sound: [], - dialogue: [], - style: ["60s", "sixties"], - camera: ["color footage", "in color"], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during the 60s"], // ["1960", "1962", "1964", "1965", "1967", "1968", "1969"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["60s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["60s", "sixties"], + CAMERA: ["color footage", "in color"], } }, { @@ -580,19 +580,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during the 70S"], // ["1970", "1972", "1974", "1975", "1977"], - lighting: [], - weather: [], - action: [], - music: ["70s"], - sound: [], - dialogue: [], - style: ["70s", "seventies"], - camera: ["color footage", "in color"], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during the 70S"], // ["1970", "1972", "1974", "1975", "1977"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["70s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["70s", "seventies"], + CAMERA: ["color footage", "in color"], } }, { @@ -614,19 +614,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during the 80s"], // ["1980", "1982", "1984", "1986"], - lighting: [], - weather: [], - action: [], - music: ["80s"], - sound: [], - dialogue: [], - style: ["80s", "eighties"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during the 80s"], // ["1980", "1982", "1984", "1986"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["80s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["80s", "eighties"], + CAMERA: [], } }, { @@ -649,19 +649,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["during the 1990s"], // ["1990", "1992", "1994", "1995", "1996", "1998"], - lighting: [], - weather: [], - action: [], - music: ["90s"], - sound: [], - dialogue: [], - style: ["90s", "nineties"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["during the 1990s"], // ["1990", "1992", "1994", "1995", "1996", "1998"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["90s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["90s", "nineties"], + CAMERA: [], } }, { @@ -685,19 +685,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["2005 style"], // ["2000", "2001", "2002", "2007", "2008"], - lighting: [], - weather: [], - action: [], - music: ["2000s"], - sound: [], - dialogue: [], - style: ["the 2000s"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["2005 style"], // ["2000", "2001", "2002", "2007", "2008"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["2000s"], + SOUND: [], + DIALOGUE: [], + STYLE: ["the 2000s"], + CAMERA: [], } }, { @@ -747,19 +747,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["contemporary"], - lighting: [], - weather: [], - action: [], - music: ["contemporary music"], - sound: [], - dialogue: [], - style: ["contemporary"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["contemporary"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["contemporary music"], + SOUND: [], + DIALOGUE: [], + STYLE: ["contemporary"], + CAMERA: [], } }, { @@ -781,19 +781,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: ["contemporary", "modern", "2018", "2022"], - lighting: [], - weather: [], - action: [], - music: ["modern music"], - sound: [], - dialogue: [], - style: ["contemporary", "modern", "2018", "2022"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: ["contemporary", "modern", "2018", "2022"], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["modern music"], + SOUND: [], + DIALOGUE: [], + STYLE: ["contemporary", "modern", "2018", "2022"], + CAMERA: [], } }, ] \ No newline at end of file diff --git a/packages/broadway/src/parsers/genres/database.ts b/packages/broadway/src/parsers/genres/database.ts index d48b0feb..d560e342 100644 --- a/packages/broadway/src/parsers/genres/database.ts +++ b/packages/broadway/src/parsers/genres/database.ts @@ -16,19 +16,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: ["suspenseful", "movie soundtrack"], - sound: [], - dialogue: [], - style: ["dimly lit", "suspenseful"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["suspenseful", "movie soundtrack"], + SOUND: [], + DIALOGUE: [], + STYLE: ["dimly lit", "suspenseful"], + CAMERA: [], } }, { @@ -63,19 +63,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: ["suspenseful", "mystery", "jazzy", "noir movie"], - sound: [], - dialogue: [], - style: ["dimly lit", "tense", "suspenseful", "cold", "strong shadows"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["suspenseful", "mystery", "jazzy", "noir movie"], + SOUND: [], + DIALOGUE: [], + STYLE: ["dimly lit", "tense", "suspenseful", "cold", "strong shadows"], + CAMERA: [], } }, { @@ -100,19 +100,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: ["suspenseful", "mystery", "noir movie"], - sound: [], - dialogue: [], - style: ["dimly lit", "tense", "suspenseful", "cold", "strong shadows"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["suspenseful", "mystery", "noir movie"], + SOUND: [], + DIALOGUE: [], + STYLE: ["dimly lit", "tense", "suspenseful", "cold", "strong shadows"], + CAMERA: [], } }, { @@ -191,19 +191,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: ["dimly lit"], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: ["fantasy"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: ["dimly lit"], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: ["fantasy"], + CAMERA: [], } }, { @@ -225,19 +225,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: ["mystery", "adventure", "indiana jones", "goonies", "pirates"], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["mystery", "adventure", "indiana jones", "goonies", "pirates"], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -285,19 +285,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: ["action movie", "thriller", "fast paced"], - sound: [], - dialogue: [], - style: ["action movie", "thriller", "fast paced"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: ["action movie", "thriller", "fast paced"], + SOUND: [], + DIALOGUE: [], + STYLE: ["action movie", "thriller", "fast paced"], + CAMERA: [], } }, { @@ -355,19 +355,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: ["science", "engineering"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: ["science", "engineering"], + CAMERA: [], } }, { @@ -408,19 +408,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: ["bloody", "gore"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: ["bloody", "gore"], + CAMERA: [], } }, { @@ -504,19 +504,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: ["anxiety"], - location: [], - transition: [], - time: [], - era: [], - lighting: ["dimly lit"], - weather: [], - action: [], - music: ["uneasy", "creepy"], - sound: ["silence", "creepy"], - dialogue: [], - style: ["creepy", "uneasy"], - camera: [], + CHARACTER: ["anxiety"], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: ["dimly lit"], + WEATHER: [], + ACTION: [], + MUSIC: ["uneasy", "creepy"], + SOUND: ["silence", "creepy"], + DIALOGUE: [], + STYLE: ["creepy", "uneasy"], + CAMERA: [], } }, { @@ -556,19 +556,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -589,19 +589,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: ["military", "ww1"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: ["military", "ww1"], + CAMERA: [], } }, { @@ -624,19 +624,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: ["military", "ww2"], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: ["military", "ww2"], + CAMERA: [], } } ] \ No newline at end of file diff --git a/packages/broadway/src/parsers/lights/database.ts b/packages/broadway/src/parsers/lights/database.ts index 1ad63320..f2421da5 100644 --- a/packages/broadway/src/parsers/lights/database.ts +++ b/packages/broadway/src/parsers/lights/database.ts @@ -15,19 +15,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -44,19 +44,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -73,19 +73,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -102,19 +102,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -126,19 +126,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -150,19 +150,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -181,19 +181,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -212,19 +212,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -253,19 +253,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -294,19 +294,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -319,19 +319,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -344,19 +344,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -368,19 +368,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -392,19 +392,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -417,19 +417,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -442,19 +442,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -465,19 +465,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -488,19 +488,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -511,19 +511,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -534,19 +534,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -557,19 +557,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -580,19 +580,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -613,19 +613,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -646,19 +646,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -672,19 +672,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -698,19 +698,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -722,19 +722,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -747,19 +747,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -771,19 +771,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -795,19 +795,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -819,19 +819,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -845,19 +845,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -868,19 +868,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -891,19 +891,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -914,19 +914,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -937,19 +937,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -960,19 +960,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -983,19 +983,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1006,19 +1006,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1029,19 +1029,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1052,19 +1052,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1075,19 +1075,19 @@ export const artificalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -1114,19 +1114,19 @@ export const naturalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1138,19 +1138,19 @@ export const naturalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1161,19 +1161,19 @@ export const naturalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1185,19 +1185,19 @@ export const naturalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1209,19 +1209,19 @@ export const naturalLights: NamedEntity[] = [ ] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: ["moonlit"], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: ["moonlit"], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] diff --git a/packages/broadway/src/parsers/locations/database.ts b/packages/broadway/src/parsers/locations/database.ts index de61bcda..5adaa9d7 100644 --- a/packages/broadway/src/parsers/locations/database.ts +++ b/packages/broadway/src/parsers/locations/database.ts @@ -15,19 +15,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -44,19 +44,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -71,19 +71,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -97,19 +97,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -123,19 +123,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -149,19 +149,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -181,19 +181,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -207,19 +207,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -240,19 +240,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -271,19 +271,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -299,19 +299,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -324,19 +324,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -352,19 +352,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -379,19 +379,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -406,19 +406,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -434,19 +434,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -461,19 +461,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -488,19 +488,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, @@ -513,19 +513,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -537,19 +537,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -561,19 +561,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -585,19 +585,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -608,19 +608,19 @@ export const indoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -652,19 +652,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -684,19 +684,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -716,19 +716,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -754,19 +754,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -793,19 +793,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -832,19 +832,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -864,19 +864,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -892,19 +892,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -920,19 +920,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -946,19 +946,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -975,19 +975,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -998,19 +998,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1021,19 +1021,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1046,19 +1046,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1071,19 +1071,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1096,19 +1096,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1121,19 +1121,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1146,19 +1146,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1171,19 +1171,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1196,19 +1196,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1220,19 +1220,19 @@ export const outdoor: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1246,19 +1246,19 @@ export const outdoor: NamedEntity[] = [ ], }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, @@ -1279,19 +1279,19 @@ export const outdoor: NamedEntity[] = [ ], }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1305,19 +1305,19 @@ export const outdoor: NamedEntity[] = [ ], }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1334,19 +1334,19 @@ export const outdoor: NamedEntity[] = [ ], }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] diff --git a/packages/broadway/src/parsers/music/database.ts b/packages/broadway/src/parsers/music/database.ts index 30d2ad8d..81c7afb5 100644 --- a/packages/broadway/src/parsers/music/database.ts +++ b/packages/broadway/src/parsers/music/database.ts @@ -11,19 +11,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -34,19 +34,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -59,19 +59,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -85,19 +85,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -111,19 +111,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } } ] \ No newline at end of file diff --git a/packages/broadway/src/parsers/shots/database.ts b/packages/broadway/src/parsers/shots/database.ts index e51eb7c7..664c2714 100644 --- a/packages/broadway/src/parsers/shots/database.ts +++ b/packages/broadway/src/parsers/shots/database.ts @@ -15,19 +15,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -38,19 +38,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -61,19 +61,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -84,19 +84,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -107,19 +107,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -131,19 +131,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -157,19 +157,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -181,19 +181,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -204,19 +204,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -227,19 +227,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -250,19 +250,19 @@ const shotTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -279,19 +279,19 @@ const cameraMovementTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -313,19 +313,19 @@ const cameraMovementTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -347,19 +347,19 @@ const cameraMovementTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -379,19 +379,19 @@ const cameraMovementTypes: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] diff --git a/packages/broadway/src/parsers/sounds/database.ts b/packages/broadway/src/parsers/sounds/database.ts index 818456f0..da799ce6 100644 --- a/packages/broadway/src/parsers/sounds/database.ts +++ b/packages/broadway/src/parsers/sounds/database.ts @@ -17,19 +17,19 @@ export const weatherSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], }, }, { @@ -43,19 +43,19 @@ export const weatherSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -68,19 +68,19 @@ export const weatherSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -93,19 +93,19 @@ export const weatherSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -134,19 +134,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -161,19 +161,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -184,19 +184,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -208,19 +208,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -232,19 +232,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -255,19 +255,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -278,19 +278,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -306,19 +306,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -332,19 +332,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -361,19 +361,19 @@ export const vehiclesSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } } ] @@ -388,19 +388,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -414,19 +414,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -439,19 +439,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -465,19 +465,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -490,19 +490,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -514,19 +514,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -541,19 +541,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -568,19 +568,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -602,19 +602,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -627,19 +627,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -652,19 +652,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -676,19 +676,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -700,19 +700,19 @@ export const animalSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -727,19 +727,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -752,19 +752,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -777,19 +777,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -803,19 +803,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -841,19 +841,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -870,19 +870,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -896,19 +896,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -920,19 +920,19 @@ export const placeSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } } ] @@ -951,19 +951,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -998,19 +998,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1023,19 +1023,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1048,19 +1048,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1072,19 +1072,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1099,19 +1099,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1128,19 +1128,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1160,19 +1160,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1186,19 +1186,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1214,19 +1214,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1239,19 +1239,19 @@ export const objectSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -1271,19 +1271,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1301,19 +1301,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1327,19 +1327,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1355,19 +1355,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1380,19 +1380,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1404,19 +1404,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1444,19 +1444,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, @@ -1472,19 +1472,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1509,19 +1509,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1532,19 +1532,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1558,19 +1558,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1584,19 +1584,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1607,19 +1607,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1630,19 +1630,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1654,19 +1654,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1679,19 +1679,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1710,19 +1710,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1736,19 +1736,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1761,19 +1761,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1784,19 +1784,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1807,19 +1807,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1830,19 +1830,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1855,19 +1855,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1879,19 +1879,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1903,19 +1903,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1927,19 +1927,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1951,19 +1951,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1975,19 +1975,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -1999,19 +1999,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2025,19 +2025,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2053,19 +2053,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2076,19 +2076,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2099,19 +2099,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2129,19 +2129,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2157,19 +2157,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2180,19 +2180,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2205,19 +2205,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2230,19 +2230,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2253,19 +2253,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2277,19 +2277,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2300,19 +2300,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2323,19 +2323,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2354,19 +2354,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2377,19 +2377,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2406,19 +2406,19 @@ export const actionSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] @@ -2436,19 +2436,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2462,19 +2462,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2490,19 +2490,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2515,19 +2515,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2541,19 +2541,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2568,19 +2568,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2592,19 +2592,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2618,19 +2618,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -2641,19 +2641,19 @@ export const eventSounds: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] diff --git a/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts b/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts index f87d57a7..b6bddc17 100644 --- a/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts +++ b/packages/broadway/src/parsers/utils/getParserItemFromLabel.ts @@ -11,19 +11,19 @@ export const getParserItemFromLabel = (database: NamedEntity[]) => { en: [] }, prompts: { - character: [], - transition: [], - location: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + TRANSITION: [], + LOCATION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } } @@ -39,19 +39,19 @@ export const getParserItemFromLabel = (database: NamedEntity[]) => { return { ...defaultEmptyItem, prompts: { - character: Array.isArray(prompts?.character) ? prompts.character : [], - transition: Array.isArray(prompts?.transition) ? prompts.transition : [], - location: Array.isArray(prompts?.location) ? prompts.location : [], - time: Array.isArray(prompts?.time) ? prompts.time : [], - era: Array.isArray(prompts?.era) ? prompts.era : [], - lighting: Array.isArray(prompts?.lighting) ? prompts.lighting : [], - weather: Array.isArray(prompts?.weather) ? prompts.weather : [], - action: Array.isArray(prompts?.action) ? prompts.action : [], - music: Array.isArray(prompts?.music) ? prompts.music : [], - sound: Array.isArray(prompts?.sound) ? prompts.sound : [], - dialogue: Array.isArray(prompts?.dialogue) ? prompts.dialogue : [], - style: Array.isArray(prompts?.style) ? prompts.style : [], - camera: Array.isArray(prompts?.camera) ? prompts.camera : [], + CHARACTER: Array.isArray(prompts?.CHARACTER) ? prompts.CHARACTER : [], + TRANSITION: Array.isArray(prompts?.TRANSITION) ? prompts.TRANSITION : [], + LOCATION: Array.isArray(prompts?.LOCATION) ? prompts.LOCATION : [], + TIME: Array.isArray(prompts?.TIME) ? prompts.TIME : [], + ERA: Array.isArray(prompts?.ERA) ? prompts.ERA : [], + LIGHTING: Array.isArray(prompts?.LIGHTING) ? prompts.LIGHTING : [], + WEATHER: Array.isArray(prompts?.WEATHER) ? prompts.WEATHER : [], + ACTION: Array.isArray(prompts?.ACTION) ? prompts.ACTION : [], + MUSIC: Array.isArray(prompts?.MUSIC) ? prompts.MUSIC : [], + SOUND: Array.isArray(prompts?.SOUND) ? prompts.SOUND : [], + DIALOGUE: Array.isArray(prompts?.DIALOGUE) ? prompts.DIALOGUE : [], + STYLE: Array.isArray(prompts?.STYLE) ? prompts.STYLE : [], + CAMERA: Array.isArray(prompts?.CAMERA) ? prompts.CAMERA : [], } } } diff --git a/packages/broadway/src/parsers/weather/database.ts b/packages/broadway/src/parsers/weather/database.ts index 2dd31b58..35477022 100644 --- a/packages/broadway/src/parsers/weather/database.ts +++ b/packages/broadway/src/parsers/weather/database.ts @@ -10,19 +10,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -38,19 +38,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -62,19 +62,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -88,19 +88,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -115,19 +115,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -141,19 +141,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, { @@ -167,19 +167,19 @@ export const data: NamedEntity[] = [ ] }, prompts: { - character: [], - location: [], - transition: [], - time: [], - era: [], - lighting: [], - weather: [], - action: [], - music: [], - sound: [], - dialogue: [], - style: [], - camera: [], + CHARACTER: [], + LOCATION: [], + TRANSITION: [], + TIME: [], + ERA: [], + LIGHTING: [], + WEATHER: [], + ACTION: [], + MUSIC: [], + SOUND: [], + DIALOGUE: [], + STYLE: [], + CAMERA: [], } }, ] \ No newline at end of file diff --git a/packages/broadway/src/types.ts b/packages/broadway/src/types.ts index ebc4f648..856d4547 100644 --- a/packages/broadway/src/types.ts +++ b/packages/broadway/src/types.ts @@ -8,7 +8,7 @@ export type NamedEntity = { } prompts: Omit< Record, - "splat" | "interface" | "event" | "phenomenon" | "mesh" | "depth" | "video" | "storyboard" | "generic" + "SPLAT" | "INTERFACE" | "EVENT" | "EFFECT" | "PHENOMENON" | "MESH" | "DEPTH" | "VIDEO" | "STORYBOARD" | "GENERIC" > } @@ -92,34 +92,6 @@ export type Screenplay = { sequences: ScreenplaySequence[] } -export type RenderedSceneStatus = -| "pending" // for retro-compatibility only, but this is deprecated -| "to_generate" -| "to_interpolate" -| "to_upscale" -| "completed" -| "error" - -export interface ImageSegment { - id: number - box: number[] - color: number[] - label: string - score: number -} - -export type RenderedScene = { - renderId: string - status: RenderedSceneStatus - assetUrl: string - durationInMs: number - alt: string - error: string - maskUrl: string - segments: ImageSegment[] -} - - // --- what is below is only used during analysis, but I think we this is obsolete --- export type AssetType = From 97917e45984d65f18a117531a94de3ac90dc8fa2 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 15:21:17 +0200 Subject: [PATCH 240/346] 0.1.1 --- packages/aitube-engine/bun.lockb | Bin 17622 -> 17619 bytes packages/aitube-engine/package.json | 11 ++++++----- .../src/prompts/getVideoPrompt.ts | 4 ++-- .../src/renderers/video/renderShotToVideo.ts | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index b39dfd1af668b50c8699032b98779ef8ecd49340..7fc0a9dd655ecddb27215c1044aabd8fd5a1dcd7 100755 GIT binary patch delta 4459 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 diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index d1420bdc..7b6d7007 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.26", + "version": "0.1.1", "description": "The engine powering AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -14,18 +14,19 @@ }, "devDependencies": { "bun-types": "latest", - "prettier": "^3.3.2", - "rimraf": "^5.0.7", - "typescript": "^5.5.2" + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.0.30" + "@aitube/clap": "0.1.1" }, "repository": { "type": "git", "url": "https://github.com/jbilcke-hf/aitube-engine.git" }, "keywords": [ + "Clapper.app", "OpenClap", "AI cinema", "AiTube" diff --git a/packages/aitube-engine/src/prompts/getVideoPrompt.ts b/packages/aitube-engine/src/prompts/getVideoPrompt.ts index aa4f3640..f5724e3d 100644 --- a/packages/aitube-engine/src/prompts/getVideoPrompt.ts +++ b/packages/aitube-engine/src/prompts/getVideoPrompt.ts @@ -50,8 +50,8 @@ export function getVideoPrompt( // this step is *SUPER* important, it determines the order of the prompt! tmp.sort((segment1, segment2) => { - const priority1 = segmentCategoryPromptPriority[segment1.category || segmentCategoryPromptPriority.generic] || 0 - const priority2 = segmentCategoryPromptPriority[segment2.category || segmentCategoryPromptPriority.generic] || 0 + const priority1 = segmentCategoryPromptPriority[segment1.category || segmentCategoryPromptPriority.GENERIC] || 0 + const priority2 = segmentCategoryPromptPriority[segment2.category || segmentCategoryPromptPriority.GENERIC] || 0 return priority2 - priority1 }) diff --git a/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts b/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts index a9a3afd8..a9da4076 100644 --- a/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts +++ b/packages/aitube-engine/src/renderers/video/renderShotToVideo.ts @@ -191,7 +191,7 @@ export async function renderShotToVideo({ //---------- if ( shotStoryboardSegment && - (!shotStoryboardSegment.assetUrl || shotStoryboardSegment.status === "to_generate") + (!shotStoryboardSegment.assetUrl || shotStoryboardSegment.status === ClapSegmentStatus.TO_GENERATE) ) { if (debug) { console.log(`[@aitube-engine/renderShotToVideo] generating a missing storyboard asset`) } From d1a87e0f07073834f3c0a5365e3c86fd5893eaf0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 15:26:34 +0200 Subject: [PATCH 241/346] 0.1.1 --- packages/aitube-timeline/bun.lockb | Bin 160564 -> 162062 bytes packages/aitube-timeline/package.json | 24 +++++++++--------- .../aitube-timeline/src/constants/themes.ts | 1 + .../aitube-timeline/src/hooks/useTimeline.ts | 4 +-- .../src/utils/getFinalVideo.ts | 4 +-- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index 45d628636016be006b38d893a7754f227118034f..fc4135aa1a2f0ccb52349a185bc7e7b56ad21a3b 100755 GIT binary patch delta 36707 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 A2LJ#7 delta 35606 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 HN$39yzIh_8 diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index d23b484f..5544fef8 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.46", + "version": "0.1.1", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -18,20 +18,20 @@ "devDependencies": { "@types/react": "*", "@types/react-dom": "*", - "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.12.0", - "@vitejs/plugin-react": "^4.3.0", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitejs/plugin-react": "^4.3.1", "bun-types": "latest", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-react-refresh": "^0.4.7", - "prettier": "^3.3.2", - "rimraf": "^5.0.7", - "typescript": "^5.5.3", - "vite": "^5.2.13" + "eslint-plugin-react-refresh": "^0.4.9", + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typescript": "^5.5.4", + "vite": "^5.3.4" }, "peerDependencies": { - "@aitube/clap": "0.0.30", + "@aitube/clap": "0.1.1", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", @@ -40,8 +40,8 @@ "clsx": "^2.1.1", "react": "*", "react-dom": "*", - "tailwind-merge": "^2.3.0", - "tailwindcss": "^3.4.3", + "tailwind-merge": "^2.4.0", + "tailwindcss": "^3.4.6", "three": "^0.164.1", "zustand": "4.5.2" }, diff --git a/packages/aitube-timeline/src/constants/themes.ts b/packages/aitube-timeline/src/constants/themes.ts index d0970af9..74b8364c 100644 --- a/packages/aitube-timeline/src/constants/themes.ts +++ b/packages/aitube-timeline/src/constants/themes.ts @@ -11,6 +11,7 @@ export const baseClapSegmentCategoryColors: ClapSegmentCategoryColors = { [ClapSegmentCategory.MESH]: { hue: 32, saturation: 30, lightness: 78.6 }, [ClapSegmentCategory.DEPTH]: { hue: 242, saturation: 30, lightness: 78.6 }, [ClapSegmentCategory.EVENT]: { hue: 270, saturation: 30, lightness: 78.6 }, + [ClapSegmentCategory.EFFECT]: { hue: 270, saturation: 30, lightness: 78.6 }, [ClapSegmentCategory.INTERFACE]: { hue: 216, saturation: 30, lightness: 78.6 }, [ClapSegmentCategory.PHENOMENON]: { hue: 270, saturation: 30, lightness: 78.6 }, [ClapSegmentCategory.VIDEO]: { hue: 70, saturation: 30, lightness: 78.6 }, diff --git a/packages/aitube-timeline/src/hooks/useTimeline.ts b/packages/aitube-timeline/src/hooks/useTimeline.ts index 6a7cf545..3e361059 100644 --- a/packages/aitube-timeline/src/hooks/useTimeline.ts +++ b/packages/aitube-timeline/src/hooks/useTimeline.ts @@ -278,8 +278,8 @@ export const useTimeline = create((set, get) => ({ let baseHue = 0 - let baseSaturation = theme.cell.categoryColors.generic.saturation - let baseLightness = theme.cell.categoryColors.generic.lightness + let baseSaturation = theme.cell.categoryColors.GENERIC.saturation + let baseLightness = theme.cell.categoryColors.GENERIC.lightness let backgroundColorSaturation = (segment.isSelected ? 2.2 : 1.4) * baseSaturation let backgroundColorHoverSaturation = (segment.isSelected ? 2.2 : 1.8) * baseSaturation diff --git a/packages/aitube-timeline/src/utils/getFinalVideo.ts b/packages/aitube-timeline/src/utils/getFinalVideo.ts index 4c06a5c4..0e20ce62 100644 --- a/packages/aitube-timeline/src/utils/getFinalVideo.ts +++ b/packages/aitube-timeline/src/utils/getFinalVideo.ts @@ -1,4 +1,4 @@ -import { ClapProject, ClapSegment, ClapSegmentCategory } from "@aitube/clap" +import { ClapProject, ClapSegment, ClapSegmentCategory, ClapSegmentStatus } from "@aitube/clap" import { TimelineSegment } from "@/types" import { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" @@ -6,7 +6,7 @@ import { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" export async function getFinalVideo(clap: ClapProject): Promise { const alreadyAnEmbeddedFinalVideo: ClapSegment | undefined = clap.segments.filter(s => s.category === ClapSegmentCategory.VIDEO && - s.status === "completed" && + s.status === ClapSegmentStatus.COMPLETED && s.startTimeInMs === 0 && s.endTimeInMs === clap.meta.durationInMs && s.assetUrl).at(0) From 79411fd7b8dc51b690c6ee83ee644b3e8800ce93 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 15:31:15 +0200 Subject: [PATCH 242/346] 0.1.1 --- packages/aitube-clapper-services/bun.lockb | Bin 87703 -> 89692 bytes packages/aitube-clapper-services/package.json | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index ac21404840e298a4502d50929d0a5de7e97b379d..f204b592a3276720616cd204ac997f367dd8b48f 100755 GIT binary patch delta 15481 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 delta 14268 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 RGeW-Fg$3{XW(b?k{s+h%Y_b3V diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 9ec9c6f4..ef976c81 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.35", + "version": "0.1.1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -16,13 +16,13 @@ "@types/react": "*", "@types/react-dom": "*", "bun-types": "latest", - "prettier": "^3.3.2", - "rimraf": "^5.0.7", - "typescript": "^5.5.3" + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.0.30", - "@aitube/timeline": "0.0.45", + "@aitube/clap": "0.1.1", + "@aitube/timeline": "0.1.1", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From a2835fd73d31929f09ea62547dd2db09bb2432fe Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 16:14:42 +0200 Subject: [PATCH 243/346] 0.1.2 --- packages/aitube-clap/package.json | 2 +- .../aitube-clap/src/factories/newSegment.ts | 1 + .../src/sanitizers/sanitizeSegment.ts | 2 + packages/aitube-clap/src/types.ts | 92 +++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/packages/aitube-clap/package.json b/packages/aitube-clap/package.json index a251d957..b9cfdcd1 100644 --- a/packages/aitube-clap/package.json +++ b/packages/aitube-clap/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.1", + "version": "0.1.2", "description": "Types and helpers to manipulate .clap files", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=yaml && bun run build:declaration", diff --git a/packages/aitube-clap/src/factories/newSegment.ts b/packages/aitube-clap/src/factories/newSegment.ts index 3809135d..408c8ca6 100644 --- a/packages/aitube-clap/src/factories/newSegment.ts +++ b/packages/aitube-clap/src/factories/newSegment.ts @@ -29,6 +29,7 @@ export function newSegment(maybeSegment?: Partial) { endTimeInMs, category: parseSegmentCategory(maybeSegment?.category), entityId: typeof maybeSegment?.entityId === "string" ? maybeSegment.entityId : "", + workflowId: typeof maybeSegment?.workflowId === "string" ? maybeSegment.workflowId : "", sceneId: typeof maybeSegment?.sceneId === "string" ? maybeSegment.sceneId : "", startTimeInLines: isValidNumber(maybeSegment?.startTimeInLines) ? (maybeSegment?.startTimeInLines || 0) : 0, endTimeInLines: isValidNumber(maybeSegment?.endTimeInLines) ? (maybeSegment?.endTimeInLines || 0) : 0, diff --git a/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts b/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts index 14bb76b6..852d7a65 100644 --- a/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts +++ b/packages/aitube-clap/src/sanitizers/sanitizeSegment.ts @@ -8,6 +8,7 @@ export function sanitizeSegment({ endTimeInMs, category, entityId, + workflowId, sceneId, startTimeInLines, endTimeInLines, @@ -34,6 +35,7 @@ export function sanitizeSegment({ endTimeInMs: isValidNumber(assetDurationInMs) ? (endTimeInMs || 0) : 0, category: parseSegmentCategory(category), entityId: typeof entityId === "string" ? entityId : "", + workflowId: typeof workflowId === "string" ? workflowId : "", sceneId: typeof sceneId === "string" ? sceneId : "", startTimeInLines: isValidNumber(startTimeInLines) ? (startTimeInLines || 0) : 0, endTimeInLines: isValidNumber(endTimeInLines) ? (endTimeInLines || 0) : 0, diff --git a/packages/aitube-clap/src/types.ts b/packages/aitube-clap/src/types.ts index 58e8111f..3aefc7ff 100644 --- a/packages/aitube-clap/src/types.ts +++ b/packages/aitube-clap/src/types.ts @@ -314,16 +314,98 @@ export type ClapSegment = { startTimeInMs: number endTimeInMs: number category: ClapSegmentCategory + + /** + * ID of the entity attached to the segment + * + * This allows segments of different nature (image, voice) to be attached to the same or different entities. + * + * Eg. video of character A but voice of character B + * + * If you want multiple entities, you can add multiple segments. + */ entityId: string + + /** + * ID of the workflow to use for the segment + * + * This is optional (empty string by default) + * + * If unspecified, a default workflow will be used + */ + workflowId: string + + /** + * Id of the scene to which the segment is attached + * + * This is optional (empty string by default) + */ sceneId: string + + /** + * Statring line number to which the segment is attached + * + * This is optional (empty string by default) + */ startTimeInLines: number + + /** + * Ending line number to which the segment is attached + * + * This is optional (empty string by default) + */ endTimeInLines: number + + /** + * + */ prompt: string + + /** + * Human-readable label to showfor this segment. + * + * Should be kept short. + */ label: string + outputType: ClapOutputType + + /** + * Id of an external rendering job to which this segment could be attached. + * + * This is optional (empty string by default) + * + * It is possible that this field gets removed in the future, + * and instead moved to TimelineSegment + */ renderId: string + + /** + * Status of the segment (is it generated, to generate etc) + */ status: ClapSegmentStatus + + /** + * The value of the segment, ie. the data + * + * It can come from the output of a workflow. + * + * This can be either a link to a remotely hosted resource, + * a file path or a data URI (base64) + * + * I recommend the data URI for small projects, + * as the other modes create additional complexity + * (manage a cloud, access rights, deletes, downloads etc) + */ assetUrl: string + + /** + * The duration of the asset itself. + * + * This might be different from the segment itself, + * for instance if the asset has a zero length (a storyboard), + * or if the asset is longer (eg. a cropped audio file) + */ assetDurationInMs: number assetSourceType: ClapAssetSource assetFileFormat: string @@ -338,7 +420,17 @@ export type ClapSegment = { editedBy: ClapAuthor + /** + * The volume of the segment + */ outputGain: number + + /** + * The seed used to generate the asset data/value. + * + * This is mostly used fo tracking changes, + * and reproduce result + */ seed: number } From 11087e7912e3b9976fd5774c195fafdc6433e9be Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 16:16:03 +0200 Subject: [PATCH 244/346] 0.1.2 --- packages/aitube-colors/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-colors/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-colors/bun.lockb b/packages/aitube-colors/bun.lockb index 307c8dc536539a574a029d7e8c7c5835b80dbfd5..cac769aa2dee64910af1d533eaa8ce1cd459a521 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rUN1u8gQf$oMCAA?d7!h$QrIbi66;5h-G|z#0hZC+u}+glMzfAVClTGP55sq!Ix#v&2IW0iu6DuK)l5 delta 138 zcmV;50CoS7z0gx^rz5fHi$e*tTB=ddn*Fw%q`qU#5EnMHvOk2+x`1=eRu} Date: Wed, 24 Jul 2024 16:18:02 +0200 Subject: [PATCH 245/346] 0.1.2 --- packages/aitube-engine/bun.lockb | Bin 17619 -> 17619 bytes packages/aitube-engine/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 7fc0a9dd655ecddb27215c1044aabd8fd5a1dcd7..38769008567343970a7700a70dcfbb8b7224890b 100755 GIT binary patch delta 138 zcmV;50CoS7z0gx^rUN1u8gQf$oMCAA?d7!h$QrIbi66;5h-G|z#0hZC+u}+glMzfAVClTGP55sq!Ix#v&2IW0iu6DuK)l5 delta 138 zcmV;50CoS7z0gx^rz5fHi$e*tTB=ddn*Fw%q`qU#5EnMHvOk2+x`1=eRu} Date: Wed, 24 Jul 2024 16:19:25 +0200 Subject: [PATCH 246/346] 0.1.2 --- packages/broadway/bun.lockb | Bin 33915 -> 33915 bytes packages/broadway/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/broadway/bun.lockb b/packages/broadway/bun.lockb index 553d891bde4fddf863c199742518a28c3b63ebc2..3fad03e9740953d62939c6a7fe38576f368d24cf 100755 GIT binary patch delta 257 zcmV+c0sj8`hyweF0+22s3!_6IknW#xY0B}Nf|@v;YlWd6atr-<{_z?{BE=#Qu}%sb zlNbyzlZYD-lNbyzv&b6-BS3lwpc-)T$(Qk##0A3a;9Bdy9OvWSKgmJ22Dua>*jWt6 zuqo*%d(O=HF6|jseOuw1MP!=>i~I)%B1k{<9+s00KNvtzeHGV0#H)BE zBM(|WEAtc&Shg$0shL*v@HV=ael6og(sC8AjD`#Mzn#>ffZ~-e_rWx3IQ^+D`!g_lOlE?la_-RlOlE? Hlg@*!REcbj delta 257 zcmV+c0sj8`hyweF0+22sCziF-$0yv&(uPWXKU}-P^xit|>G4xd+P@66WeWx3IQ>*D`!g_lTvjcla_-RlTvjc Hlg@*!)wFD> diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 5430ae70..c5ea27b4 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.1", + "version": "0.1.2", "description": "Convert a script to a clap file", "scripts": { "test": "bun test --preload ./src/tests/setup.js", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.1.1", - "@aitube/colors": "0.1.1" + "@aitube/clap": "0.1.2", + "@aitube/colors": "0.1.2" }, "repository": { "type": "git", From 08fa141ddde54e45c82e9cf5354f2728d21e61a0 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 16:21:15 +0200 Subject: [PATCH 247/346] 0.1.2 --- packages/aitube-timeline/bun.lockb | Bin 162062 -> 162062 bytes packages/aitube-timeline/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb index fc4135aa1a2f0ccb52349a185bc7e7b56ad21a3b..1fe3372cba6536dfe5708d339e27ab1654464530 100755 GIT binary patch delta 140 zcmV;70CWG2@(GUe36L%zPJXsS^VkEGK{DiP*gm_w^kpO!0a8Flo7f{rkP+glM<@C;>5r0W!BQt^xna0Wy~_cmm&tdqAfE delta 140 zcmV;70CWG2@(GUe36L%ztZ1GC0fA>`QY)Qa*KBs<;8rP9mEKIo#DF#mF0y8Uu}<26 zlPD`Nvsi&;r$EfAHys4b+Cn8wI~hx}5r0Wr5Pt^xna0Wp^^cmm%%kv=^D diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 5544fef8..7ce1bdf6 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.1", + "version": "0.1.2", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", @@ -31,7 +31,7 @@ "vite": "^5.3.4" }, "peerDependencies": { - "@aitube/clap": "0.1.1", + "@aitube/clap": "0.1.2", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", From 37cf812f8ac199fd5c8573704e3d318ef72a7b95 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Wed, 24 Jul 2024 16:22:50 +0200 Subject: [PATCH 248/346] 0.1.2 --- packages/aitube-client/bun.lockb | Bin 19102 -> 19099 bytes packages/aitube-client/package.json | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 5992a8db394d74044f359006cd1256e7969a17ac..5d5d5aeec18388197fc46a4bc608ff60b66e691f 100755 GIT binary patch delta 4580 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 delta 4675 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 Date: Wed, 24 Jul 2024 16:43:47 +0200 Subject: [PATCH 249/346] 0.1.2 --- packages/aitube-clapper-services/bun.lockb | Bin 89692 -> 89692 bytes packages/aitube-clapper-services/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index f204b592a3276720616cd204ac997f367dd8b48f..529e2ab024682b2d322f4c222b27123f949bcae9 100755 GIT binary patch delta 253 zcmVNM6TBl0 zI~XZAhzGC);zD7fhjpWIv=H*QM|>fm#8z5>uwmS@rD`ZSKu~=Z*FeOpcqQZuvnc{W zz(*qwT0SfD6c1RoE5)gqR`l>Tx|e<}<3-YP6|anj3-`aB)S-all`r?jvV5k5XtNEZ zaZ3R*lYj3S0W!0h?>PtoGPBe7STX@Jw=60Fi82Z@E_7#laCLHJEtla&0Ux*CTmgOo Dm4a;_ delta 253 zcmVf_?o;jVfrD`ZSK+LK)9R$qULM2T*8B4R{ z`gSem7BA8qlR|fXWPtoF|*V6STX@Iw=60Fi82Z?E_7#laCLHJEtla&0Ux*CTmgOo D^EYlp diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index ef976c81..7cd9fe47 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.1", + "version": "0.1.2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -21,8 +21,8 @@ "typescript": "^5.5.4" }, "peerDependencies": { - "@aitube/clap": "0.1.1", - "@aitube/timeline": "0.1.1", + "@aitube/clap": "0.1.2", + "@aitube/timeline": "0.1.2", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From ce044584d1257e8a3e2b7916333cb30278a21599 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 25 Jul 2024 01:09:35 +0200 Subject: [PATCH 250/346] 0.1.2-0 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/editors.ts | 3 ++- packages/aitube-clapper-services/src/index.ts | 7 +++++++ packages/aitube-clapper-services/src/services.ts | 3 +++ .../aitube-clapper-services/src/workflow-editor.ts | 13 +++++++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 packages/aitube-clapper-services/src/workflow-editor.ts diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 7cd9fe47..d8445404 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2", + "version": "0.1.2-0", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/editors.ts b/packages/aitube-clapper-services/src/editors.ts index 91f89536..64b26b03 100644 --- a/packages/aitube-clapper-services/src/editors.ts +++ b/packages/aitube-clapper-services/src/editors.ts @@ -3,7 +3,8 @@ export enum EditorView { SCRIPT = "SCRIPT", ENTITY = "ENTITY", SEGMENT = "SEGMENT", - HISTORY = "HISTORY" + HISTORY = "HISTORY", + WORKFLOW = "WORKFLOW", } export type EditorsState = { diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index eaf21a5f..ec0e2ccb 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -50,6 +50,7 @@ export { SegmentEditorService, EntityEditorService, ScriptEditorService, + WorkflowEditorService, EditorsService, MonitorService, RendererService, @@ -91,6 +92,12 @@ export { SegmentEditorStore } from "./segment-editor" +export { + WorkflowEditorState, + WorkflowEditorControls, + WorkflowEditorStore +} from "./workflow-editor" + export { EditorView, EditorsState, diff --git a/packages/aitube-clapper-services/src/services.ts b/packages/aitube-clapper-services/src/services.ts index 3ac886d8..a67aaafa 100644 --- a/packages/aitube-clapper-services/src/services.ts +++ b/packages/aitube-clapper-services/src/services.ts @@ -8,6 +8,7 @@ import { SegmentEditorStore } from "./segment-editor" import { EntityEditorStore } from "./entity-editor" import { ProjectEditorStore } from "./project-editor" import { ScriptEditorStore } from "./script-editor" +import { WorkflowEditorStore } from "./workflow-editor" import { EditorsStore } from "./editors" import { MonitorStore } from "./monitor" import { RendererStore } from "./renderer" @@ -28,6 +29,7 @@ export type SegmentEditorService = UseBoundStore> export type EntityEditorService = UseBoundStore> export type ProjectEditorService = UseBoundStore> export type ScriptEditorService = UseBoundStore> +export type WorkflowEditorService = UseBoundStore> export type EditorsService = UseBoundStore> export type MonitorService = UseBoundStore> export type RendererService = UseBoundStore> @@ -56,6 +58,7 @@ export type PublicServices = { entityEditor: EntityEditorService projectEditor: ProjectEditorService scriptEditor: ScriptEditorService + workflowEditor: WorkflowEditorService editors: EditorsService monitor: MonitorService timeline: TimelineService diff --git a/packages/aitube-clapper-services/src/workflow-editor.ts b/packages/aitube-clapper-services/src/workflow-editor.ts new file mode 100644 index 00000000..cf4d79de --- /dev/null +++ b/packages/aitube-clapper-services/src/workflow-editor.ts @@ -0,0 +1,13 @@ +import { ClapWorkflow } from "@aitube/clap" + +import { VersionControls, VersionedState } from "./version-control" + +export type WorkflowEditorState = { + +} & VersionedState + +export type WorkflowEditorControls = { + +} & VersionControls + +export type WorkflowEditorStore = WorkflowEditorState & WorkflowEditorControls From 914cc98d9218617d4164cc145b1f500ddeb33fdf Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 25 Jul 2024 18:14:27 +0200 Subject: [PATCH 251/346] fix compatibility with older items --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/utils/getFinalVideo.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 7ce1bdf6..7cdb3ef5 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2", + "version": "0.1.2-0", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/utils/getFinalVideo.ts b/packages/aitube-timeline/src/utils/getFinalVideo.ts index 0e20ce62..da182294 100644 --- a/packages/aitube-timeline/src/utils/getFinalVideo.ts +++ b/packages/aitube-timeline/src/utils/getFinalVideo.ts @@ -5,8 +5,8 @@ import { clapSegmentToTimelineSegment } from "./clapSegmentToTimelineSegment" export async function getFinalVideo(clap: ClapProject): Promise { const alreadyAnEmbeddedFinalVideo: ClapSegment | undefined = clap.segments.filter(s => - s.category === ClapSegmentCategory.VIDEO && - s.status === ClapSegmentStatus.COMPLETED && + s.category.toUpperCase() === ClapSegmentCategory.VIDEO && + s.status.toUpperCase() === ClapSegmentStatus.COMPLETED && s.startTimeInMs === 0 && s.endTimeInMs === clap.meta.durationInMs && s.assetUrl).at(0) From be2a9670fa6ec307508162101d4e167e05f66ae6 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Thu, 25 Jul 2024 18:17:01 +0200 Subject: [PATCH 252/346] 0.1.2-1 --- packages/aitube-clapper-services/bun.lockb | Bin 89692 -> 89694 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 529e2ab024682b2d322f4c222b27123f949bcae9..1596490b7bd7c109985aedabd2f11ac80d928fc3 100755 GIT binary patch delta 5738 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 WKSC@Wxd|jnqe)Bdn43gM%Krk6aj@I~ delta 5710 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 diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index d8445404..6f98395a 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-0", + "version": "0.1.2-1", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", @@ -22,7 +22,7 @@ }, "peerDependencies": { "@aitube/clap": "0.1.2", - "@aitube/timeline": "0.1.2", + "@aitube/timeline": "0.1.2-0", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", From 8bbb85d9810e14cefe7f1ee6dd823be0a3651631 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Fri, 26 Jul 2024 12:35:55 +0200 Subject: [PATCH 253/346] 0.1.2-2 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 3 ++- packages/aitube-clapper-services/src/ui.ts | 3 +++ .../src/workflow-editor.ts | 15 +++++++++++++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 6f98395a..97d19026 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-1", + "version": "0.1.2-2", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index ec0e2ccb..83a55081 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -95,7 +95,8 @@ export { export { WorkflowEditorState, WorkflowEditorControls, - WorkflowEditorStore + WorkflowEditorStore, + WorkflowEditorTheme } from "./workflow-editor" export { diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 6f7d0ab3..65ea4e85 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -1,6 +1,7 @@ import { ClapTimelineTheme } from "@aitube/timeline" import { SettingsCategory } from "./base-types" import { ProjectCreationWizardStep } from "./types" +import { WorkflowEditorTheme } from "./workflow-editor" export type UIThemeName = "lavender" | "backstage" | "midnight" | "mythril" | "flix" | "lore" | "mocha" | string @@ -48,6 +49,8 @@ export type UITheme = { assistantRobotTextColor?: string timeline: ClapTimelineTheme + + workflow: WorkflowEditorTheme } export type UIState = { diff --git a/packages/aitube-clapper-services/src/workflow-editor.ts b/packages/aitube-clapper-services/src/workflow-editor.ts index cf4d79de..62cf7f9a 100644 --- a/packages/aitube-clapper-services/src/workflow-editor.ts +++ b/packages/aitube-clapper-services/src/workflow-editor.ts @@ -2,6 +2,21 @@ import { ClapWorkflow } from "@aitube/clap" import { VersionControls, VersionedState } from "./version-control" +export type WorkflowEditorTheme = { + bgColor?: string; + node: { + bgColor?: string; + borderColor?: string; + textPrimaryColor?: string; + textSecondaryColor?: string; + radius?: string; + } + handle: { + inputColor?: string; + outputColor?: string; + } +} + export type WorkflowEditorState = { } & VersionedState From 905c2344cbd54d8fb3b8492cff58ea5a6837960b Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 27 Jul 2024 12:38:41 +0200 Subject: [PATCH 254/346] add colorMore and input radius --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 1 + packages/aitube-clapper-services/src/ui.ts | 21 ++++++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 97d19026..c6d91cb5 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-2", + "version": "0.1.2-3", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index 83a55081..b42c040d 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -185,6 +185,7 @@ export { } from "./types" export { + UIThemeColorMode, UIThemeName, UITheme, UIStore, diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 65ea4e85..8e61825c 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -3,7 +3,23 @@ import { SettingsCategory } from "./base-types" import { ProjectCreationWizardStep } from "./types" import { WorkflowEditorTheme } from "./workflow-editor" -export type UIThemeName = "lavender" | "backstage" | "midnight" | "mythril" | "flix" | "lore" | "mocha" | string +export type UIThemeName = + | 'backstage' + | 'midnight' + | 'lavender' + | 'flix' + | 'lore' + | 'gordon' + | 'ripley' + | 'silent' + | string + +// Tailwind and React Flow expect a color mode in lowercase, +// so we just leave it that way +export enum UIThemeColorMode { + DARK = "dark", + LIGHT = "light" +} /** * TODO: @@ -20,6 +36,7 @@ export type UIThemeName = "lavender" | "backstage" | "midnight" | "mythril" | "f */ export type UITheme = { id: UIThemeName + colorMode: UIThemeColorMode label: string author: string description: string @@ -48,6 +65,8 @@ export type UITheme = { assistantUserTextColor?: string assistantRobotTextColor?: string + formInputRadius: number + timeline: ClapTimelineTheme workflow: WorkflowEditorTheme From 7211536ed4a6713a62a17e0eb71dc8e2f83af979 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 27 Jul 2024 12:44:05 +0200 Subject: [PATCH 255/346] fix the type --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/ui.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index c6d91cb5..56ed5497 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-3", + "version": "0.1.2-4", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index 8e61825c..a39a2190 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -65,8 +65,8 @@ export type UITheme = { assistantUserTextColor?: string assistantRobotTextColor?: string - formInputRadius: number - + formInputRadius: string + timeline: ClapTimelineTheme workflow: WorkflowEditorTheme From 82288e894411c7eaafde395cf9a64738506c14ef Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 28 Jul 2024 16:20:42 +0200 Subject: [PATCH 256/346] ui window layout --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/index.ts | 3 ++- packages/aitube-clapper-services/src/ui.ts | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 56ed5497..0f50c3fa 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-4", + "version": "0.1.2-5", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/index.ts b/packages/aitube-clapper-services/src/index.ts index b42c040d..5687f0ac 100644 --- a/packages/aitube-clapper-services/src/index.ts +++ b/packages/aitube-clapper-services/src/index.ts @@ -190,7 +190,8 @@ export { UITheme, UIStore, UIState, - UIControls + UIControls, + UIWindowLayout } from "./ui" export { diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index a39a2190..f532895a 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -72,6 +72,11 @@ export type UITheme = { workflow: WorkflowEditorTheme } +export enum UIWindowLayout { + GRID = "GRID", + FLYING = "FLYING" +} + export type UIState = { isTopMenuOpen: boolean showWelcomeScreen: boolean @@ -88,6 +93,8 @@ export type UIState = { followCursor: boolean editorFontSize: number + windowLayout: UIWindowLayout + projectCreationWizardStep: ProjectCreationWizardStep } @@ -110,6 +117,7 @@ export type UIControls = { setShowFPS: (showFPS: boolean) => void setFollowCursor: (followCursor: boolean) => void setEditorFontSize: (editorFontSize: number) => void + setWindowLayout: (windowLayout: UIWindowLayout) => void setProjectCreationWizardStep: (projectCreationWizardStep: ProjectCreationWizardStep) => void } From f01e51394bc7b0ed597ae0587ff2f542a5092f66 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 28 Jul 2024 18:06:10 +0200 Subject: [PATCH 257/346] 0.1.2-6 --- packages/aitube-clapper-services/package.json | 2 +- packages/aitube-clapper-services/src/ui.ts | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/aitube-clapper-services/package.json b/packages/aitube-clapper-services/package.json index 0f50c3fa..76e54073 100644 --- a/packages/aitube-clapper-services/package.json +++ b/packages/aitube-clapper-services/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-5", + "version": "0.1.2-6", "description": "Base types for Clapper services", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/timeline --external=@monaco-editor/react --external=monaco-editor --external=zustand --external=react --external=react-dom && bun run build:declaration", diff --git a/packages/aitube-clapper-services/src/ui.ts b/packages/aitube-clapper-services/src/ui.ts index f532895a..5359bbfe 100644 --- a/packages/aitube-clapper-services/src/ui.ts +++ b/packages/aitube-clapper-services/src/ui.ts @@ -40,6 +40,9 @@ export type UITheme = { label: string author: string description: string + + wallpaperBgImage?: string + defaultBgColor?: string defaultTextColor?: string defaultPrimaryColor?: string @@ -65,7 +68,12 @@ export type UITheme = { assistantUserTextColor?: string assistantRobotTextColor?: string - formInputRadius: string + formInputRadius?: string + + windowHeaderBgColor?: string + windowBodyBgColor?: string + windowBorderColor?: string + windowBorderRadius?: string timeline: ClapTimelineTheme @@ -94,7 +102,6 @@ export type UIState = { editorFontSize: number windowLayout: UIWindowLayout - projectCreationWizardStep: ProjectCreationWizardStep } From 48aa92556610ebaac35bd8ceac755d442bef6115 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 28 Jul 2024 18:20:18 +0200 Subject: [PATCH 258/346] 0.1.2-1 --- packages/aitube-timeline/package.json | 2 +- .../src/components/timeline/TopBarTimeScale.tsx | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 7cdb3ef5..03cecab8 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-0", + "version": "0.1.2-1", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx index 5af2c707..76250c3b 100644 --- a/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx +++ b/packages/aitube-timeline/src/components/timeline/TopBarTimeScale.tsx @@ -6,7 +6,6 @@ import { useTimeline } from "@/hooks" -import { hslToHex } from "@/utils" import { useTimeScaleGraduations } from "@/hooks/useTimeScaleGraduations" import { DEFAULT_DURATION_IN_MS_PER_STEP, NB_MAX_SHOTS } from "@/constants/grid" import { formatTimestamp } from "@/utils/formatTimestamp" @@ -20,6 +19,10 @@ export function TopBarTimeScale() { const jumpAt = useTimeline(s => s.jumpAt) const togglePlayback = useTimeline(s => s.togglePlayback) const theme = useTimeline(s => s.theme) + const isEmpty = useTimeline(s => s.isEmpty) + + // right now empty means disabled, but in the future we might use other things + const isDisabled = isEmpty; const wasPlayingRef = useRef(undefined) @@ -50,6 +53,8 @@ export function TopBarTimeScale() { // it can be annoying to have to be exactly on the right top bar track when dragging the cursor // to improve the UX, we allow the user to move the mouse ANYWHERE on the screen while doing so useEffect(() => { + if (isDisabled) { return; } // Don't add event listeners if the component is empty + const onMouseMove = (evt: MouseEvent) => { const { isDraggingCursor, @@ -89,7 +94,7 @@ export function TopBarTimeScale() { return () => { document.removeEventListener("mousemove", onMouseMove) } - }, []) + }, [isDisabled]) // console.log("contentWidth:", contentWidth) // console.log("NB_MAX_SHOTS * cellWidth:", NB_MAX_SHOTS * cellWidth) @@ -117,6 +122,8 @@ export function TopBarTimeScale() { // we need to set the color here to create a sticky overlay attach="material" color={theme.topBarTimeScale.backgroundColor} + opacity={isDisabled ? 0.5 : 1} + transparent={true} /> @@ -206,6 +213,7 @@ export function TopBarTimeScale() { theme.topBarTimeScale.backgroundColor, theme.topBarTimeScale.lineColor, theme.topBarTimeScale.textColor, + isDisabled, ]) return ( @@ -218,7 +226,7 @@ export function TopBarTimeScale() { // just a trick position={[0, 0, -3]} onWheel={(e) => { - if (e.offsetY > topBarTimeScaleHeight) { return } + if (isDisabled || e.offsetY > topBarTimeScaleHeight) { return } const disableWheel = true if (disableWheel) { @@ -238,6 +246,7 @@ export function TopBarTimeScale() { return false }} onPointerDown={(e) => { + if (isDisabled) { return } const cursorX = e.point.x + (size.width / 2) const cursorTimestampAtInMs = (cursorX / cellWidth) * DEFAULT_DURATION_IN_MS_PER_STEP const { wasPlaying } = togglePlayback(false) @@ -249,6 +258,7 @@ export function TopBarTimeScale() { return false }} onPointerUp={(e) => { + if (isDisabled) { return } setIsDraggingCursor(false) if (typeof wasPlayingRef.current === "boolean") { if (wasPlayingRef.current) { @@ -259,6 +269,7 @@ export function TopBarTimeScale() { return false }} onPointerMove={e => { + if (isDisabled) { return } // TODO move this into the whole parent container? // the problem is.. are we still gonna get events From fea23b4256e8156166786b2d14e9023b0dac6d8a Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 28 Jul 2024 18:21:37 +0200 Subject: [PATCH 259/346] 0.1.2-7 --- packages/aitube-clapper-services/bun.lockb | Bin 89694 -> 89187 bytes packages/aitube-clapper-services/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-clapper-services/bun.lockb b/packages/aitube-clapper-services/bun.lockb index 1596490b7bd7c109985aedabd2f11ac80d928fc3..97023127956bdacf79aef80882355025df4d8075 100755 GIT binary patch delta 4078 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 Date: Mon, 29 Jul 2024 13:32:33 +0200 Subject: [PATCH 260/346] fix drag issue when in windowed mode --- packages/aitube-timeline/package.json | 2 +- packages/aitube-timeline/src/ClapTimeline.tsx | 14 +++++++------- .../src/components/timeline/TopBarTimeScale.tsx | 10 +++++++--- .../aitube-timeline/src/hooks/useSegmentLoader.ts | 2 +- packages/aitube-timeline/src/hooks/useTimeline.ts | 3 +++ packages/aitube-timeline/src/types/timeline.ts | 7 +++---- .../aitube-timeline/src/utils/getDefaultState.ts | 6 ++---- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/packages/aitube-timeline/package.json b/packages/aitube-timeline/package.json index 03cecab8..dfda4062 100644 --- a/packages/aitube-timeline/package.json +++ b/packages/aitube-timeline/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.1.2-1", + "version": "0.1.2-2", "description": "React component to display an OpenClap timeline", "scripts": { "build": "NODE_ENV=production bun build ./src/index.tsx --outfile=dist/index.js --external @aitube/clap --external @radix-ui/react-slider --external @react-spring/three --external @react-spring/types --external @react-three/drei --external @react-three/fiber --external @types/react --external @types/react-dom --external react --external react-dom --external tailwindcss --external three --external typescript --external zustand && bun run build:declaration", diff --git a/packages/aitube-timeline/src/ClapTimeline.tsx b/packages/aitube-timeline/src/ClapTimeline.tsx index 00372151..48d9479a 100644 --- a/packages/aitube-timeline/src/ClapTimeline.tsx +++ b/packages/aitube-timeline/src/ClapTimeline.tsx @@ -1,11 +1,10 @@ import AutoSizer, { Size } from "react-virtualized-auto-sizer" -import { Canvas, useFrame, useThree } from "@react-three/fiber" +import { Canvas } from "@react-three/fiber" import { Stats } from "@react-three/drei" import { TimelineControls, HorizontalScroller, - VerticalScroller, Timeline } from "@/components" import { ClapProject, isValidNumber } from "@aitube/clap" @@ -21,7 +20,6 @@ import { cn } from "./utils" import { TimelineCamera } from "./components/camera" import { useTimeline } from "./hooks" import { topBarTimeScaleHeight } from "./constants/themes" -import { useRef } from "react" export function ClapTimeline({ clap, @@ -58,9 +56,9 @@ export function ClapTimeline({ showFPS: DEFAULT_SHOW_FPS, // frameloop: DEFAULT_FRAMELOOP }) { - const ref = useRef(null) - const theme = useTimeline(s => s.theme) + const canvas = useTimeline(s => s.canvas) + const setCanvas = useTimeline(s => s.setCanvas) const handleIsCreated = () => { useTimeline.setState({ isReady: true }) @@ -81,7 +79,9 @@ export function ClapTimeline({

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 ^bsL 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%0D&^ndu>?^=euS!?#M<(& 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 literal 175097 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 z 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 diff --git a/packages/broadway/src/analysis/analyzeScreenplay.ts b/packages/broadway/src/analysis/analyzeScreenplay.ts index 5ed0006d..550d06be 100644 --- a/packages/broadway/src/analysis/analyzeScreenplay.ts +++ b/packages/broadway/src/analysis/analyzeScreenplay.ts @@ -1,4 +1,4 @@ -import { ClapEntity, ClapOutputType, ClapSegment, ClapSegmentCategory, newEntity, UUID } from "@aitube/clap" +import { ClapEntity, ClapOutputType, ClapScene, ClapSegment, ClapSegmentCategory, newEntity, UUID } from "@aitube/clap" import { Screenplay, TemporaryAssetData } from "@/types" import { pick } from "@/utils" @@ -31,6 +31,9 @@ export async function analyzeScreenplay( segments: ClapSegment[] entitiesByScreenplayLabel: Record entitiesById: Record + finalPlainText: string + totalDurationInMs: number + scenes: ClapScene[] }> { /** * List of all segments identified inside the screenplay @@ -71,6 +74,7 @@ export async function analyzeScreenplay( const extraPositivePrompt = movieGenreLabel ? [movieGenreLabel]: [] + /* console.log("movie:", { movieEras, @@ -102,8 +106,22 @@ export async function analyzeScreenplay( const sizeOfProgressChunk = Math.floor(screenplay.sequences.length / 3) + let finalPlainText = "" + let nbTotalLinesInFinalPlainText = 0 + let totalDurationInMs = 0 + for (const sequence of screenplay.sequences) { + // we prepend any missing text + const nbMissingLines = sequence.startAtLine - nbTotalLinesInFinalPlainText + for (let i = 0; i < nbMissingLines; i++) { + finalPlainText += "\n" + nbTotalLinesInFinalPlainText += 1 + } + + finalPlainText += sequence.fullText + nbTotalLinesInFinalPlainText += sequence.fullText.split("\n").length + if ((++nbProcessedSequences % sizeOfProgressChunk) === 0) { await onProgress?.(progress += 20, `Analyzing sequences (${nbProcessedSequences}/${screenplay.sequences.length} completed)`) } @@ -155,7 +173,7 @@ export async function analyzeScreenplay( content: uppercaseAssetName, // url to the resource, or content string occurrences: 1 + existingOccurrences, sequences: existingAssetSequences.concat( - existingAssetSequences.find(s => s.fullText === sequence.fullText) + existingAssetSequences.find(s => s.id === sequence.id) ? [] : sequence // only add the sequence if it's not already there ), @@ -221,10 +239,19 @@ export async function analyzeScreenplay( const transitionSegment: ClapSegment = { ...createSegment({ + + // full fade to black startTimeInSteps, + + // alternatively, we can also create cross-over transitions, like this: + // startTimeInSteps: Math.round(startTimeInSteps - (durationInSteps / 2)), + durationInSteps, + + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, - // we automatically eliminate empty prompt arrays, // so we must put something in here prompt: [transition], @@ -232,17 +259,16 @@ export async function analyzeScreenplay( categoryName: ClapSegmentCategory.TRANSITION, outputType: ClapOutputType.TEXT, }), - track: 7, - // one more thing, but which is pretty critical: - // we link each segment to their parent screenplay scene - // note that this is optional, as we can have segments that - // are transitionnary between scene (or we might not have a "scene" at all, or no screenplay) - sceneId: scene.id, + // watch-out: this 7 is a bit arbitrary, we should instead + // assign it to another track eg. the camera one + // or track 0 maybe + track: 7, } segments.push(transitionSegment) + // only relevant in case of a fade to black startTimeInSteps += durationInSteps // 2 steps // a transition isn't really a scene shot, so we just ignore the rest @@ -294,7 +320,9 @@ export async function analyzeScreenplay( segmentCandidates.push(createSegment({ startTimeInSteps, - + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, // we automatically eliminate empty prompt arrays, // so we must put something in here prompt: ["movie"], @@ -305,6 +333,9 @@ export async function analyzeScreenplay( segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ // "photo" "movie still", // so it isn't empty @@ -315,6 +346,9 @@ export async function analyzeScreenplay( segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ ...sequenceGenre.prompts.style, "cinematic photo", @@ -336,6 +370,9 @@ export async function analyzeScreenplay( if (currentLocationName) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [currentLocationName], categoryName: ClapSegmentCategory.LOCATION, })) @@ -367,6 +404,9 @@ export async function analyzeScreenplay( if (locationTypeAsPrompt) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [locationTypeAsPrompt], categoryName: ClapSegmentCategory.LOCATION, })) @@ -390,6 +430,9 @@ export async function analyzeScreenplay( if (currentTime || currentLighting) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ currentTime, currentLighting, @@ -405,6 +448,9 @@ export async function analyzeScreenplay( if (currentWeather) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ currentWeather, ...sequenceGenre.prompts.weather, @@ -455,6 +501,9 @@ export async function analyzeScreenplay( if (currentShotType) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ currentShotType, ...sequenceGenre.prompts.camera, @@ -483,7 +532,7 @@ export async function analyzeScreenplay( content: characterName, // url to the resource, or content string occurrences: 1 + existingOccurrences, sequences: existingAssetSequences.concat( - existingAssetSequences.find(s => s.fullText === sequence.fullText) + existingAssetSequences.find(s => s.id === sequence.id) ? [] : sequence // only add the sequence if it's not already there ), @@ -511,6 +560,9 @@ export async function analyzeScreenplay( age, gender, region: "american", + + // TODO put things like "blond hair, wearing a suit" etc + // appearance: "", }) // console.log("newEnt:", newMod) entitiesByScreenplayLabel[characterName] = entitiesById[newEnt.id] = newEnt @@ -538,6 +590,9 @@ export async function analyzeScreenplay( if (event.behavior) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [event.behavior], label: `${currentSliceEntities[0]?.label}: ${event.behavior}`, categoryName: ClapSegmentCategory.ACTION, @@ -555,6 +610,9 @@ export async function analyzeScreenplay( // console.log("found a dialogue! currentSliceEntities:", currentSliceEntities) segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [dialogueLine], // it is easier to understand in the UI when we can see the speaker's name @@ -571,6 +629,9 @@ export async function analyzeScreenplay( if (currentAction && !isVoiceOver(currentAction)) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [currentAction], label: event.character @@ -588,6 +649,9 @@ export async function analyzeScreenplay( // as it is more encompassing segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ // note: here we use the *GENRE* parser, and on the FULL MOVIE //...sequenceGenre.prompts.era, @@ -619,6 +683,9 @@ export async function analyzeScreenplay( if (currentSound) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ currentSound, // note: here we use the *GENRE* parser, and on the FULL MOVIE @@ -636,6 +703,9 @@ export async function analyzeScreenplay( if (currentMusic) { segmentCandidates.push(createSegment({ startTimeInSteps, + startTimeInLines: event.startAtLine, + endTimeInLines: event.endAtLine, + sceneId: scene.id, prompt: [ currentMusic, // note: here we use the *GENRE* parser, and on the FULL MOVIE @@ -658,23 +728,11 @@ export async function analyzeScreenplay( track: track++ } - // one more thing, but which is pretty critical: - // we link each segment to their parent screenplay scene - // note that this is optional, as we can have segments that - // are transitionnary between scene (or we might not have a "scene" at all, or no screenplay) - segmentToSave.sceneId = scene.id - // segmentToSave.sceneId = scene.id - + if (segmentToSave.endTimeInMs > totalDurationInMs) { + totalDurationInMs = segmentToSave.endTimeInMs + } + segments.push(segmentToSave) - /* - segmentsByStartTime[segmentToSave.startTimeInSteps] = (segmentsByStartTime[segmentToSave.startTimeInSteps] || []).concat( - segmentToSave - ) - - segmentsByEndTime[segmentToSave.endTimeInSteps] = (segmentsByEndTime[segmentToSave.endTimeInSteps] || []).concat( - segmentToSave - ) - */ } startTimeInSteps += DEFAULT_COLUMNS_PER_SLICE @@ -743,11 +801,20 @@ export async function analyzeScreenplay( // } + let scenes: ClapScene[] = [] + + for (const sequence of screenplay.sequences) { + scenes = scenes.concat(sequence.scenes) + } + return { movieGenreLabel, extraPositivePrompt, segments, entitiesByScreenplayLabel, - entitiesById + entitiesById, + finalPlainText, + totalDurationInMs, + scenes } } \ No newline at end of file diff --git a/packages/broadway/src/analysis/parseScriptToClap.ts b/packages/broadway/src/analysis/parseScriptToClap.ts index 96be4687..0d9b41ac 100644 --- a/packages/broadway/src/analysis/parseScriptToClap.ts +++ b/packages/broadway/src/analysis/parseScriptToClap.ts @@ -31,7 +31,15 @@ export async function parseScriptToClap( await onProgressUpdate({ value: 20 }) - const { movieGenreLabel, extraPositivePrompt, segments, entitiesById, entitiesByScreenplayLabel } = await analyzeScreenplay( + const { + movieGenreLabel, + extraPositivePrompt, + segments, + entitiesById, + finalPlainText, + totalDurationInMs, + scenes + } = await analyzeScreenplay( screenplay, async (progress, message) => { // progress is a value between 0 and 100 @@ -47,18 +55,7 @@ export async function parseScriptToClap( await onProgressUpdate({ value: 60 }) - let durationInMs = 0 - segments.forEach(s => { - if (s.endTimeInMs > durationInMs) { - durationInMs = s.endTimeInMs - } - }) - let scenes: Scene[] = [] - screenplay.sequences.forEach(sequence => { - scenes = [...scenes, ...sequence.scenes] - }) - // TODO: return a ClapProject instead const clap = newClap({ meta: { @@ -66,20 +63,28 @@ export async function parseScriptToClap( title: "Untitled", description: `${movieGenreLabel}`, synopsis: "", - licence: "All rights reserved by the IP holder", + licence: "This OpenClap file is just a conversion from the original screenplay and doesn't claim any copyright or intellectual property. All rights reserved to the original intellectual property and copyright holders. Using OpenClap isn't piracy.", orientation: ClapMediaOrientation.LANDSCAPE, - durationInMs: segments.filter(s => s.endTimeInMs), + durationInMs: totalDurationInMs, width: 1024, height: 576, - defaultVideoModel: "", + defaultVideoModel: "", // <-- we should deprecate this no? extraPositivePrompt: extraPositivePrompt, - screenplay, + screenplay: finalPlainText, isLoop: false, isInteractive: false, }, - scenes, + scenes: scenes.map(scene => ({ + ...scene, + // let's deprecate this field, this was a bad idea + // (too much redundancy) + sequenceFullText: "", + + // let's also deprecate this + events: [], + })), entities: Object.values(entitiesById), segments, }) diff --git a/packages/broadway/src/factories/createSegment.ts b/packages/broadway/src/factories/createSegment.ts index 194c4ddc..f6502283 100644 --- a/packages/broadway/src/factories/createSegment.ts +++ b/packages/broadway/src/factories/createSegment.ts @@ -8,6 +8,9 @@ import { generateSeed, parseOutputType, ClapOutputType, ClapSegmentCategory, Cla export function createSegment({ startTimeInSteps, + startTimeInLines, + endTimeInLines, + sceneId, prompt = [], label = "", durationInSteps = 4, @@ -16,9 +19,11 @@ export function createSegment({ categoryName = ClapSegmentCategory.GENERIC, entityId = "", seed, - renderedScene, }: { startTimeInSteps: number + startTimeInLines: number + endTimeInLines: number + sceneId: string prompt?: string[] label?: string durationInSteps?: number @@ -27,21 +32,8 @@ export function createSegment({ categoryName?: ClapSegmentCategory entityId?: string seed?: number - renderedScene?: RenderedScene }): ClapSegment { - if (!renderedScene) { - renderedScene = { - renderId: "", - status: "to_generate", - assetUrl: "", - durationInMs: 0, - alt: "", - error: "", - maskUrl: "", - segments: [], - } - } // steps: 1|2|3|4 // duration: 4 // so if we begin at 1, the end step is 4 @@ -87,11 +79,9 @@ export function createSegment({ startTimeInMs, endTimeInMs, - // durationInMs, - - // startTimeInSteps, - // endTimeInSteps, - // durationInSteps, + startTimeInLines, + endTimeInLines, + sceneId, prompt: promptString, track, // track row index diff --git a/packages/broadway/src/tests/main.test.ts b/packages/broadway/src/tests/main.test.ts index aa960ae5..8525bb97 100644 --- a/packages/broadway/src/tests/main.test.ts +++ b/packages/broadway/src/tests/main.test.ts @@ -36,14 +36,9 @@ describe("main demo", async () => { 30000) - /* test("julianDemo", async () => { - const inputScriptFilePath = `/Users/jbilcke/Documents/scripts/Raiders of the Lost Ark.txt` - const outputScriptFilePath = `/Users/jbilcke/Documents/clap_playground/Raiders of the Lost Ark.clap` - - // const inputScriptFilePath = `/Users/jbilcke/Documents/scripts/1917.txt` - // const outputScriptFilePath = `/Users/jbilcke/Documents/clap_playground/1917.clap` - + const inputScriptFilePath = `/Users/jbilcke/Documents/Clapper/scripts/The Office (US Pilot).txt` + const outputScriptFilePath = `/Users/jbilcke/Documents/Clapper/claps/The Office (US Pilot).clap` const script = await readPlainText(inputScriptFilePath) const clap: ClapProject = await parseScriptToClap(script) @@ -51,5 +46,4 @@ describe("main demo", async () => { await Bun.write(outputScriptFilePath, blob) }, 30000) - */ }) \ No newline at end of file From ffba2c82c0a7bd7320a9a2800ea7cdd9014f09a8 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 17:36:41 +0200 Subject: [PATCH 164/346] let's put back the test as it was before --- packages/broadway/src/tests/main.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/broadway/src/tests/main.test.ts b/packages/broadway/src/tests/main.test.ts index 8525bb97..a3dfe609 100644 --- a/packages/broadway/src/tests/main.test.ts +++ b/packages/broadway/src/tests/main.test.ts @@ -35,7 +35,7 @@ describe("main demo", async () => { // because this was too much platform-specific (file system caching, so for Node only) 30000) - + /* test("julianDemo", async () => { const inputScriptFilePath = `/Users/jbilcke/Documents/Clapper/scripts/The Office (US Pilot).txt` const outputScriptFilePath = `/Users/jbilcke/Documents/Clapper/claps/The Office (US Pilot).clap` @@ -46,4 +46,5 @@ describe("main demo", async () => { await Bun.write(outputScriptFilePath, blob) }, 30000) + */ }) \ No newline at end of file From 95d704ef01196639a5743847ec0f47c33dccea87 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sat, 22 Jun 2024 17:46:07 +0200 Subject: [PATCH 165/346] 0.0.25 --- packages/aitube-engine/bun.lockb | Bin 17236 -> 17622 bytes packages/aitube-engine/package.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aitube-engine/bun.lockb b/packages/aitube-engine/bun.lockb index 7ce1cc94e21e40bd63331548fde41b82f5a563ac..ea1e5ccffa4d74d4f3eb9e2a461976235c553f5f 100755 GIT binary patch delta 3540 zcmeHJdr*|u760zHySU%N29Vc&yDrQ7A@0I1`v3(N2{p!@O`)c)>zjyH5F!>b(NSTW zTB98W%yBY;@rgC5V z{LVf1+;e{SHR5do%Ar=rvppHka2;z30<028?MEwNn z5e!6r%?gf-LcJWd7Im#swilz;AdXYXT7x(O@jk=}sJEfUeOm(OaDozO3zGv3pr(cY zEl@B(AYLse6pAy1iBUo>%#Pwt2Ui@xN3 z8-FOzZK$a}tX0A*tLp3UPp%6FnOnU-qVLh;CqJ?GB=Kt*Q$eyO2QDaPLYgKE+7)VM z2EWqH+Mok}Pr((XTi}tmXE7dw-C-_%1`m2w3EK&Nm79GF9V$2PQovO-wSpMt7A_#0 z6VY1@yHzf>1v=1n1&Jy`TNqTST!IPtBcvk4&sM>#F(twgG|oVyf;JIikjWA`2yR&! z26}ag>NPZ$!CciOb_+VxZa!@cTve9{^Tx>G#=xN3C3FUnyj35fQfaH*N|%s^d{a~b z29+-UIW_1tC2Sw~HE!VsPED1zuhO`LGNg|jl@yW%Kn!;aU!l#0HlFGdL_Fsp!gM`| zrpR-Mb|5N~Vqq!lGw?^a`K)m0j3|j-fJZY4r|`?veqernPn zP3y+WP|_4nhk}R68BoZ7910E6WH%AOfx0&Ihvb-qh!!MER$0@6w4gmbXeUkftRNmu zQ)1(T^Q0B9Ju<;d(Q|{=(KM~HqL3dRlQc*Z&PSnn2MP@b+>K2AKY{;A=>JBbKf0;Z z@j-pjlLv|_XSA+6J@)eF>&kko)33ZYGU2-GhwViRpI!6u5&NOm?#`{9vtyzUE*NZn zyRv_ved3q<=N`NFZR`4~RiGW)P-;-5SIlc`A93lu?@Sl@JuwF_eAA!&LVZrk&AnyL zyQcn0j}q-)Ew*@jt@RD%H(UIs4-Ubr?9OcE(AJ~piyrqJ8JomPo0NYOzVtr+Fsi$* zdsXq`4_8g!^6*{LiM6XoKFRA@`o-|NrMJ4?KK%IBx%nUW6;*UC4PSVqB7Nf12Db z5B`W~jnTu>;WVNZiCQoxdc2wPH!uAvUtgNjSGVbMZ}sY32b7sRSHI-cS8QxLbNu_Y zYrN$R`(KVpm_Gm5`Wx>a(hm2`5aw)bE~(PoHl?&(yyq;O{Mqj^z-U6A5&DlGmFa4E(x2GZ)q*>7Y2t!^}M!lFsw6KoN`2lrrigypHjn z4O~V|ZzfoiD`*0arK;6Byk>*OYBKf|q#aj7Alj-au*k`MY5|40sO8aPd61E)q5C0p zEfS{NiT)L0P-u>BAi`viLm}IQpvE_j+5^dEMom8WsBwuXv?dRQ{OM{HQP4l*pO+NA zQ=DElN*5M6s)IM%B^b11LX;)8g|03;3QbTr3QyM@g`^1hh|$YW#85{dU98!tsibI> zU`HU8L8nBi)2$zif*lieNgNSG>C@$$fnr3Vi#wSrp({TLh4`TQsa|>xs73=Ex5SJk zL=T3PAF4}vFl0_?q1}j3ib!NoeMAr~q)aJus)ni{BB>(6p=z){lioMth$^ACiL#{x zs4A*}>|~>ADM6}?FeW-*DvwH`0JNA+Ae1ZNBowNS%1%YWa=8=~DxFT9-X@}wG|@xU zsfl|WwNCgvH-n;u7!I_nu3xXy|EfERh z4Ua59HygU)VGKZSzUU0K)6eAg?h((Nh?Vw{G8iQ{hrCiQ-Vti~XR+7*G-Y^aLoh`Q z9qQHnC!IeTn)cvpoWXOYvbMq5d?`0%kDnmCV%PC50rYkoI|^RAmu-e^cF_=O%Dc{P zUAeRNVhzul3oLjhdE8z&Zx7&8{Bhd#V%Z0^|M9h+Qwzi zn-~9lS-rWsrm+dexxTkHRE;*3Yt9{g!fb^@lTv#U3epAU=qa8&hOxq)AC*P2e*hw5 Bxbgr1 delta 3371 zcmeHJeNa@_6@T~buIyWQd?>KHEDH;WpvL`Tmj$J}#u`7elCce8)v8UZMle_yHBn=g z)yA)}jvpsxs$&e38PZ@deo$kzNsZ97F(b9s)L^1S+UY1n6U{hQ?P&TtZ+BDv$V{jI z_YQ}%zjN+A_nhCm@4S0qv-o&}*zOz|{L?FR_xTx%8g-Mc%lrF6?_5f91$J~dCFi{| zWv+eghTl(+v@vE!BwxPw$c`1I%_%~Xk|im+xc;a0P0uV{S_`ZI>*9KZEJ-_FPa2Hd7^fL*!(PMIxM2 zGyZX|9y%w?qLTVWsKYJ4BxqTxkFM#alTRt77M)R;sa_uvE2$0t4^zKBBwrV_$Pg5M zYBPkyX6iSD=RX{`NFwoIBGBA>F z>1lsbP$ z2`Fxm_Mfd9fX2gzt@Huq1Q176=$1Yp-%X-Lrl6>zHd9D>5nN7zOGk%I0i_3sC+az* z$fo+_kg^)AdSR2b`VM}JxV}E1Nt%z554__T#!3+{P+Lk!{+)>iQi2(G;2H-Pj-JG# z(lfdejqt~)UJZ#Y)TV~yGs!fd1~d3cRbn#cX~U*Xb|foQpBfTNs4ex$X7I!hR>Ilk zL#mCznm56r);7bL&<1OspAmza28VojB|Jna2g2)Y5FV`Ap2q-VkZ#r{=EKMf91tE3 z2rnptuzfg$2Wz&MFu?dO&54cFyfMx5AAxY3F>yO<#!hK+%;JnY25S!FhVVpB+|QaZ zo}y?gGuRgvBswvqb1ki%P0BEV5{(H9|A2D!m6} zCM73A#vGLv=Y)lojsyJ$$ZiV@8`aw)RA*DE8^})9+z456Ra%`J7Ws4<=tH0}_OK|R zmG%g&u&Z<#sE9`9MW{4SrLB2kQA`(sdh*n1w%Y^diR~V-<>01qqnlpP9~AAkq>mq8 z7f6}eIDF1FsyMc<>}1NG{kNx9F21|-?*mJJ;__W+eXRQWsk7p58!IyLDhTOe+C%6P z+MFMuP5GcHKP*O4r2{lM)M>r*E^U#&?pizFy>)ia)Gzl$7ASZAdc2FOCpEU6*1?04{Jl{lK#)o~UbA_nsTH#c1kB&}$C0qq?9=M$^+P z^UycZ5u=OAGkl)$ZT#f#8}${;KT`aG(KJ5(!e1G)(^=K5oz92f#0G;A5Pq8zeT^}< z3qGwwA?)K;!kF!u5VnnuYkY>J?D%hPF+7L+sU5;=To9hmz0tzE@Pb53NutBfVW#x> z+tTBtURNRMU6w5FEoBh)a0HI%CXdV9%sI4|zW!ys9ZR0uP` zxpC_(hU7wuAPxxkVQ#%#E7!)gaIfb4xrcKNq@? z%_TDx90pHBN`i0^Ts>34zwv$KI}(4Pw9gN3!6osQoHnPTLbw#RvyIEk=7~8p@-xDi?x$Y&2n+9pJfqtUpMTzv zv;I)Ja68>jZ-5-0n`ZDIU7tR?q2VR5R~B@FFv=)ObF2e%WzP&^~ zb^iMB7aP-OYMXLo$&LpF?xP;ltuIDR%GAq3fdyI(oazVoTh1XNkR^P5S3+O_<@2k>H`eGApi8|0=WE5_e;J zVPDbvO5t(LDv!-7CYR4zp11;^o3a1TQ*Xca4_T}M-%g(-B` w~^N%Z=9fEV4#O z?sudS-=IB-&iE|3iOci#`Lmw7T=o7$WKik!^23M)NL-qyuW5Mq(&3JF_yaKxx{c)X zdqoW`^jF(rcV{VT>W|n%Ex)*rX=Sl#9y;r{`V$xG9j;khM;!fLB?|H4(R!T~i7U3! zSoMd2AME)pJbtIQ95s$5d$|>t?m&5&sl~4yQR#|*r!$i_mAmPk@(Jej@|gAA2{CP| zdcGp)@X$@Sg-QaAI-k=|y93LFhf*s_X Date: Sat, 22 Jun 2024 17:47:44 +0200 Subject: [PATCH 166/346] 0.0.37 --- packages/aitube-client/bun.lockb | Bin 18708 -> 19102 bytes packages/aitube-client/package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-client/bun.lockb b/packages/aitube-client/bun.lockb index 7714e9af2c4af6061fc26e64103fd0422ffe1c26..c77b2f5bca072a0e4e6322145b7eaecbdbeb824a 100755 GIT binary patch delta 3627 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 diff --git a/packages/aitube-client/package.json b/packages/aitube-client/package.json index 10d48e5e..2ff540be 100644 --- a/packages/aitube-client/package.json +++ b/packages/aitube-client/package.json @@ -4,7 +4,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.36", + "version": "0.0.37", "description": "Official API client for AiTube.at", "scripts": { "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", @@ -16,10 +16,10 @@ "bun-types": "latest", "prettier": "^3.3.2", "rimraf": "^5.0.7", - "typescript": "^5.4.5" + "typescript": "^5.5.2" }, "peerDependencies": { - "@aitube/clap": "0.0.27" + "@aitube/clap": "0.0.29" }, "repository": { "type": "git", From 10e242f72902c406dc3a532c44585560eeb76e45 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Sun, 23 Jun 2024 12:13:45 +0200 Subject: [PATCH 167/346] 0.0.18 --- packages/broadway/package-lock.json | 812 ++++++++++++++++++ packages/broadway/package.json | 6 +- ...ow v10 X Rewrite Bryan E. Harris 2023.clap | Bin 168312 -> 169691 bytes .../src/analysis/analyzeScreenplay.ts | 113 ++- packages/broadway/src/analysis/findSubtext.ts | 82 ++ .../src/analysis/getScreenplayFromText.ts | 6 +- .../src/analysis/loadAgeAndGenderDataset.ts | 87 +- packages/broadway/src/analysis/parseScenes.ts | 4 +- packages/broadway/src/tests/main.test.ts | 7 +- .../src/tests/{bun-shims.js => setup.js} | 9 +- 10 files changed, 1027 insertions(+), 99 deletions(-) create mode 100644 packages/broadway/package-lock.json create mode 100644 packages/broadway/src/analysis/findSubtext.ts rename packages/broadway/src/tests/{bun-shims.js => setup.js} (88%) diff --git a/packages/broadway/package-lock.json b/packages/broadway/package-lock.json new file mode 100644 index 00000000..620bfb02 --- /dev/null +++ b/packages/broadway/package-lock.json @@ -0,0 +1,812 @@ +{ + "name": "@aitube/broadway", + "version": "0.0.18", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@aitube/broadway", + "version": "0.0.18", + "license": "MIT", + "dependencies": { + "@datagica/parse-entities": "^0.3.0", + "@datagica/parse-names": "^0.0.8", + "indexeddb-fs": "^2.1.5" + }, + "devDependencies": { + "@aitube/io": "0.0.1", + "bun-types": "latest", + "prettier": "^3.3.2", + "rimraf": "^5.0.7", + "typescript": "^5.5.2" + }, + "peerDependencies": { + "@aitube/clap": "0.0.29", + "@aitube/colors": "0.0.8" + } + }, + "node_modules/@aitube/clap": { + "version": "0.0.29", + "license": "MIT", + "peer": true, + "dependencies": { + "pure-uuid": "^1.8.1" + }, + "peerDependencies": { + "yaml": "^2.4.5" + } + }, + "node_modules/@aitube/colors": { + "version": "0.0.8", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@aitube/clap": "0.0.29" + } + }, + "node_modules/@aitube/io": { + "version": "0.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^2.1.35", + "pure-uuid": "^1.8.1", + "sharp": "^0.33.4" + } + }, + "node_modules/@datagica/fast-index": { + "version": "0.1.0", + "license": "GPL-3.0" + }, + "node_modules/@datagica/parse-entities": { + "version": "0.3.0", + "license": "GPL-3.0", + "dependencies": { + "@datagica/treegram": "^0.3.0" + } + }, + "node_modules/@datagica/parse-names": { + "version": "0.0.8", + "license": "GPL-3.0", + "dependencies": { + "@datagica/parse-entities": "^0.2.7" + } + }, + "node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities": { + "version": "0.2.8", + "license": "GPL-3.0", + "dependencies": { + "@datagica/treegram": "^0.2.8" + } + }, + "node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities/node_modules/@datagica/treegram": { + "version": "0.2.9", + "license": "GPL-3.0", + "dependencies": { + "@datagica/fast-index": "^0.0.7", + "@datagica/tokenize": "^0.0.2" + } + }, + "node_modules/@datagica/parse-names/node_modules/@datagica/parse-entities/node_modules/@datagica/treegram/node_modules/@datagica/fast-index": { + "version": "0.0.7", + "license": "GPL-3.0" + }, + "node_modules/@datagica/tokenize": { + "version": "0.0.2", + "license": "GPL-3.0" + }, + "node_modules/@datagica/treegram": { + "version": "0.3.0", + "license": "GPL-3.0", + "dependencies": { + "@datagica/fast-index": "^0.1.0", + "@datagica/tokenize": "^0.0.2" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.4", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.2", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/node": { + "version": "20.12.14", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/bun-types": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.16.tgz", + "integrity": "sha512-LpAh8dQe4NKvhSW390Rkftw0ume0moSkRm575e1JZ1PwI/dXjbXyjpntq+2F0bVW1FV7V6B8EfWx088b+dNurw==", + "dev": true, + "dependencies": { + "@types/node": "~20.12.8", + "@types/ws": "~8.5.10" + } + }, + "node_modules/color": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob": { + "version": "10.4.2", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/indexeddb-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/indexeddb-fs/-/indexeddb-fs-2.1.5.tgz", + "integrity": "sha512-4TDdof4ou+l1P3O9D+U09DAc2VQ/bWzgKBxC3nQ9qqMhNR2Y3p8JDgELzkY3bwLP8JULMTf2UHsjnYpiKExH2w==", + "dependencies": { + "jsonschema": "^1.4.1" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/prettier": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pure-uuid": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.7", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.4", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.4", + "@img/sharp-darwin-x64": "0.33.4", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.4", + "@img/sharp-linux-arm64": "0.33.4", + "@img/sharp-linux-s390x": "0.33.4", + "@img/sharp-linux-x64": "0.33.4", + "@img/sharp-linuxmusl-arm64": "0.33.4", + "@img/sharp-linuxmusl-x64": "0.33.4", + "@img/sharp-wasm32": "0.33.4", + "@img/sharp-win32-ia32": "0.33.4", + "@img/sharp-win32-x64": "0.33.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/yaml": { + "version": "2.4.5", + "license": "ISC", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/packages/broadway/package.json b/packages/broadway/package.json index 184c2fd9..38f1ed93 100644 --- a/packages/broadway/package.json +++ b/packages/broadway/package.json @@ -4,9 +4,10 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.17", + "version": "0.0.18", "description": "Convert a script to a clap file", "scripts": { + "test": "bun test --preload ./src/tests/setup.js", "build": "bun build ./src/index.ts --outfile=dist/index.js --external=@aitube/clap --external=@aitube/colors && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", @@ -43,6 +44,7 @@ ], "dependencies": { "@datagica/parse-entities": "^0.3.0", - "@datagica/parse-names": "^0.0.8" + "@datagica/parse-names": "^0.0.8", + "indexeddb-fs": "^2.1.5" } } diff --git a/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap b/packages/broadway/samples/claps/Afterglow v10 X Rewrite Bryan E. Harris 2023.clap index 98be523dfe7bbef0b9d02115994a301130890d85..a9be30628c9ad3da20627a687aee1b06c28b5d41 100644 GIT binary patch literal 169691 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᭙(bJ9wichX3EMj*&t+jz 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 E0Jeu)EC2ui literal 152670 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�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�E3!%sFHQRV-jjrgk&mNsCx+RG1aZ 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 From 6132e6a4fa41adf0401d288af8d05af7e578436f Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 28 May 2024 13:29:42 +0200 Subject: [PATCH 087/346] 0.0.13 --- packages/aitube-engine/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aitube-engine/package.json b/packages/aitube-engine/package.json index a4f9e364..46e6abb2 100644 --- a/packages/aitube-engine/package.json +++ b/packages/aitube-engine/package.json @@ -4,12 +4,12 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", - "version": "0.0.12", + "version": "0.0.13", "description": "The engine powering AiTube.at", "scripts": { - "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration", + "build": "bun build --target=node ./src/index.ts --outfile=dist/index.js --external=@aitube/clap && bun run build:declaration", "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json", - "postbuild": "rimraf tsconfig.types.tsbuildinfo", + "postbuild": "rimraf tsconfig.types.tsbuildinfo && bun run build:declaration", "publish": "npm publish --access public" }, "devDependencies": { From 181bd77c2aae87b2f2e75167245b5d99215510e7 Mon Sep 17 00:00:00 2001 From: Julian Bilcke Date: Tue, 28 May 2024 13:36:38 +0200 Subject: [PATCH 088/346] initial commit --- packages/aitube-timeline/.gitignore | 177 +++++++++++++ packages/aitube-timeline/.npmignore | 4 + packages/aitube-timeline/.prettierrc.json | 9 + packages/aitube-timeline/LICENSE.md | 21 ++ packages/aitube-timeline/README.md | 19 ++ packages/aitube-timeline/bun.lockb | Bin 0 -> 84885 bytes packages/aitube-timeline/index.html | 11 + packages/aitube-timeline/package.json | 60 +++++ packages/aitube-timeline/src/ClapTimeline.tsx | 36 +++ .../components/controls/TimelineControls.tsx | 42 +++ .../src/components/controls/index.ts | 1 + .../src/components/grid/TimelineGrid.tsx | 242 ++++++++++++++++++ .../src/components/grid/index.ts | 1 + .../aitube-timeline/src/components/index.ts | 3 + .../scroller/HorizontalScroller.tsx | 40 +++ .../components/scroller/VerticalScroller.tsx | 40 +++ .../src/components/scroller/index.ts | 2 + .../components/slider/HorizontalSlider.tsx | 24 ++ .../components/slider/TimelineSliderBase.tsx | 39 +++ .../src/components/slider/VerticalSlider.tsx | 24 ++ .../src/components/slider/index.ts | 3 + .../aitube-timeline/src/constants/colors.ts | 1 + .../aitube-timeline/src/constants/grid.ts | 11 + .../aitube-timeline/src/constants/index.ts | 11 + packages/aitube-timeline/src/demo.tsx | 16 ++ packages/aitube-timeline/src/hooks/index.ts | 7 + packages/aitube-timeline/src/hooks/useAxis.ts | 22 ++ .../aitube-timeline/src/hooks/useCellWidth.ts | 6 + .../aitube-timeline/src/hooks/useGridLines.ts | 50 ++++ .../src/hooks/usePreviewTrackHeight.ts | 17 ++ .../src/hooks/useStandardTrackHeight.ts | 6 + .../src/hooks/useTimelineState.ts | 39 +++ .../src/hooks/useVisibleSegments.ts | 235 +++++++++++++++++ packages/aitube-timeline/src/index.tsx | 30 +++ packages/aitube-timeline/src/types/grid.ts | 8 + .../aitube-timeline/src/types/timeline.ts | 26 ++ packages/aitube-timeline/src/utils/cn.ts | 6 + .../src/utils/getSegmentColorHex.ts | 56 ++++ .../src/utils/getTextLength.ts | 114 +++++++++ packages/aitube-timeline/src/utils/index.ts | 11 + .../src/utils/segmentsToCells.ts | 89 +++++++ packages/aitube-timeline/src/utils/similar.ts | 6 + packages/aitube-timeline/src/utils/sleep.ts | 6 + .../src/utils/sliceSegments.ts | 19 ++ packages/aitube-timeline/tailwind.config.js | 33 +++ packages/aitube-timeline/test/test.tsx | 0 packages/aitube-timeline/tsconfig.json | 32 +++ packages/aitube-timeline/tsconfig.types.json | 14 + 48 files changed, 1669 insertions(+) create mode 100644 packages/aitube-timeline/.gitignore create mode 100644 packages/aitube-timeline/.npmignore create mode 100644 packages/aitube-timeline/.prettierrc.json create mode 100644 packages/aitube-timeline/LICENSE.md create mode 100644 packages/aitube-timeline/README.md create mode 100755 packages/aitube-timeline/bun.lockb create mode 100644 packages/aitube-timeline/index.html create mode 100644 packages/aitube-timeline/package.json create mode 100644 packages/aitube-timeline/src/ClapTimeline.tsx create mode 100644 packages/aitube-timeline/src/components/controls/TimelineControls.tsx create mode 100644 packages/aitube-timeline/src/components/controls/index.ts create mode 100644 packages/aitube-timeline/src/components/grid/TimelineGrid.tsx create mode 100644 packages/aitube-timeline/src/components/grid/index.ts create mode 100644 packages/aitube-timeline/src/components/index.ts create mode 100644 packages/aitube-timeline/src/components/scroller/HorizontalScroller.tsx create mode 100644 packages/aitube-timeline/src/components/scroller/VerticalScroller.tsx create mode 100644 packages/aitube-timeline/src/components/scroller/index.ts create mode 100644 packages/aitube-timeline/src/components/slider/HorizontalSlider.tsx create mode 100644 packages/aitube-timeline/src/components/slider/TimelineSliderBase.tsx create mode 100644 packages/aitube-timeline/src/components/slider/VerticalSlider.tsx create mode 100644 packages/aitube-timeline/src/components/slider/index.ts create mode 100644 packages/aitube-timeline/src/constants/colors.ts create mode 100644 packages/aitube-timeline/src/constants/grid.ts create mode 100644 packages/aitube-timeline/src/constants/index.ts create mode 100644 packages/aitube-timeline/src/demo.tsx create mode 100644 packages/aitube-timeline/src/hooks/index.ts create mode 100644 packages/aitube-timeline/src/hooks/useAxis.ts create mode 100644 packages/aitube-timeline/src/hooks/useCellWidth.ts create mode 100644 packages/aitube-timeline/src/hooks/useGridLines.ts create mode 100644 packages/aitube-timeline/src/hooks/usePreviewTrackHeight.ts create mode 100644 packages/aitube-timeline/src/hooks/useStandardTrackHeight.ts create mode 100644 packages/aitube-timeline/src/hooks/useTimelineState.ts create mode 100644 packages/aitube-timeline/src/hooks/useVisibleSegments.ts create mode 100644 packages/aitube-timeline/src/index.tsx create mode 100644 packages/aitube-timeline/src/types/grid.ts create mode 100644 packages/aitube-timeline/src/types/timeline.ts create mode 100644 packages/aitube-timeline/src/utils/cn.ts create mode 100644 packages/aitube-timeline/src/utils/getSegmentColorHex.ts create mode 100644 packages/aitube-timeline/src/utils/getTextLength.ts create mode 100644 packages/aitube-timeline/src/utils/index.ts create mode 100644 packages/aitube-timeline/src/utils/segmentsToCells.ts create mode 100644 packages/aitube-timeline/src/utils/similar.ts create mode 100644 packages/aitube-timeline/src/utils/sleep.ts create mode 100644 packages/aitube-timeline/src/utils/sliceSegments.ts create mode 100644 packages/aitube-timeline/tailwind.config.js create mode 100644 packages/aitube-timeline/test/test.tsx create mode 100644 packages/aitube-timeline/tsconfig.json create mode 100644 packages/aitube-timeline/tsconfig.types.json diff --git a/packages/aitube-timeline/.gitignore b/packages/aitube-timeline/.gitignore new file mode 100644 index 00000000..ea8fe6a7 --- /dev/null +++ b/packages/aitube-timeline/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output +dist +.nuxt + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# TypeScript build information +*.tsbuildinfo \ No newline at end of file diff --git a/packages/aitube-timeline/.npmignore b/packages/aitube-timeline/.npmignore new file mode 100644 index 00000000..78a661ea --- /dev/null +++ b/packages/aitube-timeline/.npmignore @@ -0,0 +1,4 @@ +# Ignore everything +* +# Except the dist directory +!dist/ diff --git a/packages/aitube-timeline/.prettierrc.json b/packages/aitube-timeline/.prettierrc.json new file mode 100644 index 00000000..1dcadb73 --- /dev/null +++ b/packages/aitube-timeline/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "printWidth": 140, + "tabWidth": 2, + "trailingComma": "es5", + "bracketSpacing": true +} diff --git a/packages/aitube-timeline/LICENSE.md b/packages/aitube-timeline/LICENSE.md new file mode 100644 index 00000000..8b21ed7d --- /dev/null +++ b/packages/aitube-timeline/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Julian Bilcke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/aitube-timeline/README.md b/packages/aitube-timeline/README.md new file mode 100644 index 00000000..a938a2bd --- /dev/null +++ b/packages/aitube-timeline/README.md @@ -0,0 +1,19 @@ +# @aitube/react-timeline + +*React component to display a .clap timeline* + +## Introduction + +This is a work in progress project. + +For the moment the component is read-only, and can only display text. + +More instructions will be provided until we can do more with it. + +## Installation + +Install the peer-dependencies: + +```bash +npm i @aitube/clap @aitube/colors @radix-ui/react-slider @react-spring/three @react-spring/types @react-three/drei" @react-three/fiber @types/react @types/react-dom react react-dom tailwindcss three typescript zustand +``` \ No newline at end of file diff --git a/packages/aitube-timeline/bun.lockb b/packages/aitube-timeline/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..115aabef06efeadfc12ef44f3fb7cdf8c123ced0 GIT binary patch literal 84885 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� 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 + + + + Demo + + +